diff --git a/.ai/product/feature-spec/ops-ask-operations.md b/.ai/product/feature-spec/ops-ask-operations.md
index d8841a0..b1c89a5 100644
--- a/.ai/product/feature-spec/ops-ask-operations.md
+++ b/.ai/product/feature-spec/ops-ask-operations.md
@@ -21,7 +21,8 @@
| Method | Path | 权限 | 语义 |
|--------|------|------|------|
| GET | `/admin/ask/threads` | `admin.ask.read` | 列表(可选 `user_id`) |
-| GET | `/admin/ask/threads/:id` | `admin.ask.read` | 详情含消息 |
+| GET | `/admin/ask/threads/:id` | `admin.ask.read` | 会话 meta(不含原文) |
+| GET | `/admin/ask/threads/:id/messages` | `admin.ask.transcript.read` | 对话原文(审计 `ask.transcript.read`) |
## Migration
diff --git a/.ai/product/feature-spec/ops-funnel-definition.md b/.ai/product/feature-spec/ops-funnel-definition.md
index 5ffe301..c3beb03 100644
--- a/.ai/product/feature-spec/ops-funnel-definition.md
+++ b/.ai/product/feature-spec/ops-funnel-definition.md
@@ -19,8 +19,8 @@
| Method | Path | 权限 | 语义 |
|--------|------|------|------|
-| GET | `/admin/analytics/funnel-definitions` | `admin.analytics.read` | 只读 |
-| GET | `/admin/analytics/funnel-definitions/{id}` | `admin.analytics.read` | 只读 |
+| GET | `/admin/analytics/funnel-definitions` | `admin.growth.read` | 只读 |
+| GET | `/admin/analytics/funnel-definitions/{id}` | `admin.growth.read` | 只读 |
## Migration
diff --git a/.ai/product/feature-spec/ops-scale-definition.md b/.ai/product/feature-spec/ops-scale-definition.md
index d053372..198a204 100644
--- a/.ai/product/feature-spec/ops-scale-definition.md
+++ b/.ai/product/feature-spec/ops-scale-definition.md
@@ -19,8 +19,9 @@ PATCH status(已有 content.write)· 题干编辑 · UGC · 真支付
| Method | Path | 权限 | 语义 |
|--------|------|------|------|
-| GET | `/admin/explore/scales` | `admin.explore.read` | 只读 |
-| GET | `/admin/explore/scales/{id}` | `admin.explore.read` | 只读 |
+| GET | `/admin/explore/scales` | `admin.explore.read` 或 `admin.content.write` | 只读 |
+| GET | `/admin/explore/scales/{id}` | `admin.explore.read` 或 `admin.content.write` | 只读 |
+| GET | `/admin/scales` | `admin.explore.read` 或 `admin.content.write` | 只读(与 explore 同源) |
## Migration
diff --git a/.gates/ECR-012-report.json b/.gates/ECR-012-report.json
new file mode 100644
index 0000000..17a908c
--- /dev/null
+++ b/.gates/ECR-012-report.json
@@ -0,0 +1,53 @@
+{
+ "ecr": "ECR-012",
+ "result": "BLOCK",
+ "ess_version": "v1.0",
+ "gate_version": "0.1.2",
+ "project_profile": "unknown",
+ "checks": {
+ "artifact": true,
+ "role_boundary": true,
+ "backend_boundary": true,
+ "traceability": false,
+ "tests": false
+ },
+ "violations": [
+ {
+ "rule": "TR-REVIEW-001",
+ "description": "Backend change requires CODE_REVIEW / code-review handoff artifact",
+ "fix_required": [
+ "Write reviewer decision artifact",
+ "Re-run gate"
+ ],
+ "detail": "ECR-012",
+ "check": "traceability-check"
+ },
+ {
+ "rule": "TR-COMMIT-001",
+ "description": "Trace chain requires implementation commit evidence",
+ "fix_required": [
+ "Record commit sha in TRACEABILITY or TEST_REPORT",
+ "Re-run gate"
+ ],
+ "detail": "ECR-012",
+ "check": "traceability-check"
+ },
+ {
+ "rule": "TE-MISSING-001",
+ "description": "Missing TEST_REPORT for implemented change",
+ "fix_required": [
+ "Add docs/TEST_REPORT/ECR-xxx.md",
+ "Re-run gate"
+ ],
+ "detail": "ECR-012",
+ "check": "test-evidence-check"
+ }
+ ],
+ "errors": [
+ "[traceability-check] BLOCK [TR-REVIEW-001]: Backend change requires CODE_REVIEW / code-review handoff artifact \u2014 ECR-012",
+ "[traceability-check] BLOCK [TR-COMMIT-001]: Trace chain requires implementation commit evidence \u2014 ECR-012",
+ "[test-evidence-check] BLOCK [TE-MISSING-001]: Missing TEST_REPORT for implemented change \u2014 ECR-012"
+ ],
+ "warnings": [],
+ "timestamp": "2026-08-07T06:51:10Z"
+}
diff --git a/.gates/ECR-016-report.json b/.gates/ECR-016-report.json
new file mode 100644
index 0000000..09e3717
--- /dev/null
+++ b/.gates/ECR-016-report.json
@@ -0,0 +1,18 @@
+{
+ "ecr": "ECR-016",
+ "result": "PASS",
+ "ess_version": "v1.0",
+ "gate_version": "0.1.2",
+ "project_profile": "unknown",
+ "checks": {
+ "artifact": true,
+ "role_boundary": true,
+ "backend_boundary": true,
+ "traceability": true,
+ "tests": true
+ },
+ "violations": [],
+ "errors": [],
+ "warnings": [],
+ "timestamp": "2026-08-07T10:30:16Z"
+}
diff --git a/.gates/ECR-017-report.json b/.gates/ECR-017-report.json
new file mode 100644
index 0000000..7199ae5
--- /dev/null
+++ b/.gates/ECR-017-report.json
@@ -0,0 +1,18 @@
+{
+ "ecr": "ECR-017",
+ "result": "PASS",
+ "ess_version": "v1.0",
+ "gate_version": "0.1.2",
+ "project_profile": "unknown",
+ "checks": {
+ "artifact": true,
+ "role_boundary": true,
+ "backend_boundary": true,
+ "traceability": true,
+ "tests": true
+ },
+ "violations": [],
+ "errors": [],
+ "warnings": [],
+ "timestamp": "2026-08-07T10:39:01Z"
+}
diff --git a/.gates/ECR-018-report.json b/.gates/ECR-018-report.json
new file mode 100644
index 0000000..5954f7c
--- /dev/null
+++ b/.gates/ECR-018-report.json
@@ -0,0 +1,18 @@
+{
+ "ecr": "ECR-018",
+ "result": "PASS",
+ "ess_version": "v1.0",
+ "gate_version": "0.1.2",
+ "project_profile": "unknown",
+ "checks": {
+ "artifact": true,
+ "role_boundary": true,
+ "backend_boundary": true,
+ "traceability": true,
+ "tests": true
+ },
+ "violations": [],
+ "errors": [],
+ "warnings": [],
+ "timestamp": "2026-08-07T11:26:01Z"
+}
diff --git a/.gates/ECR-019-report.json b/.gates/ECR-019-report.json
new file mode 100644
index 0000000..f01299d
--- /dev/null
+++ b/.gates/ECR-019-report.json
@@ -0,0 +1,18 @@
+{
+ "ecr": "ECR-019",
+ "result": "PASS",
+ "ess_version": "v1.0",
+ "gate_version": "0.1.2",
+ "project_profile": "unknown",
+ "checks": {
+ "artifact": true,
+ "role_boundary": true,
+ "backend_boundary": true,
+ "traceability": true,
+ "tests": true
+ },
+ "violations": [],
+ "errors": [],
+ "warnings": [],
+ "timestamp": "2026-08-07T14:13:03Z"
+}
diff --git a/.gates/ECR-020-report.json b/.gates/ECR-020-report.json
new file mode 100644
index 0000000..cf10708
--- /dev/null
+++ b/.gates/ECR-020-report.json
@@ -0,0 +1,18 @@
+{
+ "ecr": "ECR-020",
+ "result": "PASS",
+ "ess_version": "v1.0",
+ "gate_version": "0.1.2",
+ "project_profile": "unknown",
+ "checks": {
+ "artifact": true,
+ "role_boundary": true,
+ "backend_boundary": true,
+ "traceability": true,
+ "tests": true
+ },
+ "violations": [],
+ "errors": [],
+ "warnings": [],
+ "timestamp": "2026-08-07T15:01:53Z"
+}
diff --git a/.gates/ECR-021-report.json b/.gates/ECR-021-report.json
new file mode 100644
index 0000000..d011c0d
--- /dev/null
+++ b/.gates/ECR-021-report.json
@@ -0,0 +1,18 @@
+{
+ "ecr": "ECR-021",
+ "result": "PASS",
+ "ess_version": "v1.0",
+ "gate_version": "0.1.2",
+ "project_profile": "unknown",
+ "checks": {
+ "artifact": true,
+ "role_boundary": true,
+ "backend_boundary": true,
+ "traceability": true,
+ "tests": true
+ },
+ "violations": [],
+ "errors": [],
+ "warnings": [],
+ "timestamp": "2026-08-07T16:26:53Z"
+}
diff --git a/.gates/ECR-022-report.json b/.gates/ECR-022-report.json
new file mode 100644
index 0000000..4aa521a
--- /dev/null
+++ b/.gates/ECR-022-report.json
@@ -0,0 +1,18 @@
+{
+ "ecr": "ECR-022",
+ "result": "PASS",
+ "ess_version": "v1.0",
+ "gate_version": "0.1.2",
+ "project_profile": "unknown",
+ "checks": {
+ "artifact": true,
+ "role_boundary": true,
+ "backend_boundary": true,
+ "traceability": true,
+ "tests": true
+ },
+ "violations": [],
+ "errors": [],
+ "warnings": [],
+ "timestamp": "2026-08-07T17:28:27Z"
+}
diff --git a/.gates/ECR-023-report.json b/.gates/ECR-023-report.json
new file mode 100644
index 0000000..f6b5b18
--- /dev/null
+++ b/.gates/ECR-023-report.json
@@ -0,0 +1,18 @@
+{
+ "ecr": "ECR-023",
+ "result": "PASS",
+ "ess_version": "v1.0",
+ "gate_version": "0.1.2",
+ "project_profile": "unknown",
+ "checks": {
+ "artifact": true,
+ "role_boundary": true,
+ "backend_boundary": true,
+ "traceability": true,
+ "tests": true
+ },
+ "violations": [],
+ "errors": [],
+ "warnings": [],
+ "timestamp": "2026-08-07T17:48:29Z"
+}
diff --git a/.gates/ECR-024-report.json b/.gates/ECR-024-report.json
new file mode 100644
index 0000000..24363e6
--- /dev/null
+++ b/.gates/ECR-024-report.json
@@ -0,0 +1,18 @@
+{
+ "ecr": "ECR-024",
+ "result": "PASS",
+ "ess_version": "v1.0",
+ "gate_version": "0.1.2",
+ "project_profile": "unknown",
+ "checks": {
+ "artifact": true,
+ "role_boundary": true,
+ "backend_boundary": true,
+ "traceability": true,
+ "tests": true
+ },
+ "violations": [],
+ "errors": [],
+ "warnings": [],
+ "timestamp": "2026-08-07T19:05:41Z"
+}
diff --git a/.gates/ECR-025-report.json b/.gates/ECR-025-report.json
new file mode 100644
index 0000000..ba699c5
--- /dev/null
+++ b/.gates/ECR-025-report.json
@@ -0,0 +1,18 @@
+{
+ "ecr": "ECR-025",
+ "result": "PASS",
+ "ess_version": "v1.0",
+ "gate_version": "0.1.2",
+ "project_profile": "unknown",
+ "checks": {
+ "artifact": true,
+ "role_boundary": true,
+ "backend_boundary": true,
+ "traceability": true,
+ "tests": true
+ },
+ "violations": [],
+ "errors": [],
+ "warnings": [],
+ "timestamp": "2026-08-07T19:08:40Z"
+}
diff --git a/.gates/ECR-026-report.json b/.gates/ECR-026-report.json
new file mode 100644
index 0000000..898d225
--- /dev/null
+++ b/.gates/ECR-026-report.json
@@ -0,0 +1,18 @@
+{
+ "ecr": "ECR-026",
+ "result": "PASS",
+ "ess_version": "v1.0",
+ "gate_version": "0.1.2",
+ "project_profile": "unknown",
+ "checks": {
+ "artifact": true,
+ "role_boundary": true,
+ "backend_boundary": true,
+ "traceability": true,
+ "tests": true
+ },
+ "violations": [],
+ "errors": [],
+ "warnings": [],
+ "timestamp": "2026-08-07T19:13:36Z"
+}
diff --git a/.gates/ECR-027-report.json b/.gates/ECR-027-report.json
new file mode 100644
index 0000000..5f2edfe
--- /dev/null
+++ b/.gates/ECR-027-report.json
@@ -0,0 +1,18 @@
+{
+ "ecr": "ECR-027",
+ "result": "PASS",
+ "ess_version": "v1.0",
+ "gate_version": "0.1.2",
+ "project_profile": "unknown",
+ "checks": {
+ "artifact": true,
+ "role_boundary": true,
+ "backend_boundary": true,
+ "traceability": true,
+ "tests": true
+ },
+ "violations": [],
+ "errors": [],
+ "warnings": [],
+ "timestamp": "2026-08-07T19:14:17Z"
+}
diff --git a/.gates/ECR-028-report.json b/.gates/ECR-028-report.json
new file mode 100644
index 0000000..4e3d03e
--- /dev/null
+++ b/.gates/ECR-028-report.json
@@ -0,0 +1,18 @@
+{
+ "ecr": "ECR-028",
+ "result": "PASS",
+ "ess_version": "v1.0",
+ "gate_version": "0.1.2",
+ "project_profile": "unknown",
+ "checks": {
+ "artifact": true,
+ "role_boundary": true,
+ "backend_boundary": true,
+ "traceability": true,
+ "tests": true
+ },
+ "violations": [],
+ "errors": [],
+ "warnings": [],
+ "timestamp": "2026-08-07T19:14:30Z"
+}
diff --git a/.gates/ECR-029-report.json b/.gates/ECR-029-report.json
new file mode 100644
index 0000000..330dfd1
--- /dev/null
+++ b/.gates/ECR-029-report.json
@@ -0,0 +1,18 @@
+{
+ "ecr": "ECR-029",
+ "result": "PASS",
+ "ess_version": "v1.0",
+ "gate_version": "0.1.2",
+ "project_profile": "unknown",
+ "checks": {
+ "artifact": true,
+ "role_boundary": true,
+ "backend_boundary": true,
+ "traceability": true,
+ "tests": true
+ },
+ "violations": [],
+ "errors": [],
+ "warnings": [],
+ "timestamp": "2026-08-07T19:14:44Z"
+}
diff --git a/.gates/ECR-030-report.json b/.gates/ECR-030-report.json
new file mode 100644
index 0000000..e079afb
--- /dev/null
+++ b/.gates/ECR-030-report.json
@@ -0,0 +1,18 @@
+{
+ "ecr": "ECR-030",
+ "result": "PASS",
+ "ess_version": "v1.0",
+ "gate_version": "0.1.2",
+ "project_profile": "unknown",
+ "checks": {
+ "artifact": true,
+ "role_boundary": true,
+ "backend_boundary": true,
+ "traceability": true,
+ "tests": true
+ },
+ "violations": [],
+ "errors": [],
+ "warnings": [],
+ "timestamp": "2026-08-07T19:15:00Z"
+}
diff --git a/.gates/ECR-031-report.json b/.gates/ECR-031-report.json
new file mode 100644
index 0000000..d5f7185
--- /dev/null
+++ b/.gates/ECR-031-report.json
@@ -0,0 +1,18 @@
+{
+ "ecr": "ECR-031",
+ "result": "PASS",
+ "ess_version": "v1.0",
+ "gate_version": "0.1.2",
+ "project_profile": "unknown",
+ "checks": {
+ "artifact": true,
+ "role_boundary": true,
+ "backend_boundary": true,
+ "traceability": true,
+ "tests": true
+ },
+ "violations": [],
+ "errors": [],
+ "warnings": [],
+ "timestamp": "2026-08-07T19:15:15Z"
+}
diff --git a/.gates/ECR-032-report.json b/.gates/ECR-032-report.json
new file mode 100644
index 0000000..ea1f5ce
--- /dev/null
+++ b/.gates/ECR-032-report.json
@@ -0,0 +1,18 @@
+{
+ "ecr": "ECR-032",
+ "result": "PASS",
+ "ess_version": "v1.0",
+ "gate_version": "0.1.2",
+ "project_profile": "unknown",
+ "checks": {
+ "artifact": true,
+ "role_boundary": true,
+ "backend_boundary": true,
+ "traceability": true,
+ "tests": true
+ },
+ "violations": [],
+ "errors": [],
+ "warnings": [],
+ "timestamp": "2026-08-07T19:15:30Z"
+}
diff --git a/.gates/ECR-033-report.json b/.gates/ECR-033-report.json
new file mode 100644
index 0000000..5ab79e4
--- /dev/null
+++ b/.gates/ECR-033-report.json
@@ -0,0 +1,18 @@
+{
+ "ecr": "ECR-033",
+ "result": "PASS",
+ "ess_version": "v1.0",
+ "gate_version": "0.1.2",
+ "project_profile": "unknown",
+ "checks": {
+ "artifact": true,
+ "role_boundary": true,
+ "backend_boundary": true,
+ "traceability": true,
+ "tests": true
+ },
+ "violations": [],
+ "errors": [],
+ "warnings": [],
+ "timestamp": "2026-08-07T19:15:45Z"
+}
diff --git a/.gates/ECR-034-report.json b/.gates/ECR-034-report.json
new file mode 100644
index 0000000..97e9685
--- /dev/null
+++ b/.gates/ECR-034-report.json
@@ -0,0 +1,18 @@
+{
+ "ecr": "ECR-034",
+ "result": "PASS",
+ "ess_version": "v1.0",
+ "gate_version": "0.1.2",
+ "project_profile": "unknown",
+ "checks": {
+ "artifact": true,
+ "role_boundary": true,
+ "backend_boundary": true,
+ "traceability": true,
+ "tests": true
+ },
+ "violations": [],
+ "errors": [],
+ "warnings": [],
+ "timestamp": "2026-08-07T19:15:59Z"
+}
diff --git a/.gates/ECR-035-report.json b/.gates/ECR-035-report.json
new file mode 100644
index 0000000..94a902a
--- /dev/null
+++ b/.gates/ECR-035-report.json
@@ -0,0 +1,18 @@
+{
+ "ecr": "ECR-035",
+ "result": "PASS",
+ "ess_version": "v1.0",
+ "gate_version": "0.1.2",
+ "project_profile": "unknown",
+ "checks": {
+ "artifact": true,
+ "role_boundary": true,
+ "backend_boundary": true,
+ "traceability": true,
+ "tests": true
+ },
+ "violations": [],
+ "errors": [],
+ "warnings": [],
+ "timestamp": "2026-08-07T19:16:12Z"
+}
diff --git a/.gates/ECR-036-report.json b/.gates/ECR-036-report.json
new file mode 100644
index 0000000..fb50a56
--- /dev/null
+++ b/.gates/ECR-036-report.json
@@ -0,0 +1,18 @@
+{
+ "ecr": "ECR-036",
+ "result": "PASS",
+ "ess_version": "v1.0",
+ "gate_version": "0.1.2",
+ "project_profile": "unknown",
+ "checks": {
+ "artifact": true,
+ "role_boundary": true,
+ "backend_boundary": true,
+ "traceability": true,
+ "tests": true
+ },
+ "violations": [],
+ "errors": [],
+ "warnings": [],
+ "timestamp": "2026-08-07T19:16:26Z"
+}
diff --git a/.gates/ECR-037-report.json b/.gates/ECR-037-report.json
new file mode 100644
index 0000000..a40daed
--- /dev/null
+++ b/.gates/ECR-037-report.json
@@ -0,0 +1,18 @@
+{
+ "ecr": "ECR-037",
+ "result": "PASS",
+ "ess_version": "v1.0",
+ "gate_version": "0.1.2",
+ "project_profile": "unknown",
+ "checks": {
+ "artifact": true,
+ "role_boundary": true,
+ "backend_boundary": true,
+ "traceability": true,
+ "tests": true
+ },
+ "violations": [],
+ "errors": [],
+ "warnings": [],
+ "timestamp": "2026-08-07T19:16:42Z"
+}
diff --git a/.gates/ECR-038-report.json b/.gates/ECR-038-report.json
new file mode 100644
index 0000000..0f613d0
--- /dev/null
+++ b/.gates/ECR-038-report.json
@@ -0,0 +1,18 @@
+{
+ "ecr": "ECR-038",
+ "result": "PASS",
+ "ess_version": "v1.0",
+ "gate_version": "0.1.2",
+ "project_profile": "unknown",
+ "checks": {
+ "artifact": true,
+ "role_boundary": true,
+ "backend_boundary": true,
+ "traceability": true,
+ "tests": true
+ },
+ "violations": [],
+ "errors": [],
+ "warnings": [],
+ "timestamp": "2026-08-07T19:16:57Z"
+}
diff --git a/.gates/ECR-039-report.json b/.gates/ECR-039-report.json
new file mode 100644
index 0000000..b48212b
--- /dev/null
+++ b/.gates/ECR-039-report.json
@@ -0,0 +1,18 @@
+{
+ "ecr": "ECR-039",
+ "result": "PASS",
+ "ess_version": "v1.0",
+ "gate_version": "0.1.2",
+ "project_profile": "unknown",
+ "checks": {
+ "artifact": true,
+ "role_boundary": true,
+ "backend_boundary": true,
+ "traceability": true,
+ "tests": true
+ },
+ "violations": [],
+ "errors": [],
+ "warnings": [],
+ "timestamp": "2026-08-07T19:17:12Z"
+}
diff --git a/.gates/ECR-040-report.json b/.gates/ECR-040-report.json
new file mode 100644
index 0000000..51587da
--- /dev/null
+++ b/.gates/ECR-040-report.json
@@ -0,0 +1,18 @@
+{
+ "ecr": "ECR-040",
+ "result": "PASS",
+ "ess_version": "v1.0",
+ "gate_version": "0.1.2",
+ "project_profile": "unknown",
+ "checks": {
+ "artifact": true,
+ "role_boundary": true,
+ "backend_boundary": true,
+ "traceability": true,
+ "tests": true
+ },
+ "violations": [],
+ "errors": [],
+ "warnings": [],
+ "timestamp": "2026-08-07T19:20:29Z"
+}
diff --git a/apps/admin-h5/src/api/client.ts b/apps/admin-h5/src/api/client.ts
index 9ce106e..56504ac 100644
--- a/apps/admin-h5/src/api/client.ts
+++ b/apps/admin-h5/src/api/client.ts
@@ -272,8 +272,18 @@ export const adminApi = {
message_count: number
created_at: string
updated_at: string
- messages: Array<{ id: string; role: string; content: string; created_at: string }>
}>('GET', `/ask/threads/${id}`),
+ askThreadMessages: (id: string) =>
+ request<{
+ id: string
+ user_id: string
+ profile_id: string
+ scene?: string
+ message_count: number
+ created_at: string
+ updated_at: string
+ messages: Array<{ id: string; role: string; content: string; created_at: string }>
+ }>('GET', `/ask/threads/${id}/messages`),
filterRules: () =>
request<{
items: Array<{
@@ -482,7 +492,7 @@ export const adminApi = {
request
无对话原文权限(admin.ask.transcript.read)
+{{ m.content }}
diff --git a/apps/admin-h5/src/pages/CatalogHubPage.vue b/apps/admin-h5/src/pages/CatalogHubPage.vue index a8ff7b3..1b5119b 100644 --- a/apps/admin-h5/src/pages/CatalogHubPage.vue +++ b/apps/admin-h5/src/pages/CatalogHubPage.vue @@ -5,15 +5,15 @@ import { adminApi } from '@/api/client' type Row = { id: string; code?: string; slug?: string; title?: string; status?: string } const catalogs = [ - { key: 'publications', label: '定时发布', load: () => adminApi.publications() }, - { key: 'knowledgeChunks', label: '知识块', load: () => adminApi.knowledgeChunks() }, - { key: 'tools', label: '工具定义', load: () => adminApi.tools() }, - { key: 'blockPolicies', label: '拦截策略', load: () => adminApi.blockPolicies() }, - { key: 'cases', label: '审核案', load: () => adminApi.cases() }, - { key: 'events', label: '危机事件', load: () => adminApi.events() }, - { key: 'interventions', label: '干预结果', load: () => adminApi.interventions() }, - { key: 'handoffs', label: '转接案', load: () => adminApi.handoffs() }, - { key: 'privacy', label: '隐私请求', load: () => adminApi.requests() }, + { key: 'publications', label: '定时发布(目录)', load: () => adminApi.publications() }, + { key: 'knowledgeChunks', label: '知识块(目录)', load: () => adminApi.knowledgeChunks() }, + { key: 'tools', label: '工具定义(目录)', load: () => adminApi.tools() }, + { key: 'blockPolicies', label: '拦截策略(目录)', load: () => adminApi.blockPolicies() }, + { key: 'cases', label: '审核类型(目录)', load: () => adminApi.cases() }, + { key: 'events', label: '危机类型(目录)', load: () => adminApi.events() }, + { key: 'interventions', label: '干预类型(目录)', load: () => adminApi.interventions() }, + { key: 'handoffs', label: '转接类型(目录)', load: () => adminApi.handoffs() }, + { key: 'privacy', label: '隐私类型(目录)', load: () => adminApi.requests() }, { key: 'star', label: '星座配置', load: () => adminApi.starConfigs() }, { key: 'rhythm', label: '节律配置', load: () => adminApi.rhythmConfigs() }, { key: 'decks', label: '意象牌组', load: () => adminApi.imageCardDecks() }, @@ -50,7 +50,7 @@ onMounted(() => {ECR-026…040 运营只读目录聚合(不可写发布)
+ECR-026…040 运营只读目录聚合(类型占位,非用户个案;见 docs/WAVE0/CATALOG_VS_CASE.md)