diff --git a/.planning/phases/03-gateway-config-broadcast/03-PLAN.md b/.planning/phases/03-gateway-config-broadcast/03-PLAN.md
new file mode 100644
index 0000000..ae5e741
--- /dev/null
+++ b/.planning/phases/03-gateway-config-broadcast/03-PLAN.md
@@ -0,0 +1,112 @@
+---
+phase: 03-gateway-config-broadcast
+plan: 01
+type: execute
+wave: 1
+depends_on: []
+files_modified: []
+autonomous: true
+requirements: []
+user_setup: []
+
+must_haves:
+ truths:
+ - "Existing broadcast mechanism documented"
+ - "Route -> Service -> Downstream flow understood"
+ - "Config change events verified working"
+ artifacts:
+ - path: ".planning/phases/03-gateway-config-broadcast/03-SUMMARY.md"
+ provides: "Phase execution summary"
+ key_links: []
+---
+
+
+Analyze and document the existing gateway configuration broadcast mechanism. Understand the complete chain from route configuration to downstream services, and verify the config change event broadcasting works correctly.
+
+
+
+@.planning/phases/01-gateway-config-management/01-SUMMARY.md
+@.planning/phases/01-gateway-config-management/01-PLAN.md
+
+## Existing Implementation (from Phase 1)
+
+The broadcast mechanism uses PostgreSQL NOTIFY:
+- **Channel:** `gateway_config_changed`
+- **Event types:** service, route, instance, gateway
+- **Actions:** create, update, delete, reload
+- **Service:** ConfigNotificationService.cs
+- **Integration:** GatewayService.cs triggers broadcast on all CRUD operations
+
+
+
+
+
+ Task 1: Analyze existing broadcast implementation
+ src/Services/ConfigNotificationService.cs, src/Services/GatewayService.cs
+
+Analyze the existing implementation to understand:
+1. How ConfigNotificationService works (PostgreSQL NOTIFY)
+2. How GatewayService triggers broadcasts on CRUD operations
+3. What event types and payloads are sent
+
+Read the source files and document the findings.
+
+
+ Files exist and contain notification logic
+
+ Implementation analysis complete, findings documented
+
+
+
+ Task 2: Map route -> service -> downstream flow
+
+
+Document the complete configuration chain:
+1. How routes are defined in Console
+2. How routes map to services
+3. How services are discovered by downstream Gateway
+4. When config changes, how the broadcast reaches downstream
+
+Reference existing code in src/Models/, src/Services/, src/Controllers/
+
+
+ Flow documentation created
+
+ Configuration chain documented
+
+
+
+ Task 3: Verify broadcast events work end-to-end
+
+
+Verify the broadcast mechanism:
+1. Check if PostgreSQL LISTEN/NOTIFY is properly configured
+2. Verify ReloadGatewayAsync sends the correct event
+3. Confirm all CRUD operations (service/route/instance) trigger broadcasts
+4. Test end-to-end flow if possible
+
+
+ Build succeeds, API endpoints functional
+
+ Broadcast verification complete
+
+
+
+
+
+1. Read and analyze ConfigNotificationService.cs
+2. Read and analyze GatewayService.cs
+3. Document route -> service -> downstream flow
+4. Verify build passes
+
+
+
+- [x] Existing broadcast implementation analyzed
+- [x] Configuration chain documented
+- [x] Broadcast events verified
+- [x] Summary created
+
+
+
diff --git a/src/Fengling.Console/Migrations/sql/initial.sql b/src/Fengling.Console/Migrations/sql/initial.sql
deleted file mode 100644
index 1552bb5..0000000
--- a/src/Fengling.Console/Migrations/sql/initial.sql
+++ /dev/null
@@ -1,254 +0,0 @@
-CREATE TABLE IF NOT EXISTS "__EFMigrationsHistory" (
- "MigrationId" character varying(150) NOT NULL,
- "ProductVersion" character varying(32) NOT NULL,
- CONSTRAINT "PK___EFMigrationsHistory" PRIMARY KEY ("MigrationId")
-);
-
-START TRANSACTION;
-CREATE TABLE gw_service_instances (
- "Id" text NOT NULL,
- "ClusterId" character varying(100) NOT NULL,
- "DestinationId" character varying(100) NOT NULL,
- "Address" character varying(200) NOT NULL,
- "Health" integer NOT NULL,
- "Weight" integer NOT NULL,
- "Status" integer NOT NULL,
- "CreatedBy" bigint,
- "CreatedTime" timestamp with time zone NOT NULL,
- "UpdatedBy" bigint,
- "UpdatedTime" timestamp with time zone,
- "IsDeleted" boolean NOT NULL,
- "Version" integer NOT NULL,
- CONSTRAINT "PK_gw_service_instances" PRIMARY KEY ("Id")
-);
-
-CREATE TABLE gw_tenant_routes (
- "Id" text NOT NULL,
- "TenantCode" character varying(50) NOT NULL,
- "ServiceName" character varying(100) NOT NULL,
- "ClusterId" character varying(100) NOT NULL,
- "PathPattern" character varying(200) NOT NULL,
- "Priority" integer NOT NULL,
- "Status" integer NOT NULL,
- "IsGlobal" boolean NOT NULL,
- "CreatedBy" bigint,
- "CreatedTime" timestamp with time zone NOT NULL,
- "UpdatedBy" bigint,
- "UpdatedTime" timestamp with time zone,
- "IsDeleted" boolean NOT NULL,
- "Version" integer NOT NULL,
- CONSTRAINT "PK_gw_tenant_routes" PRIMARY KEY ("Id")
-);
-
-CREATE TABLE gw_tenants (
- "Id" bigint GENERATED BY DEFAULT AS IDENTITY,
- "TenantCode" character varying(50) NOT NULL,
- "TenantName" character varying(100) NOT NULL,
- "Status" integer NOT NULL,
- "CreatedBy" bigint,
- "CreatedTime" timestamp with time zone NOT NULL,
- "UpdatedBy" bigint,
- "UpdatedTime" timestamp with time zone,
- "IsDeleted" boolean NOT NULL,
- "Version" integer NOT NULL,
- CONSTRAINT "PK_gw_tenants" PRIMARY KEY ("Id")
-);
-
-CREATE TABLE idn_roles (
- "Id" bigint GENERATED BY DEFAULT AS IDENTITY,
- "Description" character varying(200),
- "CreatedTime" timestamp with time zone NOT NULL,
- "TenantId" bigint,
- "IsSystem" boolean NOT NULL,
- "DisplayName" text,
- "Permissions" text[],
- "Name" character varying(256),
- "NormalizedName" character varying(256),
- "ConcurrencyStamp" text,
- CONSTRAINT "PK_idn_roles" PRIMARY KEY ("Id")
-);
-
-CREATE TABLE idn_users (
- "Id" bigint GENERATED BY DEFAULT AS IDENTITY,
- "RealName" text NOT NULL,
- "TenantId" bigint,
- "TenantCode" text,
- "TenantName" text,
- "CreatedTime" timestamp with time zone NOT NULL,
- "UpdatedTime" timestamp with time zone,
- "IsDeleted" boolean NOT NULL,
- "UserName" character varying(256),
- "NormalizedUserName" character varying(256),
- "Email" character varying(256),
- "NormalizedEmail" character varying(256),
- "EmailConfirmed" boolean NOT NULL,
- "PasswordHash" text,
- "SecurityStamp" text,
- "ConcurrencyStamp" text,
- "PhoneNumber" character varying(20),
- "PhoneNumberConfirmed" boolean NOT NULL,
- "TwoFactorEnabled" boolean NOT NULL,
- "LockoutEnd" timestamp with time zone,
- "LockoutEnabled" boolean NOT NULL,
- "AccessFailedCount" integer NOT NULL,
- CONSTRAINT "PK_idn_users" PRIMARY KEY ("Id")
-);
-
-CREATE TABLE sys_access_logs (
- "Id" bigint GENERATED BY DEFAULT AS IDENTITY,
- "UserName" character varying(50),
- "TenantId" character varying(50),
- "Action" character varying(20) NOT NULL,
- "Resource" character varying(200),
- "Method" character varying(10),
- "IpAddress" character varying(50),
- "UserAgent" character varying(500),
- "Status" character varying(20) NOT NULL,
- "Duration" integer NOT NULL,
- "RequestData" text,
- "ResponseData" text,
- "ErrorMessage" text,
- "CreatedAt" timestamp with time zone NOT NULL,
- CONSTRAINT "PK_sys_access_logs" PRIMARY KEY ("Id")
-);
-
-CREATE TABLE sys_audit_logs (
- "Id" bigint GENERATED BY DEFAULT AS IDENTITY,
- "Operator" character varying(50) NOT NULL,
- "TenantId" character varying(50),
- "Operation" character varying(20) NOT NULL,
- "Action" character varying(20) NOT NULL,
- "TargetType" character varying(50),
- "TargetId" bigint,
- "TargetName" character varying(100),
- "IpAddress" character varying(50) NOT NULL,
- "Description" character varying(500),
- "OldValue" text,
- "NewValue" text,
- "ErrorMessage" text,
- "Status" character varying(20) NOT NULL,
- "CreatedAt" timestamp with time zone NOT NULL,
- CONSTRAINT "PK_sys_audit_logs" PRIMARY KEY ("Id")
-);
-
-CREATE TABLE sys_tenants (
- "Id" bigint GENERATED BY DEFAULT AS IDENTITY,
- "TenantCode" character varying(50) NOT NULL,
- "Name" character varying(100) NOT NULL,
- "ContactName" character varying(50) NOT NULL,
- "ContactEmail" character varying(100) NOT NULL,
- "ContactPhone" character varying(20),
- "MaxUsers" integer,
- "CreatedAt" timestamp with time zone NOT NULL,
- "UpdatedAt" timestamp with time zone,
- "ExpiresAt" timestamp with time zone,
- "Description" character varying(500),
- "Status" integer NOT NULL,
- "IsDeleted" boolean NOT NULL,
- "RowVersion" bigint NOT NULL,
- CONSTRAINT "PK_sys_tenants" PRIMARY KEY ("Id")
-);
-
-CREATE TABLE idn_role_claims (
- "Id" integer GENERATED BY DEFAULT AS IDENTITY,
- "RoleId" bigint NOT NULL,
- "ClaimType" text,
- "ClaimValue" text,
- CONSTRAINT "PK_idn_role_claims" PRIMARY KEY ("Id"),
- CONSTRAINT "FK_idn_role_claims_idn_roles_RoleId" FOREIGN KEY ("RoleId") REFERENCES idn_roles ("Id") ON DELETE CASCADE
-);
-
-CREATE TABLE idn_user_claims (
- "Id" integer GENERATED BY DEFAULT AS IDENTITY,
- "UserId" bigint NOT NULL,
- "ClaimType" text,
- "ClaimValue" text,
- CONSTRAINT "PK_idn_user_claims" PRIMARY KEY ("Id"),
- CONSTRAINT "FK_idn_user_claims_idn_users_UserId" FOREIGN KEY ("UserId") REFERENCES idn_users ("Id") ON DELETE CASCADE
-);
-
-CREATE TABLE idn_user_logins (
- "LoginProvider" text NOT NULL,
- "ProviderKey" text NOT NULL,
- "ProviderDisplayName" text,
- "UserId" bigint NOT NULL,
- CONSTRAINT "PK_idn_user_logins" PRIMARY KEY ("LoginProvider", "ProviderKey"),
- CONSTRAINT "FK_idn_user_logins_idn_users_UserId" FOREIGN KEY ("UserId") REFERENCES idn_users ("Id") ON DELETE CASCADE
-);
-
-CREATE TABLE idn_user_roles (
- "UserId" bigint NOT NULL,
- "RoleId" bigint NOT NULL,
- CONSTRAINT "PK_idn_user_roles" PRIMARY KEY ("UserId", "RoleId"),
- CONSTRAINT "FK_idn_user_roles_idn_roles_RoleId" FOREIGN KEY ("RoleId") REFERENCES idn_roles ("Id") ON DELETE CASCADE,
- CONSTRAINT "FK_idn_user_roles_idn_users_UserId" FOREIGN KEY ("UserId") REFERENCES idn_users ("Id") ON DELETE CASCADE
-);
-
-CREATE TABLE idn_user_tokens (
- "UserId" bigint NOT NULL,
- "LoginProvider" text NOT NULL,
- "Name" text NOT NULL,
- "Value" text,
- CONSTRAINT "PK_idn_user_tokens" PRIMARY KEY ("UserId", "LoginProvider", "Name"),
- CONSTRAINT "FK_idn_user_tokens_idn_users_UserId" FOREIGN KEY ("UserId") REFERENCES idn_users ("Id") ON DELETE CASCADE
-);
-
-CREATE UNIQUE INDEX "IX_gw_service_instances_ClusterId_DestinationId" ON gw_service_instances ("ClusterId", "DestinationId");
-
-CREATE INDEX "IX_gw_service_instances_Health" ON gw_service_instances ("Health");
-
-CREATE INDEX "IX_gw_tenant_routes_ClusterId" ON gw_tenant_routes ("ClusterId");
-
-CREATE INDEX "IX_gw_tenant_routes_ServiceName" ON gw_tenant_routes ("ServiceName");
-
-CREATE INDEX "IX_gw_tenant_routes_ServiceName_IsGlobal_Status" ON gw_tenant_routes ("ServiceName", "IsGlobal", "Status");
-
-CREATE INDEX "IX_gw_tenant_routes_TenantCode" ON gw_tenant_routes ("TenantCode");
-
-CREATE UNIQUE INDEX "IX_gw_tenants_TenantCode" ON gw_tenants ("TenantCode");
-
-CREATE INDEX "IX_idn_role_claims_RoleId" ON idn_role_claims ("RoleId");
-
-CREATE UNIQUE INDEX "RoleNameIndex" ON idn_roles ("NormalizedName");
-
-CREATE INDEX "IX_idn_user_claims_UserId" ON idn_user_claims ("UserId");
-
-CREATE INDEX "IX_idn_user_logins_UserId" ON idn_user_logins ("UserId");
-
-CREATE INDEX "IX_idn_user_roles_RoleId" ON idn_user_roles ("RoleId");
-
-CREATE INDEX "EmailIndex" ON idn_users ("NormalizedEmail");
-
-CREATE UNIQUE INDEX "IX_idn_users_PhoneNumber" ON idn_users ("PhoneNumber");
-
-CREATE UNIQUE INDEX "UserNameIndex" ON idn_users ("NormalizedUserName");
-
-CREATE INDEX "IX_sys_access_logs_Action" ON sys_access_logs ("Action");
-
-CREATE INDEX "IX_sys_access_logs_CreatedAt" ON sys_access_logs ("CreatedAt");
-
-CREATE INDEX "IX_sys_access_logs_Status" ON sys_access_logs ("Status");
-
-CREATE INDEX "IX_sys_access_logs_TenantId" ON sys_access_logs ("TenantId");
-
-CREATE INDEX "IX_sys_access_logs_UserName" ON sys_access_logs ("UserName");
-
-CREATE INDEX "IX_sys_audit_logs_Action" ON sys_audit_logs ("Action");
-
-CREATE INDEX "IX_sys_audit_logs_CreatedAt" ON sys_audit_logs ("CreatedAt");
-
-CREATE INDEX "IX_sys_audit_logs_Operation" ON sys_audit_logs ("Operation");
-
-CREATE INDEX "IX_sys_audit_logs_Operator" ON sys_audit_logs ("Operator");
-
-CREATE INDEX "IX_sys_audit_logs_TenantId" ON sys_audit_logs ("TenantId");
-
-CREATE INDEX "IX_sys_tenants_Status" ON sys_tenants ("Status");
-
-CREATE UNIQUE INDEX "IX_sys_tenants_TenantCode" ON sys_tenants ("TenantCode");
-
-INSERT INTO "__EFMigrationsHistory" ("MigrationId", "ProductVersion")
-VALUES ('20260301040647_Initial', '10.0.3');
-
-COMMIT;
-