@thinkingai/ae-cli 6.1.17 → 6.1.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. package/README.md +2 -0
  2. package/README.zh.md +6 -0
  3. package/dist/{auth-77BUFLGC.js → auth-QPEVVBKT.js} +20 -15
  4. package/dist/auth-UMJAA72O.js +15 -0
  5. package/dist/{capability-72DTW5M2.js → capability-ASI62I4A.js} +53 -15
  6. package/dist/{chunk-UW5UN47B.js → chunk-533JK3YX.js} +2 -0
  7. package/dist/{chunk-UOUS37JQ.js → chunk-6QK7SYYY.js} +5 -4
  8. package/dist/{chunk-TUKQZTMI.js → chunk-7K24F7T2.js} +2 -0
  9. package/dist/{chunk-OO6XR6LK.js → chunk-AMBFK2K3.js} +2 -0
  10. package/dist/{sync-DAVKYVMW.js → chunk-B5HMQAOM.js} +31 -540
  11. package/dist/{chunk-VR3LCBHW.js → chunk-DKEXH6Q5.js} +6 -5
  12. package/dist/{chunk-VTWMIC5L.js → chunk-E2JKXMVO.js} +2 -0
  13. package/dist/{chunk-LYVNONC4.js → chunk-FR2EDAQM.js} +36 -0
  14. package/dist/{chunk-ILIU36SU.js → chunk-GJXRF7Y6.js} +6 -5
  15. package/dist/{chunk-DWO43OIB.js → chunk-JQ3ENZZH.js} +2 -0
  16. package/dist/chunk-JYMGHGCE.js +191 -0
  17. package/dist/{chunk-GT46FPXN.js → chunk-KEWVSO64.js} +18 -8
  18. package/dist/chunk-KZ6ZHF5J.js +294 -0
  19. package/dist/chunk-O6K2ODUE.js +318 -0
  20. package/dist/chunk-QL6R6TSK.js +25215 -0
  21. package/dist/{chunk-4SGZG4XY.js → chunk-RWXIXOZG.js} +28 -13
  22. package/dist/{chunk-YA6SMTXG.js → chunk-S5PONFBM.js} +5 -4
  23. package/dist/{chunk-4NN5IWVN.js → chunk-T6OSFQZD.js} +2 -0
  24. package/dist/{chunk-PTE56QPL.js → chunk-TKHSULJT.js} +6 -0
  25. package/dist/{chunk-6EIJSNBD.js → chunk-Y74WTIKJ.js} +2 -0
  26. package/dist/{client-TKG4WBHN.js → client-N7NGZUNI.js} +6 -4
  27. package/dist/{community-report-client-FI4LNVYS.js → community-report-client-6OL6GBQW.js} +3 -3
  28. package/dist/{config-RE6CMGPK.js → config-XNMACCKX.js} +10 -8
  29. package/dist/{data-integration-XQYB4X4F.js → data-integration-4NZGZ45E.js} +2502 -272
  30. package/dist/index.js +137 -1245
  31. package/dist/{local-data-upload-client-BWHSUQQK.js → local-data-upload-client-EFHDLXFG.js} +3 -3
  32. package/dist/{memory-YK33G4T7.js → memory-HBJQ2GC5.js} +8 -7
  33. package/dist/{metadata-UILXHBWF.js → metadata-62EWBEIG.js} +12 -11
  34. package/dist/{model-NR3JHFSJ.js → model-BHLJ2QMT.js} +10 -9
  35. package/dist/personal-semantic-preference-JBVMAI7L.js +240 -0
  36. package/dist/project-semantic-BQ4MPUS5.js +1115 -0
  37. package/dist/sync-MUWPRM5I.js +522 -0
  38. package/dist/{te-agent-4BKBODMF.js → te-agent-WQZTMEK4.js} +12 -10
  39. package/dist/{te-analysis-O6DCO6BS.js → te-analysis-MNCG65LU.js} +534 -48
  40. package/dist/{te-community-HLC43QKH.js → te-community-BNE6KREL.js} +8 -7
  41. package/dist/{te-dataops-EJP56W3K.js → te-dataops-TXLKM2W6.js} +469 -68
  42. package/dist/{te-engage-FGBGQ4IY.js → te-engage-TPKLRVTL.js} +84 -10
  43. package/dist/{te-experiment-SO5MPDMJ.js → te-experiment-6BYKTCY7.js} +303 -12
  44. package/dist/{te-kb-SQCLHG6X.js → te-kb-BUD6N3NI.js} +312 -25
  45. package/dist/{te-system-YARIK4S5.js → te-system-44LZJDTQ.js} +573 -37
  46. package/dist/{te-team-EFKWYKMK.js → te-team-XMP47YXE.js} +10 -7
  47. package/dist/{update-OGPSZM5A.js → update-UODFOZ4P.js} +9 -7
  48. package/package.json +18 -9
  49. package/skills/ae-agent/SKILL.md +3 -4
  50. package/skills/ae-agent/references/edit-skill.md +3 -0
  51. package/skills/ae-agent/references/get-skill-content.md +1 -1
  52. package/skills/ae-agent/references/rescan-skills.md +15 -13
  53. package/skills/ae-agent/references/upload-skill.md +7 -4
  54. package/skills/ae-analysis/SKILL.md +45 -4
  55. package/skills/ae-analysis/metadata_resolution.md +38 -4
  56. package/skills/ae-analysis/references/analysis_data_retrieval.md +29 -0
  57. package/skills/ae-analysis/references/analysis_gateway_assets.md +1 -1
  58. package/skills/ae-analysis/references/asset_authentication_export.md +22 -0
  59. package/skills/ae-analysis/references/asset_authentication_list.md +18 -14
  60. package/skills/ae-analysis/references/asset_authentication_update.md +29 -14
  61. package/skills/ae-analysis/references/audience_models.md +18 -0
  62. package/skills/ae-analysis/references/command_index.md +19 -11
  63. package/skills/ae-analysis/references/dashboard_get.md +18 -1
  64. package/skills/ae-analysis/references/dashboard_update.md +3 -0
  65. package/skills/ae-analysis/references/personal_semantic_preference_add.md +23 -0
  66. package/skills/ae-analysis/references/personal_semantic_preference_delete.md +17 -0
  67. package/skills/ae-analysis/references/personal_semantic_preference_get.md +19 -0
  68. package/skills/ae-analysis/references/personal_semantic_preference_list.md +21 -0
  69. package/skills/ae-analysis/references/personal_semantic_preference_update.md +19 -0
  70. package/skills/ae-analysis/references/project_timezone_update.md +13 -4
  71. package/skills/ae-analysis/references/property_create.md +2 -0
  72. package/skills/ae-analysis/references/super_metadata_batch_create.md +2 -0
  73. package/skills/ae-analysis/references/user_cluster_models.md +2 -0
  74. package/skills/ae-analysis/references/user_cluster_update.md +8 -4
  75. package/skills/ae-analysis/references/user_tag_create.md +7 -1
  76. package/skills/ae-analysis/references/user_tag_models.md +8 -2
  77. package/skills/ae-data-integration/SKILL.md +24 -4
  78. package/skills/ae-data-integration/references/custom-layer.md +93 -0
  79. package/skills/ae-data-integration/references/error-handling.md +145 -0
  80. package/skills/ae-data-integration/references/handoff.md +77 -18
  81. package/skills/ae-data-integration/references/local-analysis.md +1 -1
  82. package/skills/ae-data-integration/references/reuse.md +9 -5
  83. package/skills/ae-data-integration/references/sink-upload.md +1 -1
  84. package/skills/ae-data-integration/references/source-inspect.md +35 -13
  85. package/skills/ae-data-integration/references/tracking-plan.md +7 -5
  86. package/skills/ae-data-integration/references/transform.md +12 -10
  87. package/skills/ae-data-integration/references/ue-mapping.md +33 -11
  88. package/skills/ae-data-integration/references/ue-routing.md +23 -0
  89. package/skills/ae-dataops/SKILL.md +11 -1
  90. package/skills/ae-dataops/references/dataops-backfill.md +135 -0
  91. package/skills/ae-engage/SKILL.md +5 -0
  92. package/skills/ae-engage/references/build-task-save-guide.md +14 -1
  93. package/skills/ae-engage/references/save-flow.md +37 -1
  94. package/skills/ae-engage/references/save-task.md +88 -0
  95. package/skills/ae-experiment/SKILL.md +14 -4
  96. package/skills/ae-experiment/references/manage_feature_whitelist.md +66 -0
  97. package/skills/ae-experiment/references/manage_guardrail_metrics.md +26 -0
  98. package/skills/ae-experiment/references/save_experiment.md +1 -1
  99. package/skills/ae-experiment/references/save_metric.md +20 -8
  100. package/skills/ae-kb/SKILL.md +121 -10
  101. package/skills/ae-project-semantic/SKILL.md +193 -0
  102. package/skills/ae-project-semantic/references/query-routing-v5.md +165 -0
  103. package/skills/ae-project-semantic/references/recommendation-quality.md +68 -0
  104. package/skills/ae-system/SKILL.md +28 -30
  105. package/skills/ae-system/references/channel-management.md +303 -0
  106. package/dist/auth-2WTQOP77.js +0 -14
  107. package/dist/capability-PJHNI4GJ.js +0 -315
  108. package/dist/chunk-4KVPKXFX.js +0 -98
  109. package/dist/chunk-C4MGVGJW.js +0 -13
  110. package/dist/chunk-P3FGXJTU.js +0 -349
  111. package/dist/chunk-QGM4M3NI.js +0 -37
  112. package/dist/chunk-RGKJGKT7.js +0 -71
  113. package/dist/chunk-SAU3QFIQ.js +0 -556
  114. package/dist/chunk-VPKZ7I72.js +0 -509
  115. package/dist/chunk-ZZUOD757.js +0 -598
  116. package/dist/memory-CHRU2F7W.js +0 -893
  117. package/dist/metadata-XXR34N5P.js +0 -339
  118. package/dist/model-K3KLWIW6.js +0 -139
  119. package/dist/sync-FCKOVWWS.js +0 -10261
  120. package/dist/te-agent-HLW4VTQK.js +0 -3893
  121. package/dist/te-analysis-ZMNGOVNW.js +0 -8958
  122. package/dist/te-community-6HPBWJUZ.js +0 -1859
  123. package/dist/te-dataops-HDRUXY4K.js +0 -2208
  124. package/dist/te-engage-RAK5PESW.js +0 -4898
  125. package/dist/te-experiment-VZF7BT6G.js +0 -770
  126. package/dist/te-system-Z77IKZFN.js +0 -2213
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: ae-kb
3
3
  version: 1.0.0
4
- description: "AE/TE knowledge base CLI manual for creating, querying, LLM-powered ask, listing accessible knowledge bases, deterministic index/grep/read retrieval, checking status, uploading, compiling, schema generation, URL sources, source deletion, and knowledge base deletion. Use when the user asks to manage TE/AE/ThinkingEngine knowledge bases, upload documents or URLs to a knowledge base, query knowledge, ask knowledge bases with an LLM, list accessible knowledge bases, inspect knowledge base indexes, search knowledge base pages, read a specific knowledge base page, check knowledge base status, generate schemas, compile knowledge, remove sources, or delete a knowledge base. To choose which knowledge base is worth searching, use the ae-kb-discovery skill first; this skill runs the retrieval once a target is chosen. Must use ae-cli kb commands and must not guess knowledge base names, scopes, page paths, source display names, JSON payload shapes, or URL formats."
4
+ description: 'AE/TE knowledge base CLI manual for creating, importing read-only compiled snapshots, querying, LLM-powered ask, listing accessible knowledge bases and their sources, deterministic index/grep/read retrieval, checking status, uploading, compiling, schema generation, URL sources, source deletion, and knowledge base deletion. Use when the user asks to manage TE/AE/ThinkingEngine knowledge bases, import a compiled Markdown ZIP snapshot, upload documents or URLs to a knowledge base, query knowledge, ask knowledge bases with an LLM, list accessible knowledge bases or source metadata, inspect knowledge base indexes, search knowledge base pages, read a specific knowledge base page, check knowledge base status, generate schemas, compile knowledge, remove sources, or delete a knowledge base. To choose which knowledge base is worth searching, use the ae-kb-discovery skill first; this skill runs the retrieval once a target is chosen. Must use ae-cli kb commands and must not guess knowledge base names, scopes, page paths, source IDs, source display names, JSON payload shapes, or URL formats.'
5
5
  ---
6
6
 
7
7
  # ae-kb
@@ -14,11 +14,11 @@ ae-cli kb +<command> [options]
14
14
 
15
15
  ## Global Rules
16
16
 
17
- - Use this skill for TE/AE knowledge base tasks: create, query, ask with LLM, list accessible knowledge bases, inspect indexes, grep pages, read pages, check status, upload sources, add URL sources, generate schema, compile, remove source files, and delete knowledge bases.
17
+ - Use this skill for TE/AE knowledge base tasks: create, import a compiled snapshot, query, ask with LLM, list accessible knowledge bases and their sources, inspect indexes, grep pages, read pages, check status, upload sources, add URL sources, generate schema, compile, remove source files, and delete knowledge bases.
18
18
  - **Searching a knowledge base for an answer is the most common task. If that is what you are doing, go straight to [Explore Knowledge Base Pages](#explore-knowledge-base-pages) and read [`references/query-workflow.md`](references/query-workflow.md) first — it is the retrieval procedure. The other commands below are for managing knowledge bases, not answering from them.**
19
19
  - Read operations can run directly after required inputs are known. Write operations require explicit user intent and normally keep the confirmation prompt unless the user asks to bypass it.
20
20
  - Prefer `--dry-run` before destructive or broad writes when the user has not already validated the target.
21
- - Do not invent knowledge base names, scopes, source display names, or JSON payloads. Ask the user or query known context when values are missing.
21
+ - Do not invent knowledge base names, scopes, source IDs, source display names, or JSON payloads. Ask the user or query known context when values are missing.
22
22
  - When building a `--sources` ref (or `+read --source`), copy the exact `scope` and `name` from `+list` output — run `ae-cli kb +list` first when the scope of a named knowledge base is unknown.
23
23
  - JSON flags must be valid JSON strings, usually wrapped in single quotes in shell commands.
24
24
  - Successful commands return JSON by default. Use `--format table` only when a table is easier for a human to scan. Envelope may include optional `_notice.host_compat`.
@@ -33,16 +33,19 @@ ae-cli kb +<command> [options]
33
33
  | `+ask` | read | LLM-powered Q&A over knowledge bases; for multi-page synthesis or multi-hop questions. |
34
34
  | `+ask-status` | read | Query the current status of an ask execution by `--execution-id` without polling. |
35
35
  | `+list` | read | List accessible knowledge bases filtered by buildStatus (default: compiled). |
36
+ | `+list-sources` | read | List source metadata for one knowledge base so exact source identifiers can be discovered safely. |
36
37
  | `+index` | read | List accessible knowledge bases and their `index.md` navigation maps. |
37
38
  | `+grep` | read | Keyword-search knowledge base pages and return matched lines with context. |
38
39
  | `+read` | read | Read a full knowledge base page, a line window, or (with `--outline`) only the page heading tree. |
39
40
  | `+new` | write | Create a new personal or company knowledge base. |
41
+ | `+import` | write | Import a compiled Markdown ZIP as a personal read-only snapshot. |
42
+ | `+import-status` | read | Query one snapshot import task by `--request-id` without polling. |
40
43
  | `+add` | write | Upload local files, a non-recursive directory, or HTTP(S) pages converted to markdown. |
41
44
  | `+url` | write | Upload a URL source directly with optional display name and parsing instruction. |
42
45
  | `+schema` | write | Generate the compile schema for a knowledge base. |
43
46
  | `+compile` | write | Compile a knowledge base in incremental or full mode. |
44
47
  | `+status` | read | Query the current status of a knowledge base. |
45
- | `+rm-source` | write | Delete one source file from a knowledge base by display name. |
48
+ | `+rm-source` | high-risk-write | Delete one source from a knowledge base by stable ID; exact display name is legacy compatibility only. |
46
49
  | `+remove` | write | Delete an entire knowledge base. |
47
50
 
48
51
  ## Common Workflows
@@ -67,6 +70,36 @@ Optional fields:
67
70
  - `--project-id`: optional project ID to bind.
68
71
  - `--project-name`: optional project display name.
69
72
 
73
+ ### Import a Compiled Snapshot
74
+
75
+ Use `+import` only for a ZIP whose root contains `index.md` and at least one
76
+ `wiki/**/*.md` page. The server validates all archive paths, limits, UTF-8 text, and Wiki links.
77
+
78
+ ```bash
79
+ ae-cli kb +import \
80
+ --file ./knowledge-base.zip \
81
+ --name "Imported handbook" \
82
+ --description "Compiled documentation snapshot" \
83
+ --tags '["docs","handbook"]'
84
+
85
+ # The submission returns requestId + queued. Query one snapshot later:
86
+ ae-cli kb +import-status --request-id <requestId>
87
+ ```
88
+
89
+ - The result is always a `personal` read-only snapshot; there is no `--scope`, `--force`, or replace option.
90
+ - Imported snapshots support list, Index/Wiki reading, grep/read, Ask, and deletion. They do not expose source, Schema, usage, compile, member, settings, ownership-transfer, or company-publish operations.
91
+ - The ZIP is limited to 50 MB and supports Markdown text only. Local images, attachments, other binaries, broken Wiki links, and ambiguous Wiki links are rejected by the server.
92
+ - Submission returns `{requestId, status: "queued"}` immediately. It does not wait for ZIP validation or publication.
93
+ - `+import-status` returns one of `queued`, `running`, `succeeded`, or `failed`; success includes `knowledgeBaseId`, and failure includes a stable error code/message.
94
+ - If a `requestId` was returned, query it before retrying. If no request ID was received, run `ae-cli kb +list` before retrying the same name. A repeated same-name import is rejected.
95
+
96
+ - Transition status: transitional
97
+ - Owning module: te-claude External Knowledge Base Import API
98
+ - Current transport: authenticated KB external REST through `kbUpload` for submission and `kbApi` for status lookup.
99
+ - Gateway target: TBD (`kb.snapshot.import` proposed)
100
+ - Review after: 2026-12-01
101
+ - Exit condition: migrate to a typed Gateway capability when the equivalent multipart import capability is available, or remove this command if dynamic Gateway execution provides the same file-handling and output contract.
102
+
70
103
  ### Upload Files or Directories
71
104
 
72
105
  Use `+add` when sources are local files, local directories, or pages that should be fetched and converted to markdown before upload.
@@ -97,7 +130,7 @@ ae-cli kb +url \
97
130
  --parse-instruction "Keep headings and code blocks"
98
131
  ```
99
132
 
100
- `--url` must be `http(s)`.
133
+ `--url` must be `http(s)`. The server detects the platform from the URL automatically: URLs on a `*.feishu.cn` or `*.larksuite.com` subdomain are parsed with the Feishu pipeline (including sub-documents, using the server's own Feishu parsing instruction — `--parse-instruction` is ignored for them); all other URLs are fetched as regular web pages.
101
134
 
102
135
  ### Generate Schema and Compile
103
136
 
@@ -107,7 +140,17 @@ Generate the schema first when the knowledge base needs a compile schema.
107
140
  ae-cli kb +schema --name engineering-handbook
108
141
  ```
109
142
 
110
- Use `--force` only to recover a stuck `generating` status. Use `--model` only when the user provides the model display name.
143
+ Use `--force` only when `+status` reports `schema_generating` and the user explicitly wants to replace the current generation attempt. The replacement may consume additional tokens. Use `--model` only when the user provides the model display name.
144
+
145
+ To add one-time guidance for this generation without changing stored knowledge base metadata, pass `--custom-instructions`. The server trims the value, treats whitespace-only input as absent, and accepts up to 10,000 Unicode characters. Do not include secrets or credentials.
146
+
147
+ ```bash
148
+ ae-cli kb +schema \
149
+ --name engineering-handbook \
150
+ --custom-instructions "Prioritize troubleshooting workflows and preserve command examples"
151
+ ```
152
+
153
+ Use `--dry-run` to inspect the request body before sending it. While generation is running, a request without `--force` is idempotent only when it supplies no new model or effective custom instructions; otherwise it fails with `KB_SCHEMA_GENERATION_IN_PROGRESS`. With `--force`, the selected model and custom instructions apply to the replacement attempt. Invalid text fails with `KB_SCHEMA_CUSTOM_INSTRUCTIONS_INVALID`.
111
154
 
112
155
  Compile after sources and schema are ready:
113
156
 
@@ -213,9 +256,34 @@ ae-cli kb +read \
213
256
  --limit 60
214
257
  ```
215
258
 
259
+ ### List Sources
260
+
261
+ List sources first to discover the stable identifier for the intended source:
262
+
263
+ ```bash
264
+ ae-cli kb +list-sources --name engineering-handbook
265
+ ```
266
+
267
+ Copy the exact `id` from the response into `+rm-source`. Do not guess a source ID from a local filename, URL, display name, or an older upload response.
268
+
269
+ - Transition status: transitional
270
+ - Owning module: te-claude External Knowledge Base Sources API
271
+ - Current transport: authenticated KB external REST through `kbApi`.
272
+ - Gateway target: TBD (`kb.source.list` proposed)
273
+ - Review after: 2026-12-03
274
+ - Exit condition: migrate to a typed Gateway capability when an equivalent source-list capability is available, or remove this command if dynamic Gateway execution provides the same discoverability and safe output contract.
275
+
216
276
  ### Remove One Source
217
277
 
218
- Use `+rm-source` only when the source display name is known exactly.
278
+ Use `+rm-source --id` with the exact ID returned by the current `+list-sources` response. This is a `high-risk-write`; keep the interactive confirmation unless the user has explicitly authorized `--yes`.
279
+
280
+ ```bash
281
+ ae-cli kb +rm-source \
282
+ --name engineering-handbook \
283
+ --id cm-source-id
284
+ ```
285
+
286
+ `--display-name` is retained for legacy compatibility only when a stable source ID is unavailable:
219
287
 
220
288
  ```bash
221
289
  ae-cli kb +rm-source \
@@ -223,7 +291,7 @@ ae-cli kb +rm-source \
223
291
  --display-name kb-1780046712-guide.md
224
292
  ```
225
293
 
226
- If the user only gives a loose source name, do not guess. Ask for the exact uploaded display name.
294
+ If the user only gives a loose source name, do not guess a source ID. Run `+list-sources`, identify the intended row from returned metadata, and ask only when multiple rows remain ambiguous.
227
295
 
228
296
  ### Delete a Knowledge Base
229
297
 
@@ -316,6 +384,30 @@ ae-cli kb +new --name "<name>" [--scope personal|company] [--description "..."]
316
384
  ae-cli kb +add --name "<name>" --files '["./a.md","./docs","https://example.com/page"]'
317
385
  ```
318
386
 
387
+ ### `+import`
388
+
389
+ ```bash
390
+ ae-cli kb +import --file "./knowledge-base.zip" --name "<name>" [--description "..."] [--tags '["t1","t2"]'] [--project-id "..."]
391
+ ```
392
+
393
+ - `--file`: required local `.zip` file.
394
+ - `--name`: required personal knowledge-base name, up to 30 characters.
395
+ - `--description`: optional, up to 200 characters.
396
+ - `--tags`: optional JSON array, max 2 unique tags, each up to 15 characters.
397
+ - `--project-id`: optional project binding.
398
+ - Scope and terminal build state are generated by the server and cannot be supplied by the client.
399
+ - Output: `{requestId, status: "queued"}`. Use `+import-status`; the command does not poll.
400
+
401
+ ### `+import-status`
402
+
403
+ ```bash
404
+ ae-cli kb +import-status --request-id <requestId>
405
+ ```
406
+
407
+ - `--request-id`: required ID returned by `+import`.
408
+ - Output: `{requestId, status, knowledgeBaseId?, errorCode?, errorMessage?}`.
409
+ - Returns a single snapshot and does not poll. A failed import is returned as `status: "failed"` with its stable error code/message; an unknown or inaccessible request exits non-zero.
410
+
319
411
  ### `+url`
320
412
 
321
413
  ```bash
@@ -325,9 +417,14 @@ ae-cli kb +url --name "<name>" --url "https://example.com/page" [--display-name
325
417
  ### `+schema`
326
418
 
327
419
  ```bash
328
- ae-cli kb +schema --name "<name>" [--force] [--model "<model displayName>"]
420
+ ae-cli kb +schema --name "<name>" [--force] [--model "<model displayName>"] [--custom-instructions "<one-time guidance>"]
329
421
  ```
330
422
 
423
+ - `--custom-instructions`: Optional per-run schema-generation guidance. It is not persisted; whitespace-only input is omitted. The server allows at most 10,000 Unicode characters and rejects disallowed control characters. Do not include secrets or credentials.
424
+ - `--force`: Replace the current attempt only when schema generation is already running and the user explicitly requests the replacement. The selected model and custom instructions apply to the new attempt, which may consume additional tokens.
425
+ - `--dry-run`: Shows the same `customInstructions` request field that execution will send.
426
+ - Errors: `KB_SCHEMA_CUSTOM_INSTRUCTIONS_INVALID` means the field failed validation. `KB_SCHEMA_GENERATION_IN_PROGRESS` means generation is active and a request without `--force` supplied a new model or effective custom instructions.
427
+
331
428
  ### `+compile`
332
429
 
333
430
  ```bash
@@ -340,12 +437,26 @@ ae-cli kb +compile --name "<name>" [--mode incremental|full]
340
437
  ae-cli kb +status --name "<name>"
341
438
  ```
342
439
 
440
+ ### `+list-sources`
441
+
442
+ ```bash
443
+ ae-cli kb +list-sources --name "<name>"
444
+ ```
445
+
446
+ - `--name`: required knowledge base name.
447
+ - Output: Safe source metadata including the stable `id` needed by `+rm-source`; raw paths, hashes, credentials, and source content are not returned.
448
+ - Copy the exact `id` from the current response before deleting a source; never guess it.
449
+
343
450
  ### `+rm-source`
344
451
 
345
452
  ```bash
346
- ae-cli kb +rm-source --name "<name>" --display-name "<uploaded source display name>"
453
+ ae-cli kb +rm-source --name "<name>" --id "<source-id>"
347
454
  ```
348
455
 
456
+ - `--id`: preferred stable source identifier copied from `+list-sources`.
457
+ - `--display-name`: legacy compatibility selector used only when an ID is unavailable.
458
+ - If both are supplied, `--id` wins. The command removes one source only.
459
+
349
460
  ### `+remove`
350
461
 
351
462
  ```bash
@@ -0,0 +1,193 @@
1
+ ---
2
+ name: ae-project-semantic
3
+ description: "Use when generating, testing, submitting, reviewing, or publishing governed project semantic candidates from AE/TE project asset packages. This skill owns progressive asset-scope consent, recommendation quality gates, evidence authority, topic-domain grouping, candidate JSON generation, CLI closed-loop validation, and frontend review acceptance. Do not use it for ordinary analysis questions that only consume already published semantics."
4
+ ---
5
+
6
+ # ae-project-semantic
7
+
8
+ Project semantics are governed L2 project-wide business concepts, rules, calculation conventions, and default asset-selection methods. They sit above dashboards and reports. Dashboards, reports, events, properties, and metrics are L1 evidence and execution assets; they are not project semantics by themselves.
9
+
10
+ Use `ae-cli` only. Do not write the database directly for recommendations, approvals, or releases.
11
+
12
+ ## Boundary
13
+
14
+ - Use this skill to generate or evaluate project semantic recommendations.
15
+ - Use `ae-analysis` to consume already published project semantics during analysis tasks.
16
+ - Frontend can review, edit, approve, reject, and publish candidates; it must not generate recommendations.
17
+ - Start with governed authenticated dashboards/reports. Broader project assets may be inspected only after explicit user consent and must retain their lower authority in evidence and confidence. Events, properties, metrics, background documents, and notes can provide supporting evidence only, never the primary L2 candidate subject.
18
+
19
+ ## Required Workflow
20
+
21
+ 1. Resolve the project and host.
22
+ 2. Read both recommendation references before inspecting candidates:
23
+ - [`references/recommendation-quality.md`](references/recommendation-quality.md) for the governed L2 quality bar;
24
+ - [`references/query-routing-v5.md`](references/query-routing-v5.md) for the current query-routing, recall-shortcut, and analysis-playbook discovery protocol.
25
+ 3. Check existing published project semantics:
26
+
27
+ ```bash
28
+ ae-cli project-semantic list --project-id <project_id>
29
+ ```
30
+
31
+ 4. Export governed authenticated project assets and semantic snapshot context by default:
32
+
33
+ ```bash
34
+ ae-cli project-semantic asset-package export --project-id <project_id> --asset-scope governed --output <tmp>/project-semantic-assets --force
35
+ ```
36
+
37
+ When `--host` points directly to a locally started Common service instead of the deployed analysis gateway, scope the empty gateway domain to that command so the request uses Common's native `/api/cli/v1` route. Do not export this override globally:
38
+
39
+ ```bash
40
+ AE_CLI_CAPABILITY_GATEWAY_DOMAIN= ae-cli project-semantic asset-package export --project-id <project_id> --asset-scope governed --output <tmp>/project-semantic-assets --force --host http://127.0.0.1:8992
41
+ ```
42
+
43
+ 5. Inspect `asset_scope`, `exported_asset_count`, `authenticated_asset_count`, `unauthenticated_asset_count`, `truncated`, work-unit count, and definition-family count before scanning. If `truncated=true`, warn that the package hit a compatibility limit. If the governed package is too sparse to support useful problem frames, report the actual counts and ask whether to re-export active collaborative assets. Do not broaden automatically:
44
+
45
+ ```bash
46
+ ae-cli project-semantic asset-package export --project-id <project_id> --asset-scope collaborative --output <tmp>/project-semantic-assets --force
47
+ ```
48
+
49
+ If that package is still too sparse, report its counts and ask separately whether to export all valid project dashboards/reports and their referenced metadata:
50
+
51
+ ```bash
52
+ ae-cli project-semantic asset-package export --project-id <project_id> --asset-scope all_visible --output <tmp>/project-semantic-assets --force
53
+ ```
54
+
55
+ `governed` is authenticated + collaborative + active in the recent 90-day window. `collaborative` removes only the authentication requirement. `all_visible` removes authentication, collaboration, and recency filters while still excluding deleted, frozen, hidden, offline, or otherwise invalid assets. Export is project-administrator-only; no per-user visibility filtering is required inside `all_visible`. Asset authentication is a separate governance write and must never be changed implicitly by scanning.
56
+
57
+ 6. Read the package in this order:
58
+ - `manifest.json`, `.asset-package.json`, `catalog/published.jsonl`, `catalog/disabled.jsonl` when present, `catalog/active-candidates.jsonl`, and `catalog/rejected-candidates.jsonl` to build the exclusion and revision context;
59
+ - `indexes/work-units.jsonl` as the dashboard-first investigation queue, preserving its usage-priority order while rotating across distinct business themes;
60
+ - `indexes/definition-families.jsonl` and compact dashboard/report records to compare reusable definition variants;
61
+ - `indexes/asset-directory.jsonl` and `indexes/governance-coverage.jsonl` for supporting evidence;
62
+ - `details/normalized/**` only for candidate-bearing or conflicting families, and `details/raw/**` only when the normalized definition is insufficient.
63
+
64
+ The service owns deterministic parsing, key-field normalization, definition signatures, usage ordering, and catalog assembly. The Agent owns business topic discovery, evidence interpretation, counterexample review, and candidate wording. Display names, descriptions, and notes remain evidence for interpretation, but they never make two otherwise identical definitions distinct. Do not load every detail file into context up front or delegate business judgment to a project-specific keyword table or deterministic template generator.
65
+
66
+ 7. Compare the proposed behavior against published, disabled, active-candidate, and rejected catalogs. Disabled semantics are suppression context: do not consume, recreate, or update them through recommendation generation. A project administrator can explicitly enable them later. Produce `CREATE` only for a genuinely new semantic, `UPDATE` when an active semantic needs a material revision, and no candidate when the package is already covered. Zero new candidates is a valid successful recommendation result.
67
+
68
+ 8. Validate the Agent-authored file against the exact exported package. This command checks only deterministic contract rules such as required fields, supported enums, catalog conflicts, duplicate fingerprints, and resolvable evidence references. `passed=true` is not a semantic-quality approval:
69
+
70
+ ```bash
71
+ ae-cli project-semantic candidate validate --asset-package <tmp>/project-semantic-assets --submit-file <tmp>/project-semantic-candidates.json
72
+ ```
73
+
74
+ 9. Perform a separate Agent quality-review pass over the unchanged candidate file and the evidence it cites. Apply the Hard Quality Bar and `references/recommendation-quality.md`; do not rely on the generation pass to approve its own wording. For every candidate, record `PASS`, `REVISE`, or `INSUFFICIENT_EVIDENCE` with concrete findings and evidence references. Revise and repeat both deterministic validation and Agent review until every submitted candidate is `PASS`. A successful empty recommendation is preferable to weak filler.
75
+
76
+ 10. Submit the unchanged validated and Agent-reviewed file. Use `.asset-package.json.snapshot_hash`, or the `snapshot_hash` returned by `candidate validate`:
77
+
78
+ ```bash
79
+ ae-cli project-semantic candidate submit --project-id <project_id> --submit-file <tmp>/project-semantic-candidates.json --snapshot-hash <snapshot_hash>
80
+ ```
81
+
82
+ 11. Review and enable through CLI when validating the full closed loop:
83
+
84
+ ```bash
85
+ ae-cli project-semantic candidate list --project-id <project_id>
86
+ ae-cli project-semantic candidate get --project-id <project_id> --candidate-id <candidate_id>
87
+ ae-cli project-semantic candidate enable --project-id <project_id> --candidate-ids '["candidate_1"]'
88
+ ae-cli project-semantic get --project-id <project_id> --id <semantic_id> --mark-used
89
+ ```
90
+
91
+ Lifecycle management is deliberately separate from recommendation review:
92
+
93
+ ```bash
94
+ ae-cli project-semantic disable --project-id <project_id> --semantic-id <semantic_id> --expected-version <version> --reason <reason>
95
+ ae-cli project-semantic list --project-id <project_id> --status disabled
96
+ ae-cli project-semantic delete-impact --project-id <project_id> --semantic-id <semantic_id>
97
+ ae-cli project-semantic delete --project-id <project_id> --semantic-id <semantic_id> --expected-version <version> --reason <reason>
98
+ ae-cli project-semantic enable --project-id <project_id> --semantic-id <semantic_id> --expected-version <version> --reason <reason>
99
+ ```
100
+
101
+ Disable means “do not consume and do not recommend again.” From disabled state, either enable the same semantic or inspect impact and physically delete it. Physical deletion means the semantic is absent and may be rediscovered by a future scan. Never delete merely to regenerate recommendations.
102
+
103
+ ## Hard Quality Bar
104
+
105
+ A candidate file is not acceptable unless all of these are true:
106
+
107
+ - It starts from governed evidence, or records the explicitly approved broader scope and lowers confidence for claims that depend on unauthenticated assets.
108
+ - It groups by L2 business topic domain before generating candidates.
109
+ - Every topic group includes the submit-contract fields `topic_domain_key`, `topic_domain_title`, `topic_group_key`, and `topic_group_title`.
110
+ - It does not create one candidate per asset.
111
+ - It does not promote an event/property/metric name into a project semantic title.
112
+ - Each candidate binds `resource_refs` with real asset names/types/ids or names from the package.
113
+ - Each candidate explains what it means, where it applies, how to use it, and what it excludes.
114
+ - Each candidate body covers business definition, applicable questions, decision or calculation rules, Agent usage, and boundaries or exceptions in the project's natural language. Exact headings are not a machine contract.
115
+ - The concrete business judgment belongs in the decision or calculation content; asset names and counts belong in `resource_refs`, `evidence`, and `recommendation_reason`, not in the semantic body.
116
+ - A batch fails review when candidates reuse the same body with only asset names or counts changed.
117
+ - Each candidate includes evidence excerpts or source titles that show why it was recommended.
118
+ - Each candidate changes how the Agent interprets a business question, selects default assets, or applies a project-wide rule.
119
+ - Each candidate declares one of the evidence-backed recommendation kinds in `query-routing-v5.md`: `QUERY_ROUTING`, `RECALL_SHORTCUT`, or `ANALYSIS_PLAYBOOK`.
120
+ - A formula, threshold, state, event, property, report, or asset name is supporting L1 evidence, never a standalone candidate.
121
+ - A route must contain a meaningful asset-choice branch; a shortcut must contain a minimal bundle plus stop and fallback; a playbook must be note-backed or explicitly labeled as a structure-inferred recommended path.
122
+ - Existing published and disabled semantics are checked before submission; disabled semantics suppress recreation.
123
+ - An unauthenticated asset may support a route, shortcut, or playbook only when definitions, work-unit structure, usage, or notes provide corroboration. Never present it as a certified project rule solely because it was exported.
124
+ - Sparse evidence is either skipped or marked lower confidence; do not inflate weak recommendations.
125
+
126
+ ## Generic Extraction Protocol
127
+
128
+ The protocol must work unchanged for games, retail, finance, SaaS, operations, and unknown project domains.
129
+
130
+ 1. Inventory evidence without deciding themes. Separate authenticated and unauthenticated dashboards/reports, record the export scope and selection reason, and keep existing governed semantics and supporting L1 metadata distinct.
131
+ 2. Discover semantic families only from evidence that was actually read. Use these cross-domain dimensions as questions, not as prefilled answers:
132
+ - business object, state, and alias;
133
+ - analysis subject and deduplication grain;
134
+ - measure, aggregation, numerator, denominator, and transformation;
135
+ - inclusion, exclusion, and filter scope;
136
+ - query range, cohort window, observation window, and freshness;
137
+ - unit, currency, normalization, and attribution;
138
+ - default asset selection and relationships between assets;
139
+ - applicability, exception, and conflict boundaries.
140
+ 3. Compare definition variants inside each family. A candidate may state a default only when evidence shows one authoritative variant. Conflicting variants require a disambiguation rule or a warning, not an invented standard.
141
+ 4. Form a topic domain after the semantic families are understood. The domain title must come from the project's natural business language and explain why its candidates are reviewed together.
142
+ 5. Generate a candidate only when removing it would make a future Agent more likely to choose the wrong business object, asset, grain, formula, scope, unit, window, or exception.
143
+ 6. For every claim in the body, identify direct supporting evidence. Keep asset names and excerpts in `resource_refs`, `evidence`, and `recommendation_reason`; keep reusable business knowledge in `content`.
144
+ 7. Compare candidates by resulting Agent behavior. Merge candidates that lead to the same interpretation and execution; split candidates that answer independently searchable questions.
145
+ 8. Run a counterexample pass: inspect minority definitions and assets that may violate the proposed rule. Narrow or drop unsupported conclusions.
146
+ 9. Before wording candidates, form evidence-backed problem frames and assign asset roles. Use `query-routing-v5.md`; do not optimize for candidate count or one-candidate-per-asset coverage.
147
+ 10. Keep a decision ledger for discovered problem frames, including routed, shortcut, playbook, definition-only, and evidence-insufficient dispositions.
148
+
149
+ ## Anti-Overfitting Rule
150
+
151
+ - Never encode a customer, project name, project ID, asset ID, expected topic title, expected candidate title, or expected candidate count in this skill or CLI generation code.
152
+ - Never start from a fixed industry taxonomy or keyword dictionary. Keywords may locate evidence only after a semantic family is discovered; they must not determine the result.
153
+ - A test package is an evaluation sample, not a source of reusable rules. Tune the protocol only when the change is defensible across unrelated domains.
154
+ - Quality is measured by evidence support and changed Agent behavior, not by matching a previously approved list of topics.
155
+
156
+ ## User-Facing Recommendation Display
157
+
158
+ When showing CLI recommendation results to a user, never flatten candidates into a single numbered list. The user-facing answer must use the same hierarchy as the candidate JSON and frontend review UI:
159
+
160
+ ```text
161
+ Project semantic recommendation scan completed
162
+
163
+ Summary:
164
+ - Topic domains: <N>
165
+ - Candidate semantics: <N>
166
+ - Validation: passed | failed
167
+
168
+ Topic domain: <topic_domain_title> (<candidate_count> semantics)
169
+ - [<semantic_type>] <candidate title>
170
+ <one-sentence summary>
171
+ Evidence: <asset title 1>, <asset title 2>, ...
172
+ ```
173
+
174
+ Rules:
175
+
176
+ - Show topic domains first, then candidates under each domain.
177
+ - Include each domain's semantic count.
178
+ - Include each candidate's semantic type, title, short summary, and primary evidence asset titles.
179
+ - If the CLI command returns `topic_groups`, use that field directly for the display order and counts.
180
+ - Keep the full JSON path or submit command separate from the human summary.
181
+ - Do not present a flat list like `1. semantic A 2. semantic B ...` unless the user explicitly asks for raw candidate order.
182
+
183
+ ## Output Discipline
184
+
185
+ When reporting recommendation results, include:
186
+
187
+ - commands run;
188
+ - asset scope, exported/authenticated/unauthenticated asset counts, and snapshot hash;
189
+ - topic domains, semantic counts per domain, and candidate titles grouped under each domain;
190
+ - evidence assets per candidate;
191
+ - quality warnings, if any;
192
+ - problem-frame coverage and rejected shallow-opportunity warnings;
193
+ - submit/review/release IDs after writes.
@@ -0,0 +1,165 @@
1
+ # Project Semantic Query Routing V5
2
+
3
+ Use this protocol when project asset packages contain asset definitions, work-unit membership, recent usage, authentication provenance, and optional notes, but do not contain historical user questions, query failures, or execution traces. Never claim that a structure-inferred path is a proven historical best practice.
4
+
5
+ The only recommendation kinds are:
6
+
7
+ - `QUERY_ROUTING`: choose the right dashboard/report for a question and distinguish nearby assets;
8
+ - `RECALL_SHORTCUT`: reduce broad asset search to a minimal ordered bundle with stop and fallback conditions;
9
+ - `ANALYSIS_PLAYBOOK`: execute a multi-step or branching analysis path supported by notes or strong complementary asset structure.
10
+
11
+ Submission semantic types remain unchanged: routing and shortcuts normally use `asset_semantics`; playbooks normally use `business_rule`.
12
+
13
+ ## Evidence roles
14
+
15
+ - Dashboard/report membership and work units show which assets jointly address a problem.
16
+ - Normalized/raw definitions determine what each asset computes, filters, groups, and returns.
17
+ - Display names, descriptions, notes, and dashboard memo text explain intended questions and explicit instructions, but never make otherwise identical definitions different.
18
+ - Recent usage and recency may prioritize a default entry among otherwise suitable assets; they never establish a formula, causal rule, or business priority.
19
+ - Definition families and conflicts distinguish alternatives, duplicates, misleading titles, and exception variants.
20
+ - Published, active, and rejected catalogs provide exclusion and revision context.
21
+
22
+ ## Discover problem frames before candidates
23
+
24
+ For every inspected work unit, create zero or more evidence-backed `problem_frames`. Do not require every work unit or asset to produce a candidate. Each frame records:
25
+
26
+ - natural-language problem intent;
27
+ - triggers and constraints;
28
+ - business object and expected answer grain;
29
+ - available assets and their roles;
30
+ - decision points that change asset choice;
31
+ - explicit note/memo guidance, when present;
32
+ - usage/recency priority;
33
+ - evidence gaps.
34
+
35
+ Assign relevant assets one of these roles for the frame:
36
+
37
+ - `DEFAULT_OVERVIEW`;
38
+ - `CONDITIONAL_BRANCH`;
39
+ - `DETAIL_DRILLDOWN`;
40
+ - `COMPARISON_OR_COUNTEREXAMPLE`;
41
+ - `FALLBACK`;
42
+ - `UNSUITABLE_FOR_FRAME`.
43
+
44
+ An asset may have different roles in different frames. Every role assignment must cite exact definition or note evidence.
45
+
46
+ ## QUERY_ROUTING gate
47
+
48
+ Generate only when all are true:
49
+
50
+ 1. At least two plausible assets could be confused or selected for related questions.
51
+ 2. Object, grain, formula, scope, time, parameter, or output differences determine the correct asset.
52
+ 3. The candidate states:
53
+ - triggering question types;
54
+ - default asset or entry dashboard;
55
+ - branch conditions and target assets;
56
+ - assets that must not substitute for one another;
57
+ - required parameters or filters;
58
+ - drilldown and fallback.
59
+ 4. Removing the route would materially increase wrong-asset selection.
60
+
61
+ A formula may explain why a branch is selected, but it is not a routing semantic by itself.
62
+
63
+ ## RECALL_SHORTCUT gate
64
+
65
+ Generate only when all are true:
66
+
67
+ 1. A broad work unit contains more assets than a recurring query needs.
68
+ 2. Evidence supports a minimal ordered subset.
69
+ 3. The candidate states the first asset, continuation conditions, stop condition, safe fallback, and unrelated asset groups that can be skipped.
70
+ 4. Usage may prioritize between evidence-equivalent suitable entries, but cannot override definition fit.
71
+ 5. Search-space reduction is stated from package membership only; never claim measured latency improvement without runtime evidence.
72
+
73
+ ## ANALYSIS_PLAYBOOK gate
74
+
75
+ ### High-confidence playbook
76
+
77
+ Requires an explicit note or memo stating an analysis goal, sequence, decision, or caveat, plus executable assets supporting the steps. If any required asset is unauthenticated, label the playbook lower confidence and require project-administrator review; do not present the path as certified.
78
+
79
+ ### Medium-confidence recommended analysis path
80
+
81
+ Allowed without explicit notes only when all are true:
82
+
83
+ - at least three complementary roles form an overview-to-branch-to-drilldown or measure-to-diagnose-to-verify path;
84
+ - exact definitions establish branch conditions and prevent interchangeable use;
85
+ - no causal claim, business priority, or mandatory sequence is invented;
86
+ - the output is labeled `RECOMMENDED_ANALYSIS_PATH`;
87
+ - boundaries state that the path is structurally inferred and requires review.
88
+
89
+ Reject paths supported only by co-location, similar titles, independent metrics, or usage ranking.
90
+
91
+ ## Reject shallow candidates
92
+
93
+ Reject a candidate that only provides:
94
+
95
+ - one formula, threshold, state, event, property, report, dashboard, or asset name;
96
+ - an inventory of related assets;
97
+ - a topic summary without asset-choice decisions;
98
+ - a broad umbrella listing measures without branches;
99
+ - an inferred maturity hierarchy, causal explanation, or best practice absent from notes;
100
+ - a route that does not reduce ambiguity or search.
101
+
102
+ Simple formulas and states remain evidence inside routes and playbooks. They do not become standalone project semantics.
103
+
104
+ ## Candidate fields
105
+
106
+ In addition to the governed submission fields, retain:
107
+
108
+ - `candidate_kind`;
109
+ - `problem_triggers`;
110
+ - `default_route`;
111
+ - `branch_rules`;
112
+ - `do_not_use`;
113
+ - `drilldown_path`;
114
+ - `fallback`;
115
+ - `asset_roles`;
116
+ - `search_space_reduction`;
117
+ - `evidence_strength`: `HIGH_NOTE_BACKED` or `MEDIUM_STRUCTURE_BACKED`;
118
+ - `confidence_limit`;
119
+ - `problem_frame_ids`.
120
+
121
+ The candidate body must cover business definition, applicable questions, decision or calculation rules, Agent usage, and boundaries or exceptions. Use headings natural to the project's language when headings improve readability; exact localized wording is not part of the machine contract.
122
+
123
+ Reusable decision knowledge belongs in `content`. Asset names, ids, counts, and excerpts belong in route fields, `resource_refs`, `evidence`, and `recommendation_reason`.
124
+
125
+ ## Decision ledger
126
+
127
+ When producing recommendation artifacts, record:
128
+
129
+ - work units and notes actually inspected;
130
+ - discovered problem frames;
131
+ - asset-role assignments and evidence;
132
+ - routing/shortcut/playbook decisions;
133
+ - rejected shallow opportunities and reasons;
134
+ - candidate-to-frame mappings;
135
+ - dispositions: `ROUTED`, `SHORTCUT`, `PLAYBOOK`, `DEFINITION_ONLY`, or `EVIDENCE_INSUFFICIENT`.
136
+
137
+ Coverage is measured over supported problem frames, not raw asset or definition-signature counts. Every discovered frame needs a disposition, but not every work unit or asset needs a candidate.
138
+
139
+ ## Acceptance
140
+
141
+ Candidate count and average prose score are not success metrics. Evaluate with evidence-grounded future-query probes and report:
142
+
143
+ - primary asset or entry selection;
144
+ - conditional branch selection;
145
+ - prevention of plausible wrong-asset substitution;
146
+ - minimal asset bundle;
147
+ - stop and fallback completeness;
148
+ - search-space reduction versus the work unit;
149
+ - playbook step support;
150
+ - unsupported causal or order claims;
151
+ - problem-frame coverage;
152
+ - formula-only or inventory-only candidate count, which must be zero.
153
+
154
+ Before submit, require:
155
+
156
+ - CLI validator `passed=true`;
157
+ - no shallow formula/state-only candidate;
158
+ - every route has a meaningful branch;
159
+ - every shortcut has stop and fallback;
160
+ - every playbook is note-backed or explicitly labeled structure-backed;
161
+ - candidates materially choose or narrow assets better than an undifferentiated work-unit scan.
162
+
163
+ ## Anti-overfitting
164
+
165
+ Never encode project names, project ids, asset ids, event names, expected topics, expected titles, expected routes, expected counts, or fixed industry dictionaries. The reusable mechanism is problem framing, asset-role classification, decision branching, minimal bundles, and evidence-bounded paths.