{
  "schemaVersion": 1,
  "sensitiveFieldsExcluded": true,
  "generatedAt": "1970-01-01T00:00:00.000Z",
  "packageName": "@happyvertical/smrt-marketing",
  "packageVersion": "0.51.10",
  "sourceManifestPath": "dist/manifest.json",
  "agentDocPath": "AGENTS.md",
  "sourceHashes": {
    "manifest": "3360441449ef2c49835de6502e598289e9f2043ea8f76bc097256793f658976c",
    "packageJson": "8794a3c2d1331e3ec4bc2a454375298a075952bcab490e9e43d55d09bbb0c906",
    "agents": "3b81365608ec4f1929b51db17194f9c1f74d420b49886277e0f94b42238915d8"
  },
  "exports": [
    ".",
    "./manifest",
    "./manifest.json",
    "./svelte"
  ],
  "dependencies": {
    "@happyvertical/smrt-core": "workspace:*",
    "@happyvertical/smrt-tenancy": "workspace:*",
    "@happyvertical/smrt-ui": "workspace:*",
    "@happyvertical/smrt-commerce": "workspace:*",
    "@happyvertical/smrt-vitest": "workspace:*",
    "@happyvertical/sql": "catalog:",
    "@sveltejs/package": "^2.5.8",
    "@sveltejs/vite-plugin-svelte": "^7.1.2",
    "@testing-library/svelte": "^5.4.2",
    "@types/node": "24.13.2",
    "jsdom": "^26.1.0",
    "svelte": "^5.56.4",
    "svelte-check": "^4.7.1",
    "typescript": "5.9.3",
    "vite": "8.1.4",
    "vitest": "4.1.10"
  },
  "smrtDependencies": [
    "@happyvertical/smrt-commerce",
    "@happyvertical/smrt-core",
    "@happyvertical/smrt-tenancy",
    "@happyvertical/smrt-ui",
    "@happyvertical/smrt-vitest"
  ],
  "sdkDependencies": [
    "@happyvertical/sql"
  ],
  "tags": [
    "budget-pacing",
    "campaigns",
    "cross-package",
    "marketing",
    "multi-tenant",
    "smrt"
  ],
  "risks": [
    "cross-package-refs:1",
    "sensitive-fields-excluded"
  ],
  "objects": [
    {
      "name": "CampaignChannelCollection",
      "qualifiedName": "@happyvertical/smrt-marketing:CampaignChannelCollection",
      "collection": "campaignchannels",
      "tableName": "campaign_channels",
      "packageName": "@happyvertical/smrt-marketing",
      "extends": "SmrtCollection",
      "fields": [],
      "relationships": [],
      "methods": [
        "findByCampaign",
        "findByExecutionRef"
      ],
      "methodSignatures": [
        {
          "name": "findByCampaign",
          "async": true,
          "params": [
            "campaignId: string"
          ],
          "returns": "Promise<CampaignChannel[]>"
        },
        {
          "name": "findByExecutionRef",
          "async": true,
          "params": [
            "channelKind: string",
            "channelRef: string"
          ],
          "returns": "Promise<CampaignChannel[]>"
        }
      ],
      "surfaces": [
        {
          "kind": "api",
          "name": "campaignchannels.findByCampaign",
          "operation": "findByCampaign",
          "objectName": "@happyvertical/smrt-marketing:CampaignChannelCollection",
          "path": "/campaignchannels/findByCampaign",
          "method": "POST"
        },
        {
          "kind": "api",
          "name": "campaignchannels.findByExecutionRef",
          "operation": "findByExecutionRef",
          "objectName": "@happyvertical/smrt-marketing:CampaignChannelCollection",
          "path": "/campaignchannels/findByExecutionRef",
          "method": "POST"
        },
        {
          "kind": "cli",
          "name": "campaignchannelcollection_findByCampaign",
          "operation": "findByCampaign",
          "objectName": "@happyvertical/smrt-marketing:CampaignChannelCollection"
        },
        {
          "kind": "cli",
          "name": "campaignchannelcollection_findByExecutionRef",
          "operation": "findByExecutionRef",
          "objectName": "@happyvertical/smrt-marketing:CampaignChannelCollection"
        },
        {
          "kind": "mcp",
          "name": "campaignchannelcollection_findbycampaign",
          "operation": "findByCampaign",
          "objectName": "@happyvertical/smrt-marketing:CampaignChannelCollection"
        },
        {
          "kind": "mcp",
          "name": "campaignchannelcollection_findbyexecutionref",
          "operation": "findByExecutionRef",
          "objectName": "@happyvertical/smrt-marketing:CampaignChannelCollection"
        }
      ],
      "relationshipFeatures": [
        "uuidColumns"
      ],
      "tags": [],
      "risks": []
    },
    {
      "name": "CampaignCollection",
      "qualifiedName": "@happyvertical/smrt-marketing:CampaignCollection",
      "collection": "campaigns",
      "tableName": "campaigns",
      "packageName": "@happyvertical/smrt-marketing",
      "extends": "SmrtCollection",
      "fields": [],
      "relationships": [],
      "methods": [
        "findByCampaignKey",
        "findByStatus",
        "get",
        "list",
        "listByCustomer",
        "listReportingByCustomer",
        "summarizeByCustomers"
      ],
      "methodSignatures": [
        {
          "name": "findByCampaignKey",
          "async": true,
          "params": [
            "campaignKey: string",
            "tenantId?: string | null"
          ],
          "returns": "Promise<Campaign | null>"
        },
        {
          "name": "findByStatus",
          "async": true,
          "params": [
            "status: CampaignStatus"
          ],
          "returns": "Promise<Campaign[]>"
        },
        {
          "name": "get",
          "async": true,
          "params": [
            "filter: string | SmrtWhereClause<Campaign>",
            "options?: object"
          ],
          "returns": "Promise<Campaign | null>"
        },
        {
          "name": "list",
          "async": true,
          "params": [
            "options?: SmrtListOptions<Campaign>"
          ],
          "returns": "Promise<Campaign[] | Record<string, unknown>[]>"
        },
        {
          "name": "listByCustomer",
          "async": true,
          "params": [
            "tenantId: string | null",
            "customerId: string",
            "options?: ListCampaignsByCustomerOptions"
          ],
          "returns": "Promise<CampaignCustomerPage>"
        },
        {
          "name": "listReportingByCustomer",
          "async": true,
          "params": [
            "tenantId: string | null",
            "customerId: string",
            "options?: ListCampaignReportingByCustomerOptions"
          ],
          "returns": "Promise<CampaignReportingPage>"
        },
        {
          "name": "summarizeByCustomers",
          "async": true,
          "params": [
            "tenantId: string | null",
            "customerIds: string[]"
          ],
          "returns": "Promise<CampaignCustomerSummary[]>"
        }
      ],
      "surfaces": [
        {
          "kind": "api",
          "name": "campaigns.findByCampaignKey",
          "operation": "findByCampaignKey",
          "objectName": "@happyvertical/smrt-marketing:CampaignCollection",
          "path": "/campaigns/findByCampaignKey",
          "method": "POST"
        },
        {
          "kind": "api",
          "name": "campaigns.findByStatus",
          "operation": "findByStatus",
          "objectName": "@happyvertical/smrt-marketing:CampaignCollection",
          "path": "/campaigns/findByStatus",
          "method": "POST"
        },
        {
          "kind": "api",
          "name": "campaigns.listByCustomer",
          "operation": "listByCustomer",
          "objectName": "@happyvertical/smrt-marketing:CampaignCollection",
          "path": "/campaigns/listByCustomer",
          "method": "POST"
        },
        {
          "kind": "api",
          "name": "campaigns.listReportingByCustomer",
          "operation": "listReportingByCustomer",
          "objectName": "@happyvertical/smrt-marketing:CampaignCollection",
          "path": "/campaigns/listReportingByCustomer",
          "method": "POST"
        },
        {
          "kind": "api",
          "name": "campaigns.summarizeByCustomers",
          "operation": "summarizeByCustomers",
          "objectName": "@happyvertical/smrt-marketing:CampaignCollection",
          "path": "/campaigns/summarizeByCustomers",
          "method": "POST"
        },
        {
          "kind": "cli",
          "name": "campaigncollection_findByCampaignKey",
          "operation": "findByCampaignKey",
          "objectName": "@happyvertical/smrt-marketing:CampaignCollection"
        },
        {
          "kind": "cli",
          "name": "campaigncollection_findByStatus",
          "operation": "findByStatus",
          "objectName": "@happyvertical/smrt-marketing:CampaignCollection"
        },
        {
          "kind": "cli",
          "name": "campaigncollection_listByCustomer",
          "operation": "listByCustomer",
          "objectName": "@happyvertical/smrt-marketing:CampaignCollection"
        },
        {
          "kind": "cli",
          "name": "campaigncollection_listReportingByCustomer",
          "operation": "listReportingByCustomer",
          "objectName": "@happyvertical/smrt-marketing:CampaignCollection"
        },
        {
          "kind": "cli",
          "name": "campaigncollection_summarizeByCustomers",
          "operation": "summarizeByCustomers",
          "objectName": "@happyvertical/smrt-marketing:CampaignCollection"
        },
        {
          "kind": "mcp",
          "name": "campaigncollection_findbycampaignkey",
          "operation": "findByCampaignKey",
          "objectName": "@happyvertical/smrt-marketing:CampaignCollection"
        },
        {
          "kind": "mcp",
          "name": "campaigncollection_findbystatus",
          "operation": "findByStatus",
          "objectName": "@happyvertical/smrt-marketing:CampaignCollection"
        },
        {
          "kind": "mcp",
          "name": "campaigncollection_listbycustomer",
          "operation": "listByCustomer",
          "objectName": "@happyvertical/smrt-marketing:CampaignCollection"
        },
        {
          "kind": "mcp",
          "name": "campaigncollection_listreportingbycustomer",
          "operation": "listReportingByCustomer",
          "objectName": "@happyvertical/smrt-marketing:CampaignCollection"
        },
        {
          "kind": "mcp",
          "name": "campaigncollection_summarizebycustomers",
          "operation": "summarizeByCustomers",
          "objectName": "@happyvertical/smrt-marketing:CampaignCollection"
        }
      ],
      "relationshipFeatures": [
        "uuidColumns"
      ],
      "tags": [],
      "risks": []
    },
    {
      "name": "CampaignMetricSnapshotCollection",
      "qualifiedName": "@happyvertical/smrt-marketing:CampaignMetricSnapshotCollection",
      "collection": "campaignmetricsnapshots",
      "tableName": "campaign_metric_snapshots",
      "packageName": "@happyvertical/smrt-marketing",
      "extends": "SmrtCollection",
      "fields": [],
      "relationships": [],
      "methods": [
        "findByCampaign",
        "findByChannel",
        "findByDedupeKey",
        "getOrCreateByDedupeKey"
      ],
      "methodSignatures": [
        {
          "name": "findByCampaign",
          "async": true,
          "params": [
            "campaignId: string"
          ],
          "returns": "Promise<CampaignMetricSnapshot[]>"
        },
        {
          "name": "findByChannel",
          "async": true,
          "params": [
            "campaignChannelId: string"
          ],
          "returns": "Promise<CampaignMetricSnapshot[]>"
        },
        {
          "name": "findByDedupeKey",
          "async": true,
          "params": [
            "dedupeKey: string"
          ],
          "returns": "Promise<CampaignMetricSnapshot | null>"
        },
        {
          "name": "getOrCreateByDedupeKey",
          "async": true,
          "params": [
            "options: CampaignMetricSnapshotOptions"
          ],
          "returns": "Promise<object>"
        }
      ],
      "surfaces": [
        {
          "kind": "api",
          "name": "campaignmetricsnapshots.findByDedupeKey",
          "operation": "findByDedupeKey",
          "objectName": "@happyvertical/smrt-marketing:CampaignMetricSnapshotCollection",
          "path": "/campaignmetricsnapshots/findByDedupeKey",
          "method": "POST"
        },
        {
          "kind": "api",
          "name": "campaignmetricsnapshots.getOrCreateByDedupeKey",
          "operation": "getOrCreateByDedupeKey",
          "objectName": "@happyvertical/smrt-marketing:CampaignMetricSnapshotCollection",
          "path": "/campaignmetricsnapshots/getOrCreateByDedupeKey",
          "method": "POST"
        },
        {
          "kind": "api",
          "name": "campaignmetricsnapshots.findByCampaign",
          "operation": "findByCampaign",
          "objectName": "@happyvertical/smrt-marketing:CampaignMetricSnapshotCollection",
          "path": "/campaignmetricsnapshots/findByCampaign",
          "method": "POST"
        },
        {
          "kind": "api",
          "name": "campaignmetricsnapshots.findByChannel",
          "operation": "findByChannel",
          "objectName": "@happyvertical/smrt-marketing:CampaignMetricSnapshotCollection",
          "path": "/campaignmetricsnapshots/findByChannel",
          "method": "POST"
        },
        {
          "kind": "cli",
          "name": "campaignmetricsnapshotcollection_findByDedupeKey",
          "operation": "findByDedupeKey",
          "objectName": "@happyvertical/smrt-marketing:CampaignMetricSnapshotCollection"
        },
        {
          "kind": "cli",
          "name": "campaignmetricsnapshotcollection_getOrCreateByDedupeKey",
          "operation": "getOrCreateByDedupeKey",
          "objectName": "@happyvertical/smrt-marketing:CampaignMetricSnapshotCollection"
        },
        {
          "kind": "cli",
          "name": "campaignmetricsnapshotcollection_findByCampaign",
          "operation": "findByCampaign",
          "objectName": "@happyvertical/smrt-marketing:CampaignMetricSnapshotCollection"
        },
        {
          "kind": "cli",
          "name": "campaignmetricsnapshotcollection_findByChannel",
          "operation": "findByChannel",
          "objectName": "@happyvertical/smrt-marketing:CampaignMetricSnapshotCollection"
        },
        {
          "kind": "mcp",
          "name": "campaignmetricsnapshotcollection_findbydedupekey",
          "operation": "findByDedupeKey",
          "objectName": "@happyvertical/smrt-marketing:CampaignMetricSnapshotCollection"
        },
        {
          "kind": "mcp",
          "name": "campaignmetricsnapshotcollection_getorcreatebydedupekey",
          "operation": "getOrCreateByDedupeKey",
          "objectName": "@happyvertical/smrt-marketing:CampaignMetricSnapshotCollection"
        },
        {
          "kind": "mcp",
          "name": "campaignmetricsnapshotcollection_findbycampaign",
          "operation": "findByCampaign",
          "objectName": "@happyvertical/smrt-marketing:CampaignMetricSnapshotCollection"
        },
        {
          "kind": "mcp",
          "name": "campaignmetricsnapshotcollection_findbychannel",
          "operation": "findByChannel",
          "objectName": "@happyvertical/smrt-marketing:CampaignMetricSnapshotCollection"
        }
      ],
      "relationshipFeatures": [
        "uuidColumns"
      ],
      "tags": [],
      "risks": []
    },
    {
      "name": "Campaign",
      "qualifiedName": "@happyvertical/smrt-marketing:Campaign",
      "collection": "campaigns",
      "tableName": "campaigns",
      "packageName": "@happyvertical/smrt-marketing",
      "extends": "SmrtObject",
      "fields": [
        {
          "name": "tenantId",
          "type": "text",
          "required": false,
          "columnType": "UUID"
        },
        {
          "name": "customerId",
          "type": "crossPackageRef",
          "required": false,
          "related": "@happyvertical/smrt-commerce:Customer",
          "columnType": "UUID"
        },
        {
          "name": "campaignKey",
          "type": "text",
          "required": true,
          "columnType": "TEXT",
          "default": ""
        },
        {
          "name": "name",
          "type": "text",
          "required": true,
          "columnType": "TEXT",
          "default": ""
        },
        {
          "name": "objective",
          "type": "text",
          "required": false,
          "columnType": "TEXT",
          "default": ""
        },
        {
          "name": "status",
          "type": "text",
          "required": false,
          "columnType": "TEXT",
          "default": "draft"
        },
        {
          "name": "startAt",
          "type": "datetime",
          "required": false,
          "columnType": "TIMESTAMP"
        },
        {
          "name": "endAt",
          "type": "datetime",
          "required": false,
          "columnType": "TIMESTAMP"
        },
        {
          "name": "budgetCents",
          "type": "integer",
          "required": false,
          "columnType": "INTEGER",
          "default": 0
        },
        {
          "name": "currency",
          "type": "text",
          "required": false,
          "columnType": "TEXT",
          "default": "USD"
        },
        {
          "name": "metadata",
          "type": "text",
          "required": false,
          "columnType": "TEXT",
          "default": "{}"
        }
      ],
      "relationships": [
        {
          "name": "customerId",
          "type": "crossPackageRef",
          "required": false,
          "related": "@happyvertical/smrt-commerce:Customer",
          "columnType": "UUID"
        }
      ],
      "methods": [
        "getMetadata",
        "initialize",
        "save",
        "setMetadata",
        "transitionTo"
      ],
      "methodSignatures": [
        {
          "name": "getMetadata",
          "returns": "Record<string, unknown>"
        },
        {
          "name": "initialize",
          "async": true,
          "returns": "Promise<this>"
        },
        {
          "name": "save",
          "async": true,
          "returns": "Promise<this>"
        },
        {
          "name": "setMetadata",
          "params": [
            "metadata: Record<string, unknown>"
          ],
          "returns": "void"
        },
        {
          "name": "transitionTo",
          "params": [
            "next: CampaignStatus"
          ],
          "returns": "this"
        }
      ],
      "tenant": {
        "scoped": true,
        "mode": "optional",
        "field": "tenantId"
      },
      "conflictColumns": [
        "tenant_id",
        "campaign_key"
      ],
      "surfaces": [
        {
          "kind": "api",
          "name": "campaigns.list",
          "operation": "list",
          "objectName": "@happyvertical/smrt-marketing:Campaign",
          "path": "/campaigns",
          "method": "GET"
        },
        {
          "kind": "api",
          "name": "campaigns.get",
          "operation": "get",
          "objectName": "@happyvertical/smrt-marketing:Campaign",
          "path": "/campaigns/[id]",
          "method": "GET"
        },
        {
          "kind": "api",
          "name": "campaigns.create",
          "operation": "create",
          "objectName": "@happyvertical/smrt-marketing:Campaign",
          "path": "/campaigns",
          "method": "POST"
        },
        {
          "kind": "api",
          "name": "campaigns.update",
          "operation": "update",
          "objectName": "@happyvertical/smrt-marketing:Campaign",
          "path": "/campaigns/[id]",
          "method": "PATCH"
        },
        {
          "kind": "cli",
          "name": "campaign_list",
          "operation": "list",
          "objectName": "@happyvertical/smrt-marketing:Campaign"
        },
        {
          "kind": "cli",
          "name": "campaign_get",
          "operation": "get",
          "objectName": "@happyvertical/smrt-marketing:Campaign"
        },
        {
          "kind": "cli",
          "name": "campaign_create",
          "operation": "create",
          "objectName": "@happyvertical/smrt-marketing:Campaign"
        },
        {
          "kind": "cli",
          "name": "campaign_update",
          "operation": "update",
          "objectName": "@happyvertical/smrt-marketing:Campaign"
        },
        {
          "kind": "mcp",
          "name": "campaign_list",
          "operation": "list",
          "objectName": "@happyvertical/smrt-marketing:Campaign"
        },
        {
          "kind": "mcp",
          "name": "campaign_get",
          "operation": "get",
          "objectName": "@happyvertical/smrt-marketing:Campaign"
        },
        {
          "kind": "mcp",
          "name": "campaign_create",
          "operation": "create",
          "objectName": "@happyvertical/smrt-marketing:Campaign"
        },
        {
          "kind": "mcp",
          "name": "campaign_update",
          "operation": "update",
          "objectName": "@happyvertical/smrt-marketing:Campaign"
        }
      ],
      "withheldSurfaces": [
        {
          "kind": "api",
          "operation": "getMetadata",
          "code": "not-included",
          "reason": "not listed in api.include",
          "objectName": "@happyvertical/smrt-marketing:Campaign"
        },
        {
          "kind": "api",
          "operation": "initialize",
          "code": "lifecycle-method",
          "reason": "`initialize` is a framework lifecycle method, not a distinct operation",
          "objectName": "@happyvertical/smrt-marketing:Campaign"
        },
        {
          "kind": "api",
          "operation": "save",
          "code": "lifecycle-method",
          "reason": "`save` is a framework lifecycle method, not a distinct operation",
          "objectName": "@happyvertical/smrt-marketing:Campaign"
        },
        {
          "kind": "api",
          "operation": "setMetadata",
          "code": "not-included",
          "reason": "not listed in api.include",
          "objectName": "@happyvertical/smrt-marketing:Campaign"
        },
        {
          "kind": "api",
          "operation": "transitionTo",
          "code": "not-included",
          "reason": "not listed in api.include",
          "objectName": "@happyvertical/smrt-marketing:Campaign"
        }
      ],
      "relationshipFeatures": [
        "crossPackageRef",
        "uuidColumns"
      ],
      "tags": [],
      "risks": []
    },
    {
      "name": "CampaignChannel",
      "qualifiedName": "@happyvertical/smrt-marketing:CampaignChannel",
      "collection": "campaignchannels",
      "tableName": "campaign_channels",
      "packageName": "@happyvertical/smrt-marketing",
      "extends": "SmrtObject",
      "fields": [
        {
          "name": "tenantId",
          "type": "text",
          "required": false,
          "columnType": "UUID"
        },
        {
          "name": "campaignId",
          "type": "foreignKey",
          "required": true,
          "related": "Campaign",
          "columnType": "UUID"
        },
        {
          "name": "channelKind",
          "type": "text",
          "required": true,
          "columnType": "TEXT",
          "default": ""
        },
        {
          "name": "channelRef",
          "type": "text",
          "required": true,
          "columnType": "TEXT",
          "default": ""
        },
        {
          "name": "allocatedBudgetCents",
          "type": "integer",
          "required": false,
          "columnType": "INTEGER",
          "default": 0
        },
        {
          "name": "startAt",
          "type": "datetime",
          "required": false,
          "columnType": "TIMESTAMP"
        },
        {
          "name": "endAt",
          "type": "datetime",
          "required": false,
          "columnType": "TIMESTAMP"
        },
        {
          "name": "status",
          "type": "text",
          "required": false,
          "columnType": "TEXT",
          "default": "planned"
        }
      ],
      "relationships": [
        {
          "name": "campaignId",
          "type": "foreignKey",
          "required": true,
          "related": "Campaign",
          "columnType": "UUID"
        }
      ],
      "methods": [
        "initialize",
        "save"
      ],
      "methodSignatures": [
        {
          "name": "initialize",
          "async": true,
          "returns": "Promise<this>"
        },
        {
          "name": "save",
          "async": true,
          "returns": "Promise<this>"
        }
      ],
      "tenant": {
        "scoped": true,
        "mode": "optional",
        "field": "tenantId"
      },
      "conflictColumns": [
        "campaign_id",
        "channel_kind",
        "channel_ref"
      ],
      "surfaces": [
        {
          "kind": "api",
          "name": "campaignchannels.list",
          "operation": "list",
          "objectName": "@happyvertical/smrt-marketing:CampaignChannel",
          "path": "/campaignchannels",
          "method": "GET"
        },
        {
          "kind": "api",
          "name": "campaignchannels.get",
          "operation": "get",
          "objectName": "@happyvertical/smrt-marketing:CampaignChannel",
          "path": "/campaignchannels/[id]",
          "method": "GET"
        },
        {
          "kind": "api",
          "name": "campaignchannels.create",
          "operation": "create",
          "objectName": "@happyvertical/smrt-marketing:CampaignChannel",
          "path": "/campaignchannels",
          "method": "POST"
        },
        {
          "kind": "api",
          "name": "campaignchannels.update",
          "operation": "update",
          "objectName": "@happyvertical/smrt-marketing:CampaignChannel",
          "path": "/campaignchannels/[id]",
          "method": "PATCH"
        },
        {
          "kind": "api",
          "name": "campaignchannels.delete",
          "operation": "delete",
          "objectName": "@happyvertical/smrt-marketing:CampaignChannel",
          "path": "/campaignchannels/[id]",
          "method": "DELETE"
        },
        {
          "kind": "cli",
          "name": "campaignchannel_list",
          "operation": "list",
          "objectName": "@happyvertical/smrt-marketing:CampaignChannel"
        },
        {
          "kind": "cli",
          "name": "campaignchannel_get",
          "operation": "get",
          "objectName": "@happyvertical/smrt-marketing:CampaignChannel"
        },
        {
          "kind": "cli",
          "name": "campaignchannel_create",
          "operation": "create",
          "objectName": "@happyvertical/smrt-marketing:CampaignChannel"
        },
        {
          "kind": "cli",
          "name": "campaignchannel_update",
          "operation": "update",
          "objectName": "@happyvertical/smrt-marketing:CampaignChannel"
        },
        {
          "kind": "cli",
          "name": "campaignchannel_delete",
          "operation": "delete",
          "objectName": "@happyvertical/smrt-marketing:CampaignChannel"
        },
        {
          "kind": "mcp",
          "name": "campaignchannel_list",
          "operation": "list",
          "objectName": "@happyvertical/smrt-marketing:CampaignChannel"
        },
        {
          "kind": "mcp",
          "name": "campaignchannel_get",
          "operation": "get",
          "objectName": "@happyvertical/smrt-marketing:CampaignChannel"
        },
        {
          "kind": "mcp",
          "name": "campaignchannel_create",
          "operation": "create",
          "objectName": "@happyvertical/smrt-marketing:CampaignChannel"
        },
        {
          "kind": "mcp",
          "name": "campaignchannel_update",
          "operation": "update",
          "objectName": "@happyvertical/smrt-marketing:CampaignChannel"
        }
      ],
      "withheldSurfaces": [
        {
          "kind": "api",
          "operation": "initialize",
          "code": "lifecycle-method",
          "reason": "`initialize` is a framework lifecycle method, not a distinct operation",
          "objectName": "@happyvertical/smrt-marketing:CampaignChannel"
        },
        {
          "kind": "api",
          "operation": "save",
          "code": "lifecycle-method",
          "reason": "`save` is a framework lifecycle method, not a distinct operation",
          "objectName": "@happyvertical/smrt-marketing:CampaignChannel"
        }
      ],
      "relationshipFeatures": [
        "foreignKey",
        "uuidColumns"
      ],
      "tags": [],
      "risks": []
    },
    {
      "name": "CampaignMetricSnapshot",
      "qualifiedName": "@happyvertical/smrt-marketing:CampaignMetricSnapshot",
      "collection": "campaignmetricsnapshots",
      "tableName": "campaign_metric_snapshots",
      "packageName": "@happyvertical/smrt-marketing",
      "extends": "SmrtObject",
      "fields": [
        {
          "name": "tenantId",
          "type": "text",
          "required": false,
          "columnType": "UUID"
        },
        {
          "name": "campaignId",
          "type": "foreignKey",
          "required": true,
          "related": "Campaign",
          "columnType": "UUID"
        },
        {
          "name": "campaignChannelId",
          "type": "foreignKey",
          "required": false,
          "related": "CampaignChannel",
          "columnType": "UUID"
        },
        {
          "name": "periodStart",
          "type": "datetime",
          "required": true,
          "columnType": "TIMESTAMP"
        },
        {
          "name": "periodEnd",
          "type": "datetime",
          "required": true,
          "columnType": "TIMESTAMP"
        },
        {
          "name": "spendCents",
          "type": "integer",
          "required": false,
          "columnType": "INTEGER",
          "default": 0
        },
        {
          "name": "impressions",
          "type": "integer",
          "required": false,
          "columnType": "INTEGER",
          "default": 0
        },
        {
          "name": "clicks",
          "type": "integer",
          "required": false,
          "columnType": "INTEGER",
          "default": 0
        },
        {
          "name": "conversions",
          "type": "integer",
          "required": false,
          "columnType": "INTEGER",
          "default": 0
        },
        {
          "name": "leads",
          "type": "integer",
          "required": false,
          "columnType": "INTEGER",
          "default": 0
        },
        {
          "name": "revenueCents",
          "type": "integer",
          "required": false,
          "columnType": "INTEGER"
        },
        {
          "name": "source",
          "type": "text",
          "required": true,
          "columnType": "TEXT",
          "default": ""
        },
        {
          "name": "dedupeKey",
          "type": "text",
          "required": true,
          "columnType": "TEXT",
          "default": ""
        }
      ],
      "relationships": [
        {
          "name": "campaignId",
          "type": "foreignKey",
          "required": true,
          "related": "Campaign",
          "columnType": "UUID"
        },
        {
          "name": "campaignChannelId",
          "type": "foreignKey",
          "required": false,
          "related": "CampaignChannel",
          "columnType": "UUID"
        }
      ],
      "methods": [
        "delete",
        "initialize",
        "save"
      ],
      "methodSignatures": [
        {
          "name": "delete",
          "async": true,
          "returns": "Promise<void>"
        },
        {
          "name": "initialize",
          "async": true,
          "returns": "Promise<this>"
        },
        {
          "name": "save",
          "async": true,
          "returns": "Promise<this>"
        }
      ],
      "tenant": {
        "scoped": true,
        "mode": "optional",
        "field": "tenantId"
      },
      "conflictColumns": [
        "dedupe_key"
      ],
      "surfaces": [
        {
          "kind": "api",
          "name": "campaignmetricsnapshots.list",
          "operation": "list",
          "objectName": "@happyvertical/smrt-marketing:CampaignMetricSnapshot",
          "path": "/campaignmetricsnapshots",
          "method": "GET"
        },
        {
          "kind": "api",
          "name": "campaignmetricsnapshots.get",
          "operation": "get",
          "objectName": "@happyvertical/smrt-marketing:CampaignMetricSnapshot",
          "path": "/campaignmetricsnapshots/[id]",
          "method": "GET"
        },
        {
          "kind": "api",
          "name": "campaignmetricsnapshots.create",
          "operation": "create",
          "objectName": "@happyvertical/smrt-marketing:CampaignMetricSnapshot",
          "path": "/campaignmetricsnapshots",
          "method": "POST"
        },
        {
          "kind": "cli",
          "name": "campaignmetricsnapshot_list",
          "operation": "list",
          "objectName": "@happyvertical/smrt-marketing:CampaignMetricSnapshot"
        },
        {
          "kind": "cli",
          "name": "campaignmetricsnapshot_get",
          "operation": "get",
          "objectName": "@happyvertical/smrt-marketing:CampaignMetricSnapshot"
        },
        {
          "kind": "cli",
          "name": "campaignmetricsnapshot_create",
          "operation": "create",
          "objectName": "@happyvertical/smrt-marketing:CampaignMetricSnapshot"
        },
        {
          "kind": "mcp",
          "name": "campaignmetricsnapshot_list",
          "operation": "list",
          "objectName": "@happyvertical/smrt-marketing:CampaignMetricSnapshot"
        },
        {
          "kind": "mcp",
          "name": "campaignmetricsnapshot_get",
          "operation": "get",
          "objectName": "@happyvertical/smrt-marketing:CampaignMetricSnapshot"
        },
        {
          "kind": "mcp",
          "name": "campaignmetricsnapshot_create",
          "operation": "create",
          "objectName": "@happyvertical/smrt-marketing:CampaignMetricSnapshot"
        }
      ],
      "withheldSurfaces": [
        {
          "kind": "api",
          "operation": "initialize",
          "code": "lifecycle-method",
          "reason": "`initialize` is a framework lifecycle method, not a distinct operation",
          "objectName": "@happyvertical/smrt-marketing:CampaignMetricSnapshot"
        },
        {
          "kind": "api",
          "operation": "save",
          "code": "lifecycle-method",
          "reason": "`save` is a framework lifecycle method, not a distinct operation",
          "objectName": "@happyvertical/smrt-marketing:CampaignMetricSnapshot"
        }
      ],
      "relationshipFeatures": [
        "foreignKey",
        "uuidColumns"
      ],
      "tags": [],
      "risks": []
    }
  ],
  "surfaces": [
    {
      "kind": "api",
      "name": "campaignchannels.findByCampaign",
      "operation": "findByCampaign",
      "objectName": "@happyvertical/smrt-marketing:CampaignChannelCollection",
      "path": "/campaignchannels/findByCampaign",
      "method": "POST"
    },
    {
      "kind": "api",
      "name": "campaignchannels.findByExecutionRef",
      "operation": "findByExecutionRef",
      "objectName": "@happyvertical/smrt-marketing:CampaignChannelCollection",
      "path": "/campaignchannels/findByExecutionRef",
      "method": "POST"
    },
    {
      "kind": "cli",
      "name": "campaignchannelcollection_findByCampaign",
      "operation": "findByCampaign",
      "objectName": "@happyvertical/smrt-marketing:CampaignChannelCollection"
    },
    {
      "kind": "cli",
      "name": "campaignchannelcollection_findByExecutionRef",
      "operation": "findByExecutionRef",
      "objectName": "@happyvertical/smrt-marketing:CampaignChannelCollection"
    },
    {
      "kind": "mcp",
      "name": "campaignchannelcollection_findbycampaign",
      "operation": "findByCampaign",
      "objectName": "@happyvertical/smrt-marketing:CampaignChannelCollection"
    },
    {
      "kind": "mcp",
      "name": "campaignchannelcollection_findbyexecutionref",
      "operation": "findByExecutionRef",
      "objectName": "@happyvertical/smrt-marketing:CampaignChannelCollection"
    },
    {
      "kind": "api",
      "name": "campaigns.findByCampaignKey",
      "operation": "findByCampaignKey",
      "objectName": "@happyvertical/smrt-marketing:CampaignCollection",
      "path": "/campaigns/findByCampaignKey",
      "method": "POST"
    },
    {
      "kind": "api",
      "name": "campaigns.findByStatus",
      "operation": "findByStatus",
      "objectName": "@happyvertical/smrt-marketing:CampaignCollection",
      "path": "/campaigns/findByStatus",
      "method": "POST"
    },
    {
      "kind": "api",
      "name": "campaigns.listByCustomer",
      "operation": "listByCustomer",
      "objectName": "@happyvertical/smrt-marketing:CampaignCollection",
      "path": "/campaigns/listByCustomer",
      "method": "POST"
    },
    {
      "kind": "api",
      "name": "campaigns.listReportingByCustomer",
      "operation": "listReportingByCustomer",
      "objectName": "@happyvertical/smrt-marketing:CampaignCollection",
      "path": "/campaigns/listReportingByCustomer",
      "method": "POST"
    },
    {
      "kind": "api",
      "name": "campaigns.summarizeByCustomers",
      "operation": "summarizeByCustomers",
      "objectName": "@happyvertical/smrt-marketing:CampaignCollection",
      "path": "/campaigns/summarizeByCustomers",
      "method": "POST"
    },
    {
      "kind": "cli",
      "name": "campaigncollection_findByCampaignKey",
      "operation": "findByCampaignKey",
      "objectName": "@happyvertical/smrt-marketing:CampaignCollection"
    },
    {
      "kind": "cli",
      "name": "campaigncollection_findByStatus",
      "operation": "findByStatus",
      "objectName": "@happyvertical/smrt-marketing:CampaignCollection"
    },
    {
      "kind": "cli",
      "name": "campaigncollection_listByCustomer",
      "operation": "listByCustomer",
      "objectName": "@happyvertical/smrt-marketing:CampaignCollection"
    },
    {
      "kind": "cli",
      "name": "campaigncollection_listReportingByCustomer",
      "operation": "listReportingByCustomer",
      "objectName": "@happyvertical/smrt-marketing:CampaignCollection"
    },
    {
      "kind": "cli",
      "name": "campaigncollection_summarizeByCustomers",
      "operation": "summarizeByCustomers",
      "objectName": "@happyvertical/smrt-marketing:CampaignCollection"
    },
    {
      "kind": "mcp",
      "name": "campaigncollection_findbycampaignkey",
      "operation": "findByCampaignKey",
      "objectName": "@happyvertical/smrt-marketing:CampaignCollection"
    },
    {
      "kind": "mcp",
      "name": "campaigncollection_findbystatus",
      "operation": "findByStatus",
      "objectName": "@happyvertical/smrt-marketing:CampaignCollection"
    },
    {
      "kind": "mcp",
      "name": "campaigncollection_listbycustomer",
      "operation": "listByCustomer",
      "objectName": "@happyvertical/smrt-marketing:CampaignCollection"
    },
    {
      "kind": "mcp",
      "name": "campaigncollection_listreportingbycustomer",
      "operation": "listReportingByCustomer",
      "objectName": "@happyvertical/smrt-marketing:CampaignCollection"
    },
    {
      "kind": "mcp",
      "name": "campaigncollection_summarizebycustomers",
      "operation": "summarizeByCustomers",
      "objectName": "@happyvertical/smrt-marketing:CampaignCollection"
    },
    {
      "kind": "api",
      "name": "campaignmetricsnapshots.findByDedupeKey",
      "operation": "findByDedupeKey",
      "objectName": "@happyvertical/smrt-marketing:CampaignMetricSnapshotCollection",
      "path": "/campaignmetricsnapshots/findByDedupeKey",
      "method": "POST"
    },
    {
      "kind": "api",
      "name": "campaignmetricsnapshots.getOrCreateByDedupeKey",
      "operation": "getOrCreateByDedupeKey",
      "objectName": "@happyvertical/smrt-marketing:CampaignMetricSnapshotCollection",
      "path": "/campaignmetricsnapshots/getOrCreateByDedupeKey",
      "method": "POST"
    },
    {
      "kind": "api",
      "name": "campaignmetricsnapshots.findByCampaign",
      "operation": "findByCampaign",
      "objectName": "@happyvertical/smrt-marketing:CampaignMetricSnapshotCollection",
      "path": "/campaignmetricsnapshots/findByCampaign",
      "method": "POST"
    },
    {
      "kind": "api",
      "name": "campaignmetricsnapshots.findByChannel",
      "operation": "findByChannel",
      "objectName": "@happyvertical/smrt-marketing:CampaignMetricSnapshotCollection",
      "path": "/campaignmetricsnapshots/findByChannel",
      "method": "POST"
    },
    {
      "kind": "cli",
      "name": "campaignmetricsnapshotcollection_findByDedupeKey",
      "operation": "findByDedupeKey",
      "objectName": "@happyvertical/smrt-marketing:CampaignMetricSnapshotCollection"
    },
    {
      "kind": "cli",
      "name": "campaignmetricsnapshotcollection_getOrCreateByDedupeKey",
      "operation": "getOrCreateByDedupeKey",
      "objectName": "@happyvertical/smrt-marketing:CampaignMetricSnapshotCollection"
    },
    {
      "kind": "cli",
      "name": "campaignmetricsnapshotcollection_findByCampaign",
      "operation": "findByCampaign",
      "objectName": "@happyvertical/smrt-marketing:CampaignMetricSnapshotCollection"
    },
    {
      "kind": "cli",
      "name": "campaignmetricsnapshotcollection_findByChannel",
      "operation": "findByChannel",
      "objectName": "@happyvertical/smrt-marketing:CampaignMetricSnapshotCollection"
    },
    {
      "kind": "mcp",
      "name": "campaignmetricsnapshotcollection_findbydedupekey",
      "operation": "findByDedupeKey",
      "objectName": "@happyvertical/smrt-marketing:CampaignMetricSnapshotCollection"
    },
    {
      "kind": "mcp",
      "name": "campaignmetricsnapshotcollection_getorcreatebydedupekey",
      "operation": "getOrCreateByDedupeKey",
      "objectName": "@happyvertical/smrt-marketing:CampaignMetricSnapshotCollection"
    },
    {
      "kind": "mcp",
      "name": "campaignmetricsnapshotcollection_findbycampaign",
      "operation": "findByCampaign",
      "objectName": "@happyvertical/smrt-marketing:CampaignMetricSnapshotCollection"
    },
    {
      "kind": "mcp",
      "name": "campaignmetricsnapshotcollection_findbychannel",
      "operation": "findByChannel",
      "objectName": "@happyvertical/smrt-marketing:CampaignMetricSnapshotCollection"
    },
    {
      "kind": "api",
      "name": "campaigns.list",
      "operation": "list",
      "objectName": "@happyvertical/smrt-marketing:Campaign",
      "path": "/campaigns",
      "method": "GET"
    },
    {
      "kind": "api",
      "name": "campaigns.get",
      "operation": "get",
      "objectName": "@happyvertical/smrt-marketing:Campaign",
      "path": "/campaigns/[id]",
      "method": "GET"
    },
    {
      "kind": "api",
      "name": "campaigns.create",
      "operation": "create",
      "objectName": "@happyvertical/smrt-marketing:Campaign",
      "path": "/campaigns",
      "method": "POST"
    },
    {
      "kind": "api",
      "name": "campaigns.update",
      "operation": "update",
      "objectName": "@happyvertical/smrt-marketing:Campaign",
      "path": "/campaigns/[id]",
      "method": "PATCH"
    },
    {
      "kind": "cli",
      "name": "campaign_list",
      "operation": "list",
      "objectName": "@happyvertical/smrt-marketing:Campaign"
    },
    {
      "kind": "cli",
      "name": "campaign_get",
      "operation": "get",
      "objectName": "@happyvertical/smrt-marketing:Campaign"
    },
    {
      "kind": "cli",
      "name": "campaign_create",
      "operation": "create",
      "objectName": "@happyvertical/smrt-marketing:Campaign"
    },
    {
      "kind": "cli",
      "name": "campaign_update",
      "operation": "update",
      "objectName": "@happyvertical/smrt-marketing:Campaign"
    },
    {
      "kind": "mcp",
      "name": "campaign_list",
      "operation": "list",
      "objectName": "@happyvertical/smrt-marketing:Campaign"
    },
    {
      "kind": "mcp",
      "name": "campaign_get",
      "operation": "get",
      "objectName": "@happyvertical/smrt-marketing:Campaign"
    },
    {
      "kind": "mcp",
      "name": "campaign_create",
      "operation": "create",
      "objectName": "@happyvertical/smrt-marketing:Campaign"
    },
    {
      "kind": "mcp",
      "name": "campaign_update",
      "operation": "update",
      "objectName": "@happyvertical/smrt-marketing:Campaign"
    },
    {
      "kind": "api",
      "name": "campaignchannels.list",
      "operation": "list",
      "objectName": "@happyvertical/smrt-marketing:CampaignChannel",
      "path": "/campaignchannels",
      "method": "GET"
    },
    {
      "kind": "api",
      "name": "campaignchannels.get",
      "operation": "get",
      "objectName": "@happyvertical/smrt-marketing:CampaignChannel",
      "path": "/campaignchannels/[id]",
      "method": "GET"
    },
    {
      "kind": "api",
      "name": "campaignchannels.create",
      "operation": "create",
      "objectName": "@happyvertical/smrt-marketing:CampaignChannel",
      "path": "/campaignchannels",
      "method": "POST"
    },
    {
      "kind": "api",
      "name": "campaignchannels.update",
      "operation": "update",
      "objectName": "@happyvertical/smrt-marketing:CampaignChannel",
      "path": "/campaignchannels/[id]",
      "method": "PATCH"
    },
    {
      "kind": "api",
      "name": "campaignchannels.delete",
      "operation": "delete",
      "objectName": "@happyvertical/smrt-marketing:CampaignChannel",
      "path": "/campaignchannels/[id]",
      "method": "DELETE"
    },
    {
      "kind": "cli",
      "name": "campaignchannel_list",
      "operation": "list",
      "objectName": "@happyvertical/smrt-marketing:CampaignChannel"
    },
    {
      "kind": "cli",
      "name": "campaignchannel_get",
      "operation": "get",
      "objectName": "@happyvertical/smrt-marketing:CampaignChannel"
    },
    {
      "kind": "cli",
      "name": "campaignchannel_create",
      "operation": "create",
      "objectName": "@happyvertical/smrt-marketing:CampaignChannel"
    },
    {
      "kind": "cli",
      "name": "campaignchannel_update",
      "operation": "update",
      "objectName": "@happyvertical/smrt-marketing:CampaignChannel"
    },
    {
      "kind": "cli",
      "name": "campaignchannel_delete",
      "operation": "delete",
      "objectName": "@happyvertical/smrt-marketing:CampaignChannel"
    },
    {
      "kind": "mcp",
      "name": "campaignchannel_list",
      "operation": "list",
      "objectName": "@happyvertical/smrt-marketing:CampaignChannel"
    },
    {
      "kind": "mcp",
      "name": "campaignchannel_get",
      "operation": "get",
      "objectName": "@happyvertical/smrt-marketing:CampaignChannel"
    },
    {
      "kind": "mcp",
      "name": "campaignchannel_create",
      "operation": "create",
      "objectName": "@happyvertical/smrt-marketing:CampaignChannel"
    },
    {
      "kind": "mcp",
      "name": "campaignchannel_update",
      "operation": "update",
      "objectName": "@happyvertical/smrt-marketing:CampaignChannel"
    },
    {
      "kind": "api",
      "name": "campaignmetricsnapshots.list",
      "operation": "list",
      "objectName": "@happyvertical/smrt-marketing:CampaignMetricSnapshot",
      "path": "/campaignmetricsnapshots",
      "method": "GET"
    },
    {
      "kind": "api",
      "name": "campaignmetricsnapshots.get",
      "operation": "get",
      "objectName": "@happyvertical/smrt-marketing:CampaignMetricSnapshot",
      "path": "/campaignmetricsnapshots/[id]",
      "method": "GET"
    },
    {
      "kind": "api",
      "name": "campaignmetricsnapshots.create",
      "operation": "create",
      "objectName": "@happyvertical/smrt-marketing:CampaignMetricSnapshot",
      "path": "/campaignmetricsnapshots",
      "method": "POST"
    },
    {
      "kind": "cli",
      "name": "campaignmetricsnapshot_list",
      "operation": "list",
      "objectName": "@happyvertical/smrt-marketing:CampaignMetricSnapshot"
    },
    {
      "kind": "cli",
      "name": "campaignmetricsnapshot_get",
      "operation": "get",
      "objectName": "@happyvertical/smrt-marketing:CampaignMetricSnapshot"
    },
    {
      "kind": "cli",
      "name": "campaignmetricsnapshot_create",
      "operation": "create",
      "objectName": "@happyvertical/smrt-marketing:CampaignMetricSnapshot"
    },
    {
      "kind": "mcp",
      "name": "campaignmetricsnapshot_list",
      "operation": "list",
      "objectName": "@happyvertical/smrt-marketing:CampaignMetricSnapshot"
    },
    {
      "kind": "mcp",
      "name": "campaignmetricsnapshot_get",
      "operation": "get",
      "objectName": "@happyvertical/smrt-marketing:CampaignMetricSnapshot"
    },
    {
      "kind": "mcp",
      "name": "campaignmetricsnapshot_create",
      "operation": "create",
      "objectName": "@happyvertical/smrt-marketing:CampaignMetricSnapshot"
    }
  ],
  "prompts": [],
  "relationshipsV2": {
    "foreignKeyFields": 3,
    "crossPackageRefFields": 1,
    "junctionCollections": 0,
    "hierarchicalObjects": 0,
    "polymorphicAssociations": 0,
    "uuidColumns": 20
  },
  "agentDoc": "# @happyvertical/smrt-marketing\n\nCross-channel campaign coordination for SMRT. This package owns Campaign\nidentity, budgets, lifecycle, execution links, immutable performance evidence,\ncomputed pacing, and props-driven Svelte surfaces. It does not execute ads,\npublish social posts, send messages, or own sales attribution.\n\n## Validation\n\nRun `pnpm --filter @happyvertical/smrt-marketing test` and\n`pnpm --filter @happyvertical/smrt-marketing typecheck`; use `test:coverage`\nto exercise the model/service and component coverage configurations.\nNatural-key changes must also run\n`pnpm --filter @happyvertical/smrt-marketing test:postgres` when\nthe disposable PostgreSQL harness is available. Use\n`pnpm --filter @happyvertical/smrt-marketing build` and `verify:pack` for\npublish-surface changes.\n\n## Models\n\n- **Campaign**: optional-tenant umbrella with stable natural key\n  `(tenant_id, campaign_key)`, open objective, integer-cent budget, currency,\n  schedule, optional native UUID reference to the canonical commerce Customer,\n  guarded metadata helpers, and lifecycle\n  `draft → scheduled → active ↔ paused → completed → archived`. Raw saves are\n  protected by an authoritative prior-status re-read; use\n  `CampaignLifecycleService` for lifecycle writes.\n- **CampaignChannel**: one generic execution link per\n  `(campaign_id, channel_kind, channel_ref)`. `channelKind`/`channelRef` are\n  intentionally plain strings so ads, social, messages, content, events, and\n  referral programs remain peer packages. Allocation and schedule overrides\n  use integer cents and dates.\n- **CampaignMetricSnapshot**: immutable period evidence with a global\n  `dedupe_key` natural key. A snapshot always carries `campaignId`; a null\n  `campaignChannelId` means campaign-level rollup evidence; when present, the\n  channel must belong to that same campaign. API/MCP/CLI expose create/list/get\n  only, and the save guard rejects hydrated edits, blind-id overwrites, and\n  natural-key overwrites. Programmatic deletion is rejected.\n\nEvery model is `@TenantScoped({ mode: 'optional' })` with nullable `tenantId`.\nAll generated surfaces are explicit; never omit `api`, `mcp`, or `cli` config.\n\n## Services\n\n- **CampaignLifecycleService** loads the current row before applying one legal\n  transition. Paused campaigns may resume; completed campaigns may only be\n  archived; archived campaigns are terminal.\n- **MetricIngestionService** validates required scope/source/period fields and\n  delegates to `getOrCreateByDedupeKey()`. A replay returns the original row\n  unchanged even if the replay payload differs.\n- **BudgetPacingService** computes campaign/channel pacing from snapshots and\n  never persists derived balances. For each exact reporting period, campaign\n  pacing prefers campaign rollups and otherwise sums channel snapshots,\n  preventing double counting without dropping channel-only periods. Status\n  uses a five-percent budget tolerance around schedule-derived expected spend.\n- **CampaignCollection** exposes bounded, tenant-and-Customer-scoped cursor\n  pages ordered by `start_at DESC, id DESC` and bounded batch summaries for\n  total count, active count, and latest start time. Its reporting-page variant\n  preserves that order/cursor and adds channel count/mix, immutable metric\n  totals, and canonical pacing with two page-wide grouped reads. Customer scope\n  is validated through runtime relationship metadata; there is no static\n  commerce import, per-campaign callback, or tenant-wide materialization.\n\n## Svelte\n\n`@happyvertical/smrt-marketing/svelte` exports `MarketingDashboard`,\n`CampaignList`, `CampaignDetail`, `ChannelMix`, and `BudgetPacing`, plus view\ninterfaces and pure helpers. Components are props-only: no fetching, no model\nimports, no providers. Use Provider-free `smrt-ui` primitives, `--smrt-*`\ntokens, named `$props()` interfaces, and integer-cent inputs formatted only at\nrender time.\n\n## Boundaries and gotchas\n\n- Runtime dependencies stay limited to `smrt-core`, `smrt-tenancy`, and\n  `smrt-ui`. Never statically import sibling domain packages.\n- `Campaign.customerId` targets `@happyvertical/smrt-commerce:Customer` through\n  `@crossPackageRef`. Saves and customer-scoped reads require exact tenant\n  agreement (including global-to-global only) and fail without revealing\n  whether a Customer is absent or belongs elsewhere. Associated saves validate\n  and persist through one transaction-bound Campaign instance; scoped reads\n  validate and query through one fresh transaction-bound collection. PostgreSQL\n  locks the validated Customer rows for the duration of each operation.\n- Lead loop-closing is conventional: CRM stores `sourceKind: 'campaign'` and a\n  campaign key in `sourceId`; marketing does not import or mutate Lead.\n- Attribution math remains in sales/referrals. Marketing stores performance\n  evidence only.\n- Campaign rollups and channel snapshots may describe the same period. The\n  pacing service deliberately chooses one evidence level instead of summing\n  both.\n- Corrections append a new metric snapshot with a new dedupe key; never edit\n  persisted evidence.\n- Table names are global: `campaigns`, `campaign_channels`, and\n  `campaign_metric_snapshots`.\n"
}