@v587d/capital-generation 2.9.2 → 2.10.1

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 (57) hide show
  1. package/CHANGELOG.md +83 -0
  2. package/README.md +8 -5
  3. package/chart-ui/package.json +1 -1
  4. package/config/client.js +8 -6
  5. package/config/client.src.cjs +74 -34
  6. package/config/index.js +8 -2
  7. package/config/package.json +1 -1
  8. package/lib/agents/selected-skills-provider.d.ts +29 -10
  9. package/lib/agents/selected-skills-provider.js +262 -139
  10. package/lib/agents/settled-wake.d.ts +43 -0
  11. package/lib/agents/settled-wake.js +81 -0
  12. package/lib/agents/skill-usage.d.ts +22 -0
  13. package/lib/agents/skill-usage.js +92 -0
  14. package/lib/agents/wait-for-agents.d.ts +79 -0
  15. package/lib/agents/wait-for-agents.js +256 -0
  16. package/lib/capital-settings.d.ts +12 -1
  17. package/lib/capital-settings.js +23 -3
  18. package/lib/chart/artifact-ref.d.ts +4 -1
  19. package/lib/chart/artifact-ref.js +2 -1
  20. package/lib/chart/delivery.d.ts +15 -1
  21. package/lib/chart/delivery.js +17 -8
  22. package/lib/chart/events.d.ts +1 -1
  23. package/lib/chart/html.js +16 -0
  24. package/lib/chart/present-tool.js +52 -3
  25. package/lib/chart/tool.js +63 -9
  26. package/lib/data-collector/store.d.ts +1 -0
  27. package/lib/data-collector/store.js +2 -2
  28. package/lib/index.d.ts +6 -3
  29. package/lib/index.js +10 -19
  30. package/lib/orchestration-entry.d.ts +11 -0
  31. package/lib/orchestration-entry.js +6 -0
  32. package/lib/present-entry.js +26 -5
  33. package/lib/root-extras-entry.d.ts +2 -5
  34. package/lib/root-extras-entry.js +1 -3
  35. package/lib/selected-skills-entry.d.ts +14 -0
  36. package/lib/selected-skills-entry.js +43 -0
  37. package/lib/web-retriever/local-fetch.d.ts +1 -1
  38. package/lib/web-retriever/local-fetch.js +1 -1
  39. package/lib/web-retriever/wind-client.d.ts +1 -1
  40. package/lib/web-retriever/wind-client.js +1 -1
  41. package/package.json +15 -2
  42. package/preset/capital-generation/README.md +3 -3
  43. package/preset/capital-generation/agent.patch.yml +43 -20
  44. package/preset/capital-generation/skills/capital-chart-protocol/SKILL.md +3 -2
  45. package/preset/capital-generation/skills/capital-data-query/SKILL.md +32 -0
  46. package/preset/capital-generation/skills/capital-equity-research/SKILL.md +5 -0
  47. package/preset/capital-generation/skills/capital-event-impact/SKILL.md +3 -0
  48. package/preset/capital-generation/skills/capital-orchestration/SKILL.md +8 -10
  49. package/preset/capital-generation/skills/capital-portfolio-review/SKILL.md +3 -0
  50. package/preset/capital-generation/skills/capital-visualization-protocol/SKILL.md +7 -1
  51. package/preset/capital-generation/skills/capital-web-evidence/SKILL.md +1 -0
  52. package/preset/capital-generation/skills/capital-web-protocol/SKILL.md +3 -0
  53. package/selected-skills/README.md +5 -4
  54. package/selected-skills/ROUTING.md +88 -0
  55. package/selected-skills/catalog.js +32 -121
  56. package/selected-skills/routing.js +1036 -0
  57. package/watchlist/package.json +1 -1
@@ -0,0 +1,1036 @@
1
+ /**
2
+ * Selected-skill routing metadata: the single source for role ownership, trigger text and
3
+ * overlap/canonical decisions. It is deliberately separate from `catalog.js` so the
4
+ * provenance/maturity record stays untouched when routing is re-audited.
5
+ *
6
+ * Roles are execution roles, not "who might be interested": an entry appears in a role
7
+ * catalog only when that role can actually load and apply it. `primaryRole` is where the
8
+ * role prompt lists the trigger first; secondary roles still see it in their own catalog.
9
+ */
10
+
11
+ export const SELECTED_SKILL_ROLES = Object.freeze({
12
+ main: Object.freeze({ zh: '主 Agent', en: 'Main Agent' }),
13
+ data_junior: Object.freeze({ zh: '数据分析', en: 'Data analysis' }),
14
+ web_retriever: Object.freeze({ zh: '检索与取证', en: 'Retrieval & evidence' }),
15
+ })
16
+
17
+ /** `data_analyst` is reserved; until it is enabled it executes the data_junior method set. */
18
+ export const SELECTED_SKILL_ROLE_ALIASES = Object.freeze({ data_analyst: 'data_junior' })
19
+
20
+ export const SELECTED_SKILL_STAGES = Object.freeze({
21
+ 'research': Object.freeze({ zh: '研究', en: 'Research' }),
22
+ 'pre-event': Object.freeze({ zh: '事件前', en: 'Pre-event' }),
23
+ 'post-event': Object.freeze({ zh: '事件后', en: 'Post-event' }),
24
+ 'monitoring': Object.freeze({ zh: '持续监控', en: 'Monitoring' }),
25
+ 'execution': Object.freeze({ zh: '执行', en: 'Execution' }),
26
+ 'review': Object.freeze({ zh: '复盘 / 核验', en: 'Review' }),
27
+ 'learning': Object.freeze({ zh: '教学', en: 'Learning' }),
28
+ })
29
+
30
+ export const SELECTED_SKILL_METHODS = Object.freeze({
31
+ 'valuation': Object.freeze({ zh: '估值', en: 'Valuation' }),
32
+ 'financial-health': Object.freeze({ zh: '财务健康', en: 'Financial health' }),
33
+ 'accounting': Object.freeze({ zh: '会计与报表', en: 'Accounting' }),
34
+ 'risk': Object.freeze({ zh: '风险', en: 'Risk' }),
35
+ 'technical': Object.freeze({ zh: '技术面', en: 'Technicals' }),
36
+ 'portfolio': Object.freeze({ zh: '组合', en: 'Portfolio' }),
37
+ 'tax': Object.freeze({ zh: '税务', en: 'Tax' }),
38
+ 'evidence': Object.freeze({ zh: '证据', en: 'Evidence' }),
39
+ 'earnings': Object.freeze({ zh: '业绩', en: 'Earnings' }),
40
+ 'macro': Object.freeze({ zh: '宏观与行业', en: 'Macro & industry' }),
41
+ 'ownership': Object.freeze({ zh: '持仓与内部人', en: 'Ownership' }),
42
+ 'screening': Object.freeze({ zh: '筛选', en: 'Screening' }),
43
+ 'teaching': Object.freeze({ zh: '教学', en: 'Teaching' }),
44
+ 'trade': Object.freeze({ zh: '交易纪律', en: 'Trade discipline' }),
45
+ })
46
+
47
+ export const SELECTED_SKILL_REQUIREMENTS = Object.freeze({
48
+ financial_statements: Object.freeze({ zh: '财务报表', en: 'Financial statements' }),
49
+ price_history: Object.freeze({ zh: '行情序列', en: 'Price history' }),
50
+ filings: Object.freeze({ zh: '披露文件', en: 'Filings' }),
51
+ portfolio: Object.freeze({ zh: '持仓数据', en: 'Portfolio data' }),
52
+ options: Object.freeze({ zh: '期权链', en: 'Options chain' }),
53
+ macro: Object.freeze({ zh: '宏观序列', en: 'Macro series' }),
54
+ fx: Object.freeze({ zh: '汇率', en: 'FX rates' }),
55
+ peer_data: Object.freeze({ zh: '同业数据', en: 'Peer data' }),
56
+ user_input: Object.freeze({ zh: '用户提供的信息', en: 'User-provided input' }),
57
+ transcript: Object.freeze({ zh: '电话会纪要', en: 'Transcript' }),
58
+ industry_data: Object.freeze({ zh: '行业数据', en: 'Industry data' }),
59
+ })
60
+
61
+ export const SELECTED_SKILL_ROUTING = Object.freeze({
62
+ "buffett-investment-framework": Object.freeze({
63
+ market: Object.freeze(["global"]),
64
+ stage: "research",
65
+ methods: Object.freeze(["valuation","financial-health","risk"]),
66
+ roles: Object.freeze(["main"]),
67
+ primaryRole: "main",
68
+ useWhen: Object.freeze({
69
+ zh: "当用户要求按商业质量、资本配置、估值与风险搭建基本面研究框架,或明确提到巴菲特式分析时使用;关键词:巴菲特、商业质量、资本配置、护城河。",
70
+ en: "Use when the task matches this method: evidence-led business quality, capital allocation, valuation, and risk analysis. Primarily US-market oriented. Triggers on Buffett Investment Framework, Business analysis, Cash flow, Perspective, Risk, Valuation.",
71
+ }),
72
+ requires: Object.freeze(["financial_statements","price_history"]),
73
+ overlaps: Object.freeze(["stock-valuation","company-valuation","china-dcf","china-comps-analysis","valuation-investment-strategy","stock-eval","peter-lynch-skill","china-initiating-coverage","stock-screener"]),
74
+ canonicalFor: Object.freeze([]),
75
+ }),
76
+ "financial-health": Object.freeze({
77
+ market: Object.freeze(["a-share"]),
78
+ stage: "research",
79
+ methods: Object.freeze(["financial-health","accounting"]),
80
+ roles: Object.freeze(["data_junior"]),
81
+ primaryRole: "data_junior",
82
+ useWhen: Object.freeze({
83
+ zh: "当用户要求检查盈利质量、现金转换、营运资本、杠杆与资产负债表风险时使用;关键词:财务健康、现金流、应收账款、减值、负债。只看一个季度增速时不要用。",
84
+ en: "Use when the user asks to check earnings quality, cash conversion, working capital, leverage or balance-sheet risk. Triggers on \"financial health\", \"cash flow\", \"receivables\", \"impairment\", \"leverage\". Not for a single quarter growth read.",
85
+ }),
86
+ requires: Object.freeze(["financial_statements"]),
87
+ overlaps: Object.freeze(["financial-report-analyst","china-break-trace","forensic-accounting","result-validator","fact-check","evidence-gap-check"]),
88
+ canonicalFor: Object.freeze([]),
89
+ }),
90
+ "risk-warning-catalysts": Object.freeze({
91
+ market: Object.freeze(["a-share"]),
92
+ stage: "monitoring",
93
+ methods: Object.freeze(["risk","portfolio"]),
94
+ roles: Object.freeze(["main"]),
95
+ primaryRole: "main",
96
+ useWhen: Object.freeze({
97
+ zh: "当用户要求把研究结论转成带来源、阈值和复查频率的风险与催化剂监控项时使用;关键词:风险监控、催化剂、阈值、复查频率。",
98
+ en: "Use when the task matches this method: turns research into source-backed risk and catalyst monitoring with thresholds and review cadence. Triggers on Risk Warning Catalysts, A-share, Monitoring, Risk.",
99
+ }),
100
+ requires: Object.freeze(["financial_statements","filings"]),
101
+ overlaps: Object.freeze(["catalyst-calendar","catalyst-map","china-catalyst-calendar","thesis-tracker","china-thesis-tracker"]),
102
+ canonicalFor: Object.freeze([]),
103
+ }),
104
+ "valuation-investment-strategy": Object.freeze({
105
+ market: Object.freeze(["a-share"]),
106
+ stage: "research",
107
+ methods: Object.freeze(["valuation","risk"]),
108
+ roles: Object.freeze(["data_junior"]),
109
+ primaryRole: "data_junior",
110
+ useWhen: Object.freeze({
111
+ zh: "当用户要求在一次事实核查之后搭建带假设、情景与失效条件的估值框架时使用;关键词:估值框架、情景分析、失效条件。",
112
+ en: "Use when the task matches this method: builds valuation scenarios with assumptions and invalidation conditions after the factual base is ready. Triggers on Valuation Investment Strategy, A-share, Risk, Valuation.",
113
+ }),
114
+ requires: Object.freeze(["financial_statements","price_history","peer_data"]),
115
+ overlaps: Object.freeze(["stock-valuation","company-valuation","china-dcf","china-comps-analysis","stock-eval","buffett-investment-framework","peter-lynch-skill"]),
116
+ canonicalFor: Object.freeze([]),
117
+ }),
118
+ "strategy-business-transition": Object.freeze({
119
+ market: Object.freeze(["a-share"]),
120
+ stage: "research",
121
+ methods: Object.freeze(["evidence","risk"]),
122
+ roles: Object.freeze(["main"]),
123
+ primaryRole: "main",
124
+ useWhen: Object.freeze({
125
+ zh: "当用户要检验公司战略叙事、业务迁移、资本配置与转型里程碑是否自洽时使用;关键词:战略、业务转型、资本配置、里程碑。",
126
+ en: "Use when the task matches this method: tests strategy narratives, business migration, capital allocation, and transition milestones. Triggers on Strategy Business Transition, A-share, Strategy, Risk.",
127
+ }),
128
+ requires: Object.freeze(["filings","industry_data"]),
129
+ overlaps: Object.freeze([]),
130
+ canonicalFor: Object.freeze([]),
131
+ }),
132
+ "industry-competition-moat": Object.freeze({
133
+ market: Object.freeze(["a-share"]),
134
+ stage: "research",
135
+ methods: Object.freeze(["evidence","risk"]),
136
+ roles: Object.freeze(["main"]),
137
+ primaryRole: "main",
138
+ useWhen: Object.freeze({
139
+ zh: "当用户要判断行业结构、竞争格局、供需与公司差异化是否可持续时使用;关键词:行业格局、竞争、护城河、供需。",
140
+ en: "Use when the task matches this method: analyzes industry structure, competition, supply-demand, and sustainable differentiation. Triggers on Industry Competition Moat, A-share, Business analysis, Competition, Risk.",
141
+ }),
142
+ requires: Object.freeze(["industry_data","filings"]),
143
+ overlaps: Object.freeze([]),
144
+ canonicalFor: Object.freeze([]),
145
+ }),
146
+ "business-decomposition-order-quality": Object.freeze({
147
+ market: Object.freeze(["a-share"]),
148
+ stage: "research",
149
+ methods: Object.freeze(["financial-health","accounting"]),
150
+ roles: Object.freeze(["data_junior"]),
151
+ primaryRole: "data_junior",
152
+ useWhen: Object.freeze({
153
+ zh: "当用户要拆解产品、客户、项目与订单,检查增长能否转成收入与现金时使用;关键词:业务拆解、订单质量、收入转化、现金流。",
154
+ en: "Use when the task matches this method: breaks down products, customers, projects, and orders to test conversion into revenue and cash. Triggers on Business Decomposition Order Quality, A-share, Business analysis, Cash flow, Orders, Risk.",
155
+ }),
156
+ requires: Object.freeze(["financial_statements","filings"]),
157
+ overlaps: Object.freeze([]),
158
+ canonicalFor: Object.freeze([]),
159
+ }),
160
+ "10k-digest": Object.freeze({
161
+ market: Object.freeze(["us-stock"]),
162
+ stage: "post-event",
163
+ methods: Object.freeze(["earnings","evidence"]),
164
+ roles: Object.freeze(["web_retriever","main"]),
165
+ primaryRole: "web_retriever",
166
+ useWhen: Object.freeze({
167
+ zh: "当用户要逐节精读一份美股 10-K,产出摘要、分节要点、关键指标与可核对出处时使用;关键词:10-K、年报精读、分节摘要。",
168
+ en: "Use when the task matches this method: reads a 10-K section by section into an abstract, section summaries, key metrics and sourced references. Triggers on 10-K Report Digest, US equity, Filings, Business analysis.",
169
+ }),
170
+ requires: Object.freeze(["filings"]),
171
+ overlaps: Object.freeze(["earnings-preview","earnings-call-analysis","china-earnings-preview","china-earnings-analysis","china-variance-commentary","financial-report-analyst","china-break-trace"]),
172
+ canonicalFor: Object.freeze(["us/post-event/10k-digest"]),
173
+ }),
174
+ "bear-case": Object.freeze({
175
+ market: Object.freeze(["us-stock"]),
176
+ stage: "review",
177
+ methods: Object.freeze(["evidence","risk"]),
178
+ roles: Object.freeze(["main"]),
179
+ primaryRole: "main",
180
+ useWhen: Object.freeze({
181
+ zh: "当用户要求对一个看多论点做最强的反面论证、逐条找反证与脆弱假设时使用;关键词:空头、红队、反方、看空、bear case。它不预测跌幅。",
182
+ en: "Use when the user asks for the strongest counter-argument to a bullish thesis with counterevidence and fragile assumptions. Triggers on \"bear case\", \"red team\", \"short thesis\", \"counter-argument\". It does not forecast downside.",
183
+ }),
184
+ requires: Object.freeze(["filings","price_history"]),
185
+ overlaps: Object.freeze([]),
186
+ canonicalFor: Object.freeze([]),
187
+ }),
188
+ "catalyst-calendar": Object.freeze({
189
+ market: Object.freeze(["us-stock"]),
190
+ stage: "monitoring",
191
+ methods: Object.freeze(["earnings","portfolio"]),
192
+ roles: Object.freeze(["main"]),
193
+ primaryRole: "main",
194
+ useWhen: Object.freeze({
195
+ zh: "当用户要求列出未来 90 天的事件催化剂、预期影响与复查节奏时使用;关键词:催化剂、日历、财报日、解禁、事件。需要把事件按注意力优先级排序时用 catalyst-map。",
196
+ en: "Use when the user asks for the next 90 days of event catalysts with expected impact and a review cadence. Triggers on \"catalyst\", \"calendar\", \"earnings date\", \"lock-up\". Use catalyst-map when the ask is a ranked attention map.",
197
+ }),
198
+ requires: Object.freeze(["filings","macro"]),
199
+ overlaps: Object.freeze(["catalyst-map","china-catalyst-calendar","risk-warning-catalysts","thesis-tracker","china-thesis-tracker"]),
200
+ canonicalFor: Object.freeze(["us/monitoring/catalysts"]),
201
+ }),
202
+ "competitor-analysis": Object.freeze({
203
+ market: Object.freeze(["us-stock"]),
204
+ stage: "research",
205
+ methods: Object.freeze(["evidence","valuation"]),
206
+ roles: Object.freeze(["data_junior"]),
207
+ primaryRole: "data_junior",
208
+ useWhen: Object.freeze({
209
+ zh: "当用户要围绕一家公司与其直接对手比较护城河、市场地位与行业格局时使用;关键词:竞争对手、护城河、市场地位、同业。",
210
+ en: "Use when the task matches this method: moat, market position and industry dynamics for one company against its direct rivals. Triggers on Competitor Analysis, US equity, Competition, Business analysis, Risk.",
211
+ }),
212
+ requires: Object.freeze(["peer_data","financial_statements"]),
213
+ overlaps: Object.freeze([]),
214
+ canonicalFor: Object.freeze([]),
215
+ }),
216
+ "dividend-analysis": Object.freeze({
217
+ market: Object.freeze(["us-stock"]),
218
+ stage: "research",
219
+ methods: Object.freeze(["valuation","financial-health"]),
220
+ roles: Object.freeze(["data_junior"]),
221
+ primaryRole: "data_junior",
222
+ useWhen: Object.freeze({
223
+ zh: "当用户要把分红、回购、并购、债务管理与自由现金流去向合起来看资本配置纪律时使用;关键词:分红、回购、资本配置、自由现金流。",
224
+ en: "Use when the task matches this method: reviews dividends, buybacks, M&A, debt and FCF deployment as one capital-allocation discipline. Triggers on Dividend & Capital Allocation, US equity, Capital allocation, Cash flow, Valuation.",
225
+ }),
226
+ requires: Object.freeze(["financial_statements","price_history"]),
227
+ overlaps: Object.freeze([]),
228
+ canonicalFor: Object.freeze([]),
229
+ }),
230
+ "earnings-call-analysis": Object.freeze({
231
+ market: Object.freeze(["us-stock"]),
232
+ stage: "post-event",
233
+ methods: Object.freeze(["earnings","evidence"]),
234
+ roles: Object.freeze(["web_retriever","main"]),
235
+ primaryRole: "web_retriever",
236
+ useWhen: Object.freeze({
237
+ zh: "当用户拿到业绩电话会纪要,要求读情绪、主题与管理层口径变化时使用;关键词:电话会、纪要、管理层口径、情绪。",
238
+ en: "Use when the task matches this method: reads sentiment, themes and shifts in management tone from earnings call transcripts. Triggers on Earnings Call Analysis, US equity, Earnings, Perspective.",
239
+ }),
240
+ requires: Object.freeze(["transcript"]),
241
+ overlaps: Object.freeze(["earnings-preview","china-earnings-preview","china-earnings-analysis","china-variance-commentary","financial-report-analyst","10k-digest","china-break-trace"]),
242
+ canonicalFor: Object.freeze(["us/post-event/earnings-call"]),
243
+ }),
244
+ "earnings-preview": Object.freeze({
245
+ market: Object.freeze(["us-stock"]),
246
+ stage: "pre-event",
247
+ methods: Object.freeze(["earnings","risk"]),
248
+ roles: Object.freeze(["data_junior","main"]),
249
+ primaryRole: "data_junior",
250
+ useWhen: Object.freeze({
251
+ zh: "当用户要在美股财报公布前,对比一致预期与期权隐含波动,做超预期 / 符合 / 不及三档情景时使用;关键词:财报前瞻、隐含波动、一致预期、情景。",
252
+ en: "Use when the task matches this method: compares consensus with the implied move and lays out beat / in-line / miss scenarios with watch KPIs. Triggers on Earnings Preview, US equity, Earnings, Risk, Monitoring.",
253
+ }),
254
+ requires: Object.freeze(["financial_statements","options","macro"]),
255
+ overlaps: Object.freeze(["earnings-call-analysis","china-earnings-preview","china-earnings-analysis","china-variance-commentary","financial-report-analyst","10k-digest","china-break-trace"]),
256
+ canonicalFor: Object.freeze(["us/pre-event/earnings-preview"]),
257
+ }),
258
+ "economics-analysis": Object.freeze({
259
+ market: Object.freeze(["us-stock"]),
260
+ stage: "research",
261
+ methods: Object.freeze(["macro","risk"]),
262
+ roles: Object.freeze(["data_junior"]),
263
+ primaryRole: "data_junior",
264
+ useWhen: Object.freeze({
265
+ zh: "当用户要解读美国宏观数据与利率路径,并交代它如何传导到市场时使用;关键词:美国宏观、利率路径、传导、CPI、非农。",
266
+ en: "Use when the task matches this method: interprets US macro prints and the rate path, and spells out the transmission to markets. Triggers on US Economics Analysis, US equity, Macro & industry, Risk.",
267
+ }),
268
+ requires: Object.freeze(["macro"]),
269
+ overlaps: Object.freeze([]),
270
+ canonicalFor: Object.freeze([]),
271
+ }),
272
+ "etf-analysis": Object.freeze({
273
+ market: Object.freeze(["us-stock"]),
274
+ stage: "research",
275
+ methods: Object.freeze(["portfolio","risk"]),
276
+ roles: Object.freeze(["data_junior"]),
277
+ primaryRole: "data_junior",
278
+ useWhen: Object.freeze({
279
+ zh: "当用户要比较 ETF 的费率、跟踪误差、流动性、成分集中度与持仓重叠,并给出契合度评分时使用;关键词:ETF、费率、跟踪误差、持仓重叠。",
280
+ en: "Use when the task matches this method: expense ratio, tracking difference, liquidity, concentration and overlap rolled into a fitness score. Triggers on ETF Analysis, US equity, Options & funds, Portfolio, Risk.",
281
+ }),
282
+ requires: Object.freeze(["price_history","filings"]),
283
+ overlaps: Object.freeze([]),
284
+ canonicalFor: Object.freeze([]),
285
+ }),
286
+ "fact-check": Object.freeze({
287
+ market: Object.freeze(["us-stock"]),
288
+ stage: "review",
289
+ methods: Object.freeze(["evidence"]),
290
+ roles: Object.freeze(["web_retriever","main"]),
291
+ primaryRole: "web_retriever",
292
+ useWhen: Object.freeze({
293
+ zh: "当用户要求把报告里的数字与事实主张逐条对照一手来源、标注已核验 / 不符 / 无法核验时使用;关键词:核验、fact check、引用、一手来源。它只核事实,不重做投资结论。",
294
+ en: "Use when the user asks to verify every figure and factual claim against primary sources and mark verified / mismatch / unverifiable. Triggers on \"fact check\", \"verify\", \"citations\", \"primary source\". It verifies facts, not the investment conclusion.",
295
+ }),
296
+ requires: Object.freeze(["filings"]),
297
+ overlaps: Object.freeze(["financial-health","financial-report-analyst","china-break-trace","forensic-accounting","result-validator","evidence-gap-check"]),
298
+ canonicalFor: Object.freeze(["global/review/claims"]),
299
+ }),
300
+ "financial-report-analyst": Object.freeze({
301
+ market: Object.freeze(["us-stock"]),
302
+ stage: "post-event",
303
+ methods: Object.freeze(["accounting","financial-health"]),
304
+ roles: Object.freeze(["data_junior","web_retriever"]),
305
+ primaryRole: "data_junior",
306
+ useWhen: Object.freeze({
307
+ zh: "当用户要从 10-K / 10-Q 读报表质量、异常红旗与可交代出处的信号时使用;关键词:10-Q、报表质量、红旗、异常。",
308
+ en: "Use when the task matches this method: reads statement quality, red flags and one sourced signal from 10-K / 10-Q filings. Triggers on Financial Report Analyst, US equity, Filings, Financial health, Risk.",
309
+ }),
310
+ requires: Object.freeze(["filings","financial_statements"]),
311
+ overlaps: Object.freeze(["earnings-preview","earnings-call-analysis","china-earnings-preview","china-earnings-analysis","china-variance-commentary","10k-digest","china-break-trace","financial-health","forensic-accounting","result-validator","fact-check","evidence-gap-check"]),
312
+ canonicalFor: Object.freeze(["us/quality/statement"]),
313
+ }),
314
+ "industry-map": Object.freeze({
315
+ market: Object.freeze(["us-stock"]),
316
+ stage: "research",
317
+ methods: Object.freeze(["evidence","macro"]),
318
+ roles: Object.freeze(["data_junior"]),
319
+ primaryRole: "data_junior",
320
+ useWhen: Object.freeze({
321
+ zh: "当用户要把产业链上下游画成有向图,定位公司位置、供需瓶颈与利润池时使用;关键词:产业链、上下游、瓶颈、利润池。",
322
+ en: "Use when the task matches this method: maps the value chain as a directed graph to locate the company, find chokepoints and second-order ideas. Triggers on Industry Map, US equity, Macro & industry, Competition, Business analysis.",
323
+ }),
324
+ requires: Object.freeze(["industry_data","filings"]),
325
+ overlaps: Object.freeze([]),
326
+ canonicalFor: Object.freeze([]),
327
+ }),
328
+ "insider-trading": Object.freeze({
329
+ market: Object.freeze(["us-stock"]),
330
+ stage: "monitoring",
331
+ methods: Object.freeze(["ownership","evidence"]),
332
+ roles: Object.freeze(["data_junior","web_retriever"]),
333
+ primaryRole: "data_junior",
334
+ useWhen: Object.freeze({
335
+ zh: "当用户要从 SEC Form 4 追踪高管与董事增减持并做解读时使用;关键词:内部人、Form 4、增减持、高管。",
336
+ en: "Use when the task matches this method: tracks executive and director buying and selling from SEC Form 4 filings. Triggers on Insider Trading, US equity, Filings, Monitoring, Perspective.",
337
+ }),
338
+ requires: Object.freeze(["filings"]),
339
+ overlaps: Object.freeze([]),
340
+ canonicalFor: Object.freeze([]),
341
+ }),
342
+ "institutional-ownership": Object.freeze({
343
+ market: Object.freeze(["us-stock"]),
344
+ stage: "monitoring",
345
+ methods: Object.freeze(["ownership","evidence"]),
346
+ roles: Object.freeze(["data_junior","web_retriever"]),
347
+ primaryRole: "data_junior",
348
+ useWhen: Object.freeze({
349
+ zh: "当用户要从 13F 读机构持仓变化、识别资金迁移方向时使用;关键词:13F、机构持仓、资金迁移。",
350
+ en: "Use when the task matches this method: reads changes in institutional holdings from 13F filings to spot where the money is moving. Triggers on Institutional Ownership, US equity, Filings, Monitoring.",
351
+ }),
352
+ requires: Object.freeze(["filings"]),
353
+ overlaps: Object.freeze([]),
354
+ canonicalFor: Object.freeze([]),
355
+ }),
356
+ "learning-coach": Object.freeze({
357
+ market: Object.freeze(["global"]),
358
+ stage: "learning",
359
+ methods: Object.freeze(["teaching"]),
360
+ roles: Object.freeze(["main"]),
361
+ primaryRole: "main",
362
+ useWhen: Object.freeze({
363
+ zh: "当用户要求把一份分析结果讲成课程、逐指标解释并反问理解问题时使用;关键词:讲解、教学、逐指标、理解检验。",
364
+ en: "Use when the task matches this method: explains an analysis metric by metric in plain words, then asks 3–5 Socratic questions. Triggers on Learning Coach, Education, Perspective.",
365
+ }),
366
+ requires: Object.freeze(["user_input"]),
367
+ overlaps: Object.freeze([]),
368
+ canonicalFor: Object.freeze([]),
369
+ }),
370
+ "options-analysis": Object.freeze({
371
+ market: Object.freeze(["us-stock"]),
372
+ stage: "research",
373
+ methods: Object.freeze(["technical","risk"]),
374
+ roles: Object.freeze(["data_junior"]),
375
+ primaryRole: "data_junior",
376
+ useWhen: Object.freeze({
377
+ zh: "当用户要看期权希腊字母、隐含波动率与策略适配度,理解风险形状时使用;关键词:期权、Greeks、隐含波动率、策略。",
378
+ en: "Use when the task matches this method: reviews Greeks, implied volatility and strategy fit to characterise an options risk shape. Triggers on Options Analysis, US equity, Options & funds, Risk.",
379
+ }),
380
+ requires: Object.freeze(["options","price_history"]),
381
+ overlaps: Object.freeze([]),
382
+ canonicalFor: Object.freeze([]),
383
+ }),
384
+ "portfolio-review": Object.freeze({
385
+ market: Object.freeze(["us-stock"]),
386
+ stage: "review",
387
+ methods: Object.freeze(["portfolio","risk"]),
388
+ roles: Object.freeze(["main"]),
389
+ primaryRole: "main",
390
+ useWhen: Object.freeze({
391
+ zh: "当用户要求复盘实际持仓或组合的收益来源、集中度、配置偏离与风险动作时使用;关键词:组合复盘、持仓、配置偏离、集中度。自选清单不等于持仓。",
392
+ en: "Use when the user asks to review actual holdings or a portfolio for return drivers, concentration, allocation drift and risk actions. Triggers on \"portfolio review\", \"holdings\", \"allocation drift\", \"concentration\". A watchlist is not a portfolio.",
393
+ }),
394
+ requires: Object.freeze(["portfolio","price_history"]),
395
+ overlaps: Object.freeze(["portfolio-concentration","risk-stress-test","position-sizing","position-ladder","position-management","watchlist-review","execution-plan-check","risk-reward-sanity-check","post-trade-review","journal-pattern-analyzer"]),
396
+ canonicalFor: Object.freeze(["global/portfolio/review"]),
397
+ }),
398
+ "position-ladder": Object.freeze({
399
+ market: Object.freeze(["us-stock"]),
400
+ stage: "execution",
401
+ methods: Object.freeze(["portfolio","trade"]),
402
+ roles: Object.freeze(["main"]),
403
+ primaryRole: "main",
404
+ useWhen: Object.freeze({
405
+ zh: "当用户要把建仓拆成分批股数上下限与加减仓节奏,并检查批次记账与洗售窗口时使用;关键词:分批建仓、加减仓、批次、洗售。",
406
+ en: "Use when the task matches this method: plans a staged entry with share-count floors and ceilings, trim/re-add cadence, lot and wash-sale checks. Triggers on Position Ladder, US equity, Portfolio, Monitoring.",
407
+ }),
408
+ requires: Object.freeze(["portfolio","price_history"]),
409
+ overlaps: Object.freeze(["portfolio-review","portfolio-concentration","risk-stress-test","position-sizing","position-management","watchlist-review","execution-plan-check","risk-reward-sanity-check","post-trade-review","journal-pattern-analyzer"]),
410
+ canonicalFor: Object.freeze(["global/execution/ladder"]),
411
+ }),
412
+ "result-validator": Object.freeze({
413
+ market: Object.freeze(["global"]),
414
+ stage: "review",
415
+ methods: Object.freeze(["evidence","risk"]),
416
+ roles: Object.freeze(["main"]),
417
+ primaryRole: "main",
418
+ useWhen: Object.freeze({
419
+ zh: "当用户要从数据质量、方法一致性与信号冲突三个维度给一份分析结果打置信度分时使用;关键词:置信度、数据质量、方法一致性、信号冲突。",
420
+ en: "Use when the task matches this method: scores an analysis's confidence across data quality, methodology and signal consistency. Triggers on Result Validator, Verification, Perspective.",
421
+ }),
422
+ requires: Object.freeze(["user_input"]),
423
+ overlaps: Object.freeze(["financial-health","financial-report-analyst","china-break-trace","forensic-accounting","fact-check","evidence-gap-check"]),
424
+ canonicalFor: Object.freeze([]),
425
+ }),
426
+ "risk-stress-test": Object.freeze({
427
+ market: Object.freeze(["us-stock"]),
428
+ stage: "review",
429
+ methods: Object.freeze(["risk","portfolio"]),
430
+ roles: Object.freeze(["data_junior","main"]),
431
+ primaryRole: "data_junior",
432
+ useWhen: Object.freeze({
433
+ zh: "当用户要对组合做 beta 加权敞口、历史情景重放、VaR / CVaR、最大回撤与流动性退出天数测算时使用;关键词:压力测试、VaR、CVaR、回撤、风险预算。",
434
+ en: "Use when the task matches this method: beta-weighted exposure, historical scenario replay, VaR / CVaR, drawdown estimates and days to exit. Triggers on Risk Stress Test, US equity, Portfolio, Risk, Macro & industry.",
435
+ }),
436
+ requires: Object.freeze(["portfolio","price_history","macro"]),
437
+ overlaps: Object.freeze(["portfolio-review","portfolio-concentration","position-sizing","position-ladder","position-management","watchlist-review","execution-plan-check","risk-reward-sanity-check","post-trade-review","journal-pattern-analyzer"]),
438
+ canonicalFor: Object.freeze(["global/portfolio/stress"]),
439
+ }),
440
+ "sector-analysis": Object.freeze({
441
+ market: Object.freeze(["us-stock"]),
442
+ stage: "research",
443
+ methods: Object.freeze(["macro","technical"]),
444
+ roles: Object.freeze(["data_junior"]),
445
+ primaryRole: "data_junior",
446
+ useWhen: Object.freeze({
447
+ zh: "当用户要看美国各板块的相对强弱与轮动线索时使用;关键词:板块、相对强弱、轮动、行业。",
448
+ en: "Use when the task matches this method: reviews US sector positioning and rotation clues, and states what each read rests on. Triggers on Sector Analysis, US equity, Macro & industry, Competition.",
449
+ }),
450
+ requires: Object.freeze(["price_history","macro"]),
451
+ overlaps: Object.freeze([]),
452
+ canonicalFor: Object.freeze([]),
453
+ }),
454
+ "short-interest": Object.freeze({
455
+ market: Object.freeze(["us-stock"]),
456
+ stage: "monitoring",
457
+ methods: Object.freeze(["ownership","risk"]),
458
+ roles: Object.freeze(["data_junior","web_retriever"]),
459
+ primaryRole: "data_junior",
460
+ useWhen: Object.freeze({
461
+ zh: "当用户要读空头比例、回补成本与挤压条件,并检查利空堆积时使用;关键词:空头、short interest、挤压、回补。",
462
+ en: "Use when the task matches this method: analyses short ratio, cost to cover, squeeze conditions and bearish positioning signals. Triggers on Short Interest, US equity, Filings, Monitoring, Risk.",
463
+ }),
464
+ requires: Object.freeze(["filings","price_history"]),
465
+ overlaps: Object.freeze([]),
466
+ canonicalFor: Object.freeze([]),
467
+ }),
468
+ "stock-eval": Object.freeze({
469
+ market: Object.freeze(["us-stock"]),
470
+ stage: "research",
471
+ methods: Object.freeze(["valuation","financial-health","risk"]),
472
+ roles: Object.freeze(["data_junior"]),
473
+ primaryRole: "data_junior",
474
+ useWhen: Object.freeze({
475
+ zh: "当用户要把财务质量、成长、估值与风险合成一次美股综合评估时使用;关键词:综合评估、基本面、估值、风险。",
476
+ en: "Use when the task matches this method: combines quality, growth, valuation and risk into one evaluation with a sourced conclusion. Triggers on Stock Evaluation, US equity, Business analysis, Financial health, Valuation, Risk.",
477
+ }),
478
+ requires: Object.freeze(["financial_statements","price_history","peer_data"]),
479
+ overlaps: Object.freeze(["stock-valuation","company-valuation","china-dcf","china-comps-analysis","valuation-investment-strategy","buffett-investment-framework","peter-lynch-skill","china-initiating-coverage","stock-screener"]),
480
+ canonicalFor: Object.freeze(["us/research/comprehensive"]),
481
+ }),
482
+ "stock-screener": Object.freeze({
483
+ market: Object.freeze(["us-stock"]),
484
+ stage: "research",
485
+ methods: Object.freeze(["screening","valuation"]),
486
+ roles: Object.freeze(["data_junior"]),
487
+ primaryRole: "data_junior",
488
+ useWhen: Object.freeze({
489
+ zh: "当用户要按估值、质量、动量、情绪与成长五个维度给一篮子美股打分排序时使用;关键词:筛选、打分、排序、多标的。",
490
+ en: "Use when the task matches this method: screens and ranks a list of US stocks across valuation, quality, momentum, sentiment and growth. Triggers on Stock Screener, US equity, Valuation, Business analysis, Technicals.",
491
+ }),
492
+ requires: Object.freeze(["price_history","financial_statements"]),
493
+ overlaps: Object.freeze(["buffett-investment-framework","peter-lynch-skill","stock-eval","china-initiating-coverage"]),
494
+ canonicalFor: Object.freeze([]),
495
+ }),
496
+ "stock-valuation": Object.freeze({
497
+ market: Object.freeze(["us-stock"]),
498
+ stage: "research",
499
+ methods: Object.freeze(["valuation"]),
500
+ roles: Object.freeze(["data_junior"]),
501
+ primaryRole: "data_junior",
502
+ useWhen: Object.freeze({
503
+ zh: "当用户要求对美股或境外上市公司做 DCF、可比公司、EV 倍数或剩余收益估值区间时使用;关键词:估值、DCF、目标价、合理区间。单独算 WACC 或做 EV/股权桥时用更专门的 skill。",
504
+ en: "Use when the user asks for a DCF, comparables, EV multiple or residual-income valuation range for a US or offshore listed company. Triggers on \"valuation\", \"DCF\", \"target price\", \"fair value range\".",
505
+ }),
506
+ requires: Object.freeze(["financial_statements","price_history","peer_data"]),
507
+ overlaps: Object.freeze(["company-valuation","china-dcf","china-comps-analysis","valuation-investment-strategy","stock-eval","buffett-investment-framework","peter-lynch-skill"]),
508
+ canonicalFor: Object.freeze(["us/valuation/multi-method"]),
509
+ }),
510
+ "tax-lens": Object.freeze({
511
+ market: Object.freeze(["us-stock"]),
512
+ stage: "review",
513
+ methods: Object.freeze(["tax","portfolio"]),
514
+ roles: Object.freeze(["main"]),
515
+ primaryRole: "main",
516
+ useWhen: Object.freeze({
517
+ zh: "当问题涉及美国资本利得、洗售窗口、合格股息持有期、批次选择或年度税负拖累时使用;关键词:税、wash sale、长期 / 短期、税负。中国大陆税务不要套用。",
518
+ en: "Use when the question involves US capital-gains treatment, the wash-sale window, qualified-dividend holding periods, lot selection or annual tax drag. Triggers on \"tax\", \"wash sale\", \"long-term / short-term\", \"tax drag\". Not for mainland-China tax.",
519
+ }),
520
+ requires: Object.freeze(["portfolio","user_input"]),
521
+ overlaps: Object.freeze([]),
522
+ canonicalFor: Object.freeze(["global/tax/us"]),
523
+ }),
524
+ "technical-analysis": Object.freeze({
525
+ market: Object.freeze(["us-stock"]),
526
+ stage: "monitoring",
527
+ methods: Object.freeze(["technical"]),
528
+ roles: Object.freeze(["data_junior"]),
529
+ primaryRole: "data_junior",
530
+ useWhen: Object.freeze({
531
+ zh: "当用户要求用均线、成交量、RSI / MACD 读趋势、关键价位、支撑压力或复查触发条件时使用;关键词:技术面、补跌、趋势、支撑压力。它是复查条件,不是方向预测。",
532
+ en: "Use when the user asks for trend, key levels, support / resistance or re-check triggers using moving averages, volume, RSI or MACD. Triggers on \"技术面\", \"补跌\", \"趋势\", \"支撑压力\". It gives re-check conditions, not a direction forecast.",
533
+ }),
534
+ requires: Object.freeze(["price_history"]),
535
+ overlaps: Object.freeze([]),
536
+ canonicalFor: Object.freeze([]),
537
+ }),
538
+ "thesis-tracker": Object.freeze({
539
+ market: Object.freeze(["us-stock"]),
540
+ stage: "monitoring",
541
+ methods: Object.freeze(["evidence","risk"]),
542
+ roles: Object.freeze(["main"]),
543
+ primaryRole: "main",
544
+ useWhen: Object.freeze({
545
+ zh: "当用户要写下论点的 KPI、失效条件与催化剂,并在新数据到来后复核维持 / 走弱 / 失效时使用;关键词:论点跟踪、KPI、失效条件、催化剂。",
546
+ en: "Use when the task matches this method: records KPIs, invalidation triggers and catalysts, then re-checks them as INTACT / WEAKENED / BROKEN. Triggers on Thesis Tracker, US equity, Verification, Monitoring, Perspective.",
547
+ }),
548
+ requires: Object.freeze(["filings","price_history"]),
549
+ overlaps: Object.freeze(["catalyst-calendar","catalyst-map","china-catalyst-calendar","risk-warning-catalysts","china-thesis-tracker"]),
550
+ canonicalFor: Object.freeze([]),
551
+ }),
552
+ "peter-lynch-skill": Object.freeze({
553
+ market: Object.freeze(["us-stock"]),
554
+ stage: "research",
555
+ methods: Object.freeze(["valuation","evidence","screening"]),
556
+ roles: Object.freeze(["main"]),
557
+ primaryRole: "main",
558
+ useWhen: Object.freeze({
559
+ zh: "当用户要求按彼得·林奇式快筛(SKIP / WATCHLIST / DEEP RESEARCH)或完整尽调研究一只美股时使用;关键词:彼得·林奇、快筛、尽调、分类。",
560
+ en: "Use when the task matches this method: screens a ticker or company fast (SKIP / WATCHLIST / DEEP RESEARCH) or runs full due diligence, with linked sources under every claim. US and overseas-listing conventions. Triggers on Peter Lynch Research, Peter Lynch, US equity, Valuation, Risk, Verification.",
561
+ }),
562
+ requires: Object.freeze(["financial_statements","price_history","filings"]),
563
+ overlaps: Object.freeze(["stock-valuation","company-valuation","china-dcf","china-comps-analysis","valuation-investment-strategy","stock-eval","buffett-investment-framework","china-initiating-coverage","stock-screener"]),
564
+ canonicalFor: Object.freeze([]),
565
+ }),
566
+ "catalyst-map": Object.freeze({
567
+ market: Object.freeze(["us-stock"]),
568
+ stage: "monitoring",
569
+ methods: Object.freeze(["earnings","portfolio"]),
570
+ roles: Object.freeze(["main"]),
571
+ primaryRole: "main",
572
+ useWhen: Object.freeze({
573
+ zh: "当用户要把事件按影响什么、什么时候影响、传导到谁排成注意力优先级时使用;关键词:催化剂地图、事件链、注意力、传导。",
574
+ en: "Use when the task matches this method: ranks upcoming events by what they move, when, and how they transmit across related names, and flags positions hanging on the same event chain. US and overseas calendar conventions. Triggers on Catalyst Map, Trade discipline, Macro & industry, Monitoring, US equity.",
575
+ }),
576
+ requires: Object.freeze(["filings","macro"]),
577
+ overlaps: Object.freeze(["catalyst-calendar","china-catalyst-calendar","risk-warning-catalysts","thesis-tracker","china-thesis-tracker"]),
578
+ canonicalFor: Object.freeze([]),
579
+ }),
580
+ "watchlist-review": Object.freeze({
581
+ market: Object.freeze(["us-stock"]),
582
+ stage: "monitoring",
583
+ methods: Object.freeze(["portfolio","evidence"]),
584
+ roles: Object.freeze(["main"]),
585
+ primaryRole: "main",
586
+ useWhen: Object.freeze({
587
+ zh: "当用户要对自选清单做分诊,区分值得盯、只作背景与理由已不成立时使用;关键词:自选股、分诊、清单、移除。",
588
+ en: "Use when the task matches this method: triages the watchlist the user supplies into active focus, background monitoring, or removal, and says that what comes off is a list entry, not a position. Triggers on Watchlist Review, Trade discipline, Portfolio, Monitoring, US equity.",
589
+ }),
590
+ requires: Object.freeze(["portfolio","price_history"]),
591
+ overlaps: Object.freeze(["portfolio-review","portfolio-concentration","risk-stress-test","position-sizing","position-ladder","position-management","execution-plan-check","risk-reward-sanity-check","post-trade-review","journal-pattern-analyzer"]),
592
+ canonicalFor: Object.freeze([]),
593
+ }),
594
+ "evidence-gap-check": Object.freeze({
595
+ market: Object.freeze(["global"]),
596
+ stage: "review",
597
+ methods: Object.freeze(["evidence"]),
598
+ roles: Object.freeze(["main"]),
599
+ primaryRole: "main",
600
+ useWhen: Object.freeze({
601
+ zh: "当用户要把一笔想法还缺的事实、假设与未解问题按会不会改变判断排序时使用;关键词:证据缺口、假设、未解问题、置信度。",
602
+ en: "Use when the task matches this method: ranks the missing facts, assumptions and open questions behind an idea by whether they change the judgement, and separates blocking gaps from confidence gaps. Triggers on Evidence Gap Check, Trade discipline, Verification, Risk.",
603
+ }),
604
+ requires: Object.freeze(["user_input"]),
605
+ overlaps: Object.freeze(["financial-health","financial-report-analyst","china-break-trace","forensic-accounting","result-validator","fact-check"]),
606
+ canonicalFor: Object.freeze([]),
607
+ }),
608
+ "thesis-validation": Object.freeze({
609
+ market: Object.freeze(["global"]),
610
+ stage: "review",
611
+ methods: Object.freeze(["evidence","risk"]),
612
+ roles: Object.freeze(["main"]),
613
+ primaryRole: "main",
614
+ useWhen: Object.freeze({
615
+ zh: "当用户要把一个说法压成可检验的论点、证据、失效条件与时间窗时使用;关键词:论点压力测试、可检验、失效、时间窗。",
616
+ en: "Use when the task matches this method: turns a claim into something testable — thesis, evidence, invalidation, timeframe — then judges whether it is ready to be built on. Triggers on Thesis Validation, Trade discipline, Verification, Risk.",
617
+ }),
618
+ requires: Object.freeze(["user_input","filings"]),
619
+ overlaps: Object.freeze([]),
620
+ canonicalFor: Object.freeze([]),
621
+ }),
622
+ "risk-reward-sanity-check": Object.freeze({
623
+ market: Object.freeze(["us-stock"]),
624
+ stage: "execution",
625
+ methods: Object.freeze(["trade","risk"]),
626
+ roles: Object.freeze(["data_junior"]),
627
+ primaryRole: "data_junior",
628
+ useWhen: Object.freeze({
629
+ zh: "当用户给出入场、止损与目标,要求算盈亏比并检查目标是否在噪声里、止损是否在流动性聚集处时使用;关键词:盈亏比、止损、目标、结构自洽。",
630
+ en: "Use when the task matches this method: works out the reward-to-risk ratio from entry, stop and target, then tests whether the structure holds — targets inside noise, stops sitting in obvious liquidity pools. Triggers on Risk-Reward Sanity Check, Trade discipline, Risk, US equity.",
631
+ }),
632
+ requires: Object.freeze(["price_history","user_input"]),
633
+ overlaps: Object.freeze(["portfolio-review","portfolio-concentration","risk-stress-test","position-sizing","position-ladder","position-management","watchlist-review","execution-plan-check","post-trade-review","journal-pattern-analyzer"]),
634
+ canonicalFor: Object.freeze([]),
635
+ }),
636
+ "execution-plan-check": Object.freeze({
637
+ market: Object.freeze(["us-stock"]),
638
+ stage: "execution",
639
+ methods: Object.freeze(["trade","risk"]),
640
+ roles: Object.freeze(["main"]),
641
+ primaryRole: "main",
642
+ useWhen: Object.freeze({
643
+ zh: "当用户要检查一份交易计划在操作上能否落地:订单类型、流动性、点差、事件时点与止损成交时使用;关键词:执行计划、订单类型、流动性、止损。",
644
+ en: "Use when the task matches this method: checks whether a plan is operationally workable: order type against urgency, liquidity and spread risk, event timing, and whether a stop would actually fill. Triggers on Execution Plan Check, Trade discipline, Risk, Monitoring, US equity.",
645
+ }),
646
+ requires: Object.freeze(["price_history","user_input"]),
647
+ overlaps: Object.freeze(["portfolio-review","portfolio-concentration","risk-stress-test","position-sizing","position-ladder","position-management","watchlist-review","risk-reward-sanity-check","post-trade-review","journal-pattern-analyzer"]),
648
+ canonicalFor: Object.freeze([]),
649
+ }),
650
+ "portfolio-concentration": Object.freeze({
651
+ market: Object.freeze(["global"]),
652
+ stage: "review",
653
+ methods: Object.freeze(["portfolio","risk"]),
654
+ roles: Object.freeze(["data_junior","main"]),
655
+ primaryRole: "data_junior",
656
+ useWhen: Object.freeze({
657
+ zh: "当用户要判断组合是否过度压在同一批发行人、行业、主题或相关暴露上时使用;关键词:集中度、发行主体、行业、相关暴露。",
658
+ en: "Use when the task matches this method: shows whether a book leans too hard on a few issuers, sectors, themes or correlated exposures, and what holdings data that verdict needs to stand. Triggers on Portfolio Concentration, Trade discipline, Portfolio, Risk.",
659
+ }),
660
+ requires: Object.freeze(["portfolio"]),
661
+ overlaps: Object.freeze(["portfolio-review","risk-stress-test","position-sizing","position-ladder","position-management","watchlist-review","execution-plan-check","risk-reward-sanity-check","post-trade-review","journal-pattern-analyzer"]),
662
+ canonicalFor: Object.freeze(["global/portfolio/concentration"]),
663
+ }),
664
+ "journal-pattern-analyzer": Object.freeze({
665
+ market: Object.freeze(["global"]),
666
+ stage: "review",
667
+ methods: Object.freeze(["trade","teaching"]),
668
+ roles: Object.freeze(["main"]),
669
+ primaryRole: "main",
670
+ useWhen: Object.freeze({
671
+ zh: "当用户要从自己的交易日志里找重复出现的优势与失误,并按环境分组时使用;关键词:交易日志、模式、优势、失误、小样本。",
672
+ en: "Use when the task matches this method: finds the repeated strengths and mistakes in the user’s own trade journal, groups them by environment, and keeps small samples from hardening into lessons. Triggers on Journal Pattern Analyzer, Trade discipline, Education, Portfolio.",
673
+ }),
674
+ requires: Object.freeze(["portfolio","user_input"]),
675
+ overlaps: Object.freeze(["portfolio-review","portfolio-concentration","risk-stress-test","position-sizing","position-ladder","position-management","watchlist-review","execution-plan-check","risk-reward-sanity-check","post-trade-review"]),
676
+ canonicalFor: Object.freeze([]),
677
+ }),
678
+ "post-trade-review": Object.freeze({
679
+ market: Object.freeze(["global"]),
680
+ stage: "review",
681
+ methods: Object.freeze(["trade","teaching"]),
682
+ roles: Object.freeze(["main"]),
683
+ primaryRole: "main",
684
+ useWhen: Object.freeze({
685
+ zh: "当用户要按论点、setup、执行、守规与结果复盘一笔已平掉的交易时使用;关键词:交易复盘、后视镜、守规、结果。",
686
+ en: "Use when the task matches this method: reviews a closed trade across thesis, setup, execution, adherence and outcome without rewriting it with hindsight. Triggers on Post-Trade Review, Trade discipline, Education.",
687
+ }),
688
+ requires: Object.freeze(["user_input"]),
689
+ overlaps: Object.freeze(["portfolio-review","portfolio-concentration","risk-stress-test","position-sizing","position-ladder","position-management","watchlist-review","execution-plan-check","risk-reward-sanity-check","journal-pattern-analyzer"]),
690
+ canonicalFor: Object.freeze(["global/review/post-trade"]),
691
+ }),
692
+ "position-sizing": Object.freeze({
693
+ market: Object.freeze(["us-stock"]),
694
+ stage: "execution",
695
+ methods: Object.freeze(["trade","portfolio"]),
696
+ roles: Object.freeze(["data_junior","main"]),
697
+ primaryRole: "data_junior",
698
+ useWhen: Object.freeze({
699
+ zh: "当用户给出账户规模、单笔风险预算、入场价与止损价,要求反推一个可辩护的仓位大小时使用;关键词:仓位、头寸、风险预算、止损。它只算大小,不判断这笔该不该做。",
700
+ en: "Use when the user supplies account equity, per-trade risk budget, entry and stop, and asks for a defensible position size. Triggers on \"position size\", \"risk budget\", \"stop\". It sizes the trade, not whether to take it.",
701
+ }),
702
+ requires: Object.freeze(["portfolio","price_history","user_input"]),
703
+ overlaps: Object.freeze(["portfolio-review","portfolio-concentration","risk-stress-test","position-ladder","position-management","watchlist-review","execution-plan-check","risk-reward-sanity-check","post-trade-review","journal-pattern-analyzer"]),
704
+ canonicalFor: Object.freeze(["global/execution/sizing"]),
705
+ }),
706
+ "position-management": Object.freeze({
707
+ market: Object.freeze(["us-stock"]),
708
+ stage: "review",
709
+ methods: Object.freeze(["portfolio","risk"]),
710
+ roles: Object.freeze(["main"]),
711
+ primaryRole: "main",
712
+ useWhen: Object.freeze({
713
+ zh: "当用户要对照原始论点、失效条件、催化剂与执行约束复查一笔在手仓位时使用;关键词:持仓复核、继续持有、减仓、止损、离场。",
714
+ en: "Use when the task matches this method: revisits an open position against the original thesis, its invalidation logic, the catalyst calendar and execution constraints, then argues hold, trim, tighten or exit on stated evidence. Triggers on Position Management, Trade discipline, Monitoring, Portfolio, US equity.",
715
+ }),
716
+ requires: Object.freeze(["portfolio","filings","price_history"]),
717
+ overlaps: Object.freeze(["portfolio-review","portfolio-concentration","risk-stress-test","position-sizing","position-ladder","watchlist-review","execution-plan-check","risk-reward-sanity-check","post-trade-review","journal-pattern-analyzer"]),
718
+ canonicalFor: Object.freeze([]),
719
+ }),
720
+ "china-earnings-analysis": Object.freeze({
721
+ market: Object.freeze(["a-share"]),
722
+ stage: "post-event",
723
+ methods: Object.freeze(["earnings","financial-health"]),
724
+ roles: Object.freeze(["main","data_junior"]),
725
+ primaryRole: "main",
726
+ useWhen: Object.freeze({
727
+ zh: "当用户要求对 A 股公司做季报/年报点评,需要实际 / 一致预期 / 上期差异表、收入与利润率分解、资产负债表与现金流关注点时使用;关键词:财报点评、季报点评、年报点评、业绩分析。只查公告事实时不要用。",
728
+ en: "Use when the user asks for an A-share quarterly or annual post-earnings review and needs an actual / consensus / prior variance table, revenue and margin decomposition, or balance-sheet and cash-flow focus. Triggers on \"财报点评\", \"季报点评\", \"年报点评\", \"业绩分析\". Not for a single announcement lookup.",
729
+ }),
730
+ requires: Object.freeze(["financial_statements","filings"]),
731
+ overlaps: Object.freeze(["earnings-preview","earnings-call-analysis","china-earnings-preview","china-variance-commentary","financial-report-analyst","10k-digest","china-break-trace"]),
732
+ canonicalFor: Object.freeze(["a-share/post-event/earnings-note"]),
733
+ }),
734
+ "china-earnings-preview": Object.freeze({
735
+ market: Object.freeze(["a-share"]),
736
+ stage: "pre-event",
737
+ methods: Object.freeze(["earnings","risk"]),
738
+ roles: Object.freeze(["data_junior","main"]),
739
+ primaryRole: "data_junior",
740
+ useWhen: Object.freeze({
741
+ zh: "当用户在一份 A 股财报公布前,要求历史基线、要盯的三到五个指标、乐观 / 基准 / 悲观三档情景与触发条件时使用;关键词:财报前瞻、业绩预告、快报、前瞻。",
742
+ en: "Use when the user asks for an A-share pre-earnings frame: historical baseline, three to five metrics to watch, and bull / base / bear scenarios with triggers. Triggers on \"财报前瞻\", \"业绩预告\", \"快报\".",
743
+ }),
744
+ requires: Object.freeze(["financial_statements","filings"]),
745
+ overlaps: Object.freeze(["earnings-preview","earnings-call-analysis","china-earnings-analysis","china-variance-commentary","financial-report-analyst","10k-digest","china-break-trace"]),
746
+ canonicalFor: Object.freeze(["a-share/pre-event/earnings-preview"]),
747
+ }),
748
+ "china-comps-analysis": Object.freeze({
749
+ market: Object.freeze(["a-share"]),
750
+ stage: "research",
751
+ methods: Object.freeze(["valuation"]),
752
+ roles: Object.freeze(["data_junior"]),
753
+ primaryRole: "data_junior",
754
+ useWhen: Object.freeze({
755
+ zh: "当用户要按 A 股口径搭同业倍数表,比较 P/E、P/B、EV/EBITDA 与溢价折价时使用;关键词:可比公司、倍数、P/E、EV/EBITDA、A 股。",
756
+ en: "Use when the task matches this method: builds a peer multiple table on A-share conventions: sector grouping with size, growth and profitability screens, dynamic / static / TTM P/E, P/B and EV/EBITDA, premium and discount explanations, and a resulting valuation range. Triggers on A-Share Comparable Multiples, A-share, Valuation, Competition.",
757
+ }),
758
+ requires: Object.freeze(["financial_statements","peer_data","price_history"]),
759
+ overlaps: Object.freeze(["stock-valuation","company-valuation","china-dcf","valuation-investment-strategy","stock-eval","buffett-investment-framework","peter-lynch-skill"]),
760
+ canonicalFor: Object.freeze(["a-share/valuation/comps"]),
761
+ }),
762
+ "china-dcf": Object.freeze({
763
+ market: Object.freeze(["a-share"]),
764
+ stage: "research",
765
+ methods: Object.freeze(["valuation","financial-health"]),
766
+ roles: Object.freeze(["data_junior"]),
767
+ primaryRole: "data_junior",
768
+ useWhen: Object.freeze({
769
+ zh: "当用户要用中国财报口径跑 DCF:十年期国债、A 股股权风险溢价、25% / 15% 税率与本币终值时使用;关键词:A 股 DCF、WACC、敏感性、终值。",
770
+ en: "Use when the task matches this method: runs a DCF on Chinese conventions: a 10-year government bond yield as the risk-free rate, A-share equity risk premium, 25% tax (15% for 高新技术企业), local-currency terminal growth, then WACC and sensitivities. Triggers on A-Share DCF Conventions, A-share, Valuation, Cash flow.",
771
+ }),
772
+ requires: Object.freeze(["financial_statements","macro"]),
773
+ overlaps: Object.freeze(["stock-valuation","company-valuation","china-comps-analysis","valuation-investment-strategy","stock-eval","buffett-investment-framework","peter-lynch-skill"]),
774
+ canonicalFor: Object.freeze(["a-share/valuation/dcf"]),
775
+ }),
776
+ "china-sector-overview": Object.freeze({
777
+ market: Object.freeze(["a-share"]),
778
+ stage: "research",
779
+ methods: Object.freeze(["macro","evidence"]),
780
+ roles: Object.freeze(["data_junior"]),
781
+ primaryRole: "data_junior",
782
+ useWhen: Object.freeze({
783
+ zh: "当用户要画 A 股行业全景:市场规模、集中度、政策框架、竞争格局与关键 KPI 时使用;关键词:A 股行业、市场规模、集中度、政策、KPI。",
784
+ en: "Use when the task matches this method: maps an A-share industry: market size and concentration, the policy and regulatory frame, competitive structure with sector-specific KPIs (批价, 装机量, NIM and the like), then themes and valuation context. Triggers on A-Share Sector Landscape, A-share, Macro & industry, Competition, Business analysis.",
785
+ }),
786
+ requires: Object.freeze(["industry_data","filings","macro"]),
787
+ overlaps: Object.freeze([]),
788
+ canonicalFor: Object.freeze([]),
789
+ }),
790
+ "china-catalyst-calendar": Object.freeze({
791
+ market: Object.freeze(["a-share"]),
792
+ stage: "monitoring",
793
+ methods: Object.freeze(["earnings","portfolio"]),
794
+ roles: Object.freeze(["main"]),
795
+ primaryRole: "main",
796
+ useWhen: Object.freeze({
797
+ zh: "当用户要把 A 股披露与事件按时间排成注意力日历:财报、预告、股东大会、解禁、分红回购与政策会议时使用;关键词:A 股催化剂、日历、解禁、披露。",
798
+ en: "Use when the task matches this method: lays A-share disclosures and events out as an attention calendar: earnings and 业绩预告, shareholder meetings, lockup expiries, dividends and buybacks, policy and industry events, flagging names hanging on the same event chain. Triggers on A-Share Catalyst Calendar, A-share, Monitoring, Macro & industry, Earnings.",
799
+ }),
800
+ requires: Object.freeze(["filings","macro"]),
801
+ overlaps: Object.freeze(["catalyst-calendar","catalyst-map","risk-warning-catalysts","thesis-tracker","china-thesis-tracker"]),
802
+ canonicalFor: Object.freeze(["a-share/monitoring/catalysts"]),
803
+ }),
804
+ "china-break-trace": Object.freeze({
805
+ market: Object.freeze(["a-share"]),
806
+ stage: "post-event",
807
+ methods: Object.freeze(["accounting","evidence","risk"]),
808
+ roles: Object.freeze(["data_junior","web_retriever"]),
809
+ primaryRole: "data_junior",
810
+ useWhen: Object.freeze({
811
+ zh: "当用户要对 A 股财报做取证式核查:科目勾稽、利润与现金流背离、应收存货异常、审计意见与问询函时使用;关键词:财务核查、勾稽、现金流背离、问询函。",
812
+ en: "Use when the task matches this method: works through A-share statements forensically: line-item tie-outs, the gap between earnings and cash flow, receivable and inventory anomalies, working-capital behaviour, then what auditor opinions, exchange inquiries and penalties signal. Triggers on A-Share Forensic Review, A-share, Risk, Financial health, Verification.",
813
+ }),
814
+ requires: Object.freeze(["financial_statements","filings"]),
815
+ overlaps: Object.freeze(["earnings-preview","earnings-call-analysis","china-earnings-preview","china-earnings-analysis","china-variance-commentary","financial-report-analyst","10k-digest","financial-health","forensic-accounting","result-validator","fact-check","evidence-gap-check"]),
816
+ canonicalFor: Object.freeze(["a-share/quality/forensic"]),
817
+ }),
818
+ "china-variance-commentary": Object.freeze({
819
+ market: Object.freeze(["a-share"]),
820
+ stage: "post-event",
821
+ methods: Object.freeze(["earnings","evidence"]),
822
+ roles: Object.freeze(["main","data_junior"]),
823
+ primaryRole: "main",
824
+ useWhen: Object.freeze({
825
+ zh: "当用户要把 A 股业绩差异写成可读的中文:超预期 / 低于预期分类、驱动归因、口径与单位一致性时使用;关键词:业绩差异、超预期、归因、口径。",
826
+ en: "Use when the task matches this method: turns variances into readable Chinese commentary: how to classify beat / miss / in-line, where to attribute the driver, how to keep 口径 and units consistent, and how to say what the change actually means. Triggers on A-Share Variance Commentary, A-share, Earnings, Verification.",
827
+ }),
828
+ requires: Object.freeze(["financial_statements","filings"]),
829
+ overlaps: Object.freeze(["earnings-preview","earnings-call-analysis","china-earnings-preview","china-earnings-analysis","financial-report-analyst","10k-digest","china-break-trace"]),
830
+ canonicalFor: Object.freeze(["a-share/post-event/variance-paragraph"]),
831
+ }),
832
+ "china-initiating-coverage": Object.freeze({
833
+ market: Object.freeze(["a-share"]),
834
+ stage: "research",
835
+ methods: Object.freeze(["valuation","financial-health","evidence"]),
836
+ roles: Object.freeze(["main","data_junior"]),
837
+ primaryRole: "main",
838
+ useWhen: Object.freeze({
839
+ zh: "当用户要按券商研究所体例搭一份 A 股首次覆盖:公司行业、三表、估值、图表清单与报告骨架时使用;关键词:首次覆盖、深度报告、三表、估值、目标价。",
840
+ en: "Use when the task matches this method: assembles an initiation report in Chinese sell-side form: company and industry analysis, three-statement modelling, valuation and multiple ranges, the exhibit list and the report skeleton, through to the rating and target-price section. Triggers on A-Share Initiation Report, A-share, Valuation, Business analysis, Filings.",
841
+ }),
842
+ requires: Object.freeze(["financial_statements","filings","peer_data"]),
843
+ overlaps: Object.freeze(["buffett-investment-framework","peter-lynch-skill","stock-eval","stock-screener"]),
844
+ canonicalFor: Object.freeze(["a-share/research/initiation"]),
845
+ }),
846
+ "china-morning-note": Object.freeze({
847
+ market: Object.freeze(["a-share"]),
848
+ stage: "monitoring",
849
+ methods: Object.freeze(["macro","portfolio"]),
850
+ roles: Object.freeze(["main"]),
851
+ primaryRole: "main",
852
+ useWhen: Object.freeze({
853
+ zh: "当用户要按 A 股卖方晨会节奏写一份当日策略:隔夜外盘、盘前情绪、解禁披露事件与盯盘要点时使用;关键词:晨会、盘前、隔夜、盯盘。",
854
+ en: "Use when the task matches this method: writes the pre-open desk note on Chinese sell-side timing (07:00–08:30): overnight and external markets, pre-market sentiment, today’s unlock and disclosure events, what to watch intraday, distilled into 2–4 ideas for the session. Triggers on A-Share Morning Note, A-share, Monitoring, Portfolio.",
855
+ }),
856
+ requires: Object.freeze(["macro","filings"]),
857
+ overlaps: Object.freeze([]),
858
+ canonicalFor: Object.freeze([]),
859
+ }),
860
+ "china-thesis-tracker": Object.freeze({
861
+ market: Object.freeze(["a-share"]),
862
+ stage: "monitoring",
863
+ methods: Object.freeze(["evidence","portfolio"]),
864
+ roles: Object.freeze(["main"]),
865
+ primaryRole: "main",
866
+ useWhen: Object.freeze({
867
+ zh: "当用户要为 A 股持仓与自选逐只维护投资逻辑、跟踪数据点与催化剂,并更新有效性时使用;关键词:A 股论点、持仓跟踪、催化剂、有效性。",
868
+ en: "Use when the task matches this method: keeps a live thesis per holding and watchlist name: states the premises, tracks the key data points and catalysts, updates validity as new filings land, and argues maintain / add / reduce / exit with a target price and a stop. Triggers on A-Share Thesis Tracker, A-share, Monitoring, Portfolio.",
869
+ }),
870
+ requires: Object.freeze(["portfolio","filings","price_history"]),
871
+ overlaps: Object.freeze(["catalyst-calendar","catalyst-map","china-catalyst-calendar","risk-warning-catalysts","thesis-tracker"]),
872
+ canonicalFor: Object.freeze([]),
873
+ }),
874
+ "china-idea-generation": Object.freeze({
875
+ market: Object.freeze(["a-share"]),
876
+ stage: "research",
877
+ methods: Object.freeze(["screening","technical"]),
878
+ roles: Object.freeze(["main"]),
879
+ primaryRole: "main",
880
+ useWhen: Object.freeze({
881
+ zh: "当用户要按量化筛选、主题线索与形态识别系统性地找 A 股多空标的时使用;关键词:A 股选股、筛选、主题、形态、多空。",
882
+ en: "Use when the task matches this method: surfaces A-share names along three rails — quantitative screens, thematic leads and pattern recognition — producing long and short lists with, per name, the catalyst, why now, a conviction tier and the next check. Triggers on A-Share Idea Screening, A-share, Technicals, Portfolio.",
883
+ }),
884
+ requires: Object.freeze(["price_history","financial_statements"]),
885
+ overlaps: Object.freeze([]),
886
+ canonicalFor: Object.freeze([]),
887
+ }),
888
+ "company-valuation": Object.freeze({
889
+ market: Object.freeze(["us-stock"]),
890
+ stage: "research",
891
+ methods: Object.freeze(["valuation","financial-health"]),
892
+ roles: Object.freeze(["data_junior"]),
893
+ primaryRole: "data_junior",
894
+ useWhen: Object.freeze({
895
+ zh: "当用户要用 DCF、同业倍数与先例交易估企业价值,并把 EV 桥到股权价值时使用;关键词:企业价值、股权价值桥、DCF、先例交易。",
896
+ en: "Use when the task matches this method: triangulates enterprise and equity value: a DCF on normalized earnings, cross-checked against peer multiples and precedent deal multiples, then an explicit enterprise-to-equity bridge that itemizes debt-like charges, minority interests, associates and any pension deficit. Triggers on Company Valuation, Valuation, Cash flow, US equity.",
897
+ }),
898
+ requires: Object.freeze(["financial_statements","peer_data","price_history"]),
899
+ overlaps: Object.freeze(["stock-valuation","china-dcf","china-comps-analysis","valuation-investment-strategy","stock-eval","buffett-investment-framework","peter-lynch-skill"]),
900
+ canonicalFor: Object.freeze(["us/valuation/dcf"]),
901
+ }),
902
+ "wacc-computation": Object.freeze({
903
+ market: Object.freeze(["us-stock"]),
904
+ stage: "research",
905
+ methods: Object.freeze(["valuation","risk"]),
906
+ roles: Object.freeze(["data_junior"]),
907
+ primaryRole: "data_junior",
908
+ useWhen: Object.freeze({
909
+ zh: "当用户要拆解 CAPM 输入、可比 β 去杠杆 / 再杠杆与税后债务成本,算 WACC 与敏感性区间时使用;关键词:WACC、CAPM、β、股权风险溢价、资本成本。",
910
+ en: "Use when the task matches this method: builds the discount rate piece by piece — CAPM inputs (risk-free rate, beta, equity risk premium, size and country premia), unlevering and relevering peer betas on the target's capital structure, market-value weights on the after-tax cost of debt — and ends on a beta-by-premium sensitivity range. Triggers on WACC Computation, Valuation, Risk, US equity.",
911
+ }),
912
+ requires: Object.freeze(["financial_statements","price_history","macro"]),
913
+ overlaps: Object.freeze([]),
914
+ canonicalFor: Object.freeze(["us/valuation/wacc"]),
915
+ }),
916
+ "three-statement-modeling": Object.freeze({
917
+ market: Object.freeze(["global"]),
918
+ stage: "research",
919
+ methods: Object.freeze(["accounting","financial-health"]),
920
+ roles: Object.freeze(["data_junior"]),
921
+ primaryRole: "data_junior",
922
+ useWhen: Object.freeze({
923
+ zh: "当用户要搭一张联动的三表模型,并用每期平衡检查点名不平的项目时使用;关键词:三表模型、勾稽、资产负债表、现金流、平衡检查。",
924
+ en: "Use when the task matches this method: assembles a linked three-statement model in a fixed order — one place for drivers, an income statement built from revenue, PP&E / working-capital / debt schedules driving the balance sheet, a cash flow statement derived entirely from the deltas — with a balance check on every period that names the ones that do not tie. Triggers on Three-Statement Modeling, Financial health, Cash flow, Business analysis.",
925
+ }),
926
+ requires: Object.freeze(["financial_statements"]),
927
+ overlaps: Object.freeze([]),
928
+ canonicalFor: Object.freeze([]),
929
+ }),
930
+ "credit-analysis": Object.freeze({
931
+ market: Object.freeze(["us-stock"]),
932
+ stage: "research",
933
+ methods: Object.freeze(["risk","financial-health"]),
934
+ roles: Object.freeze(["data_junior"]),
935
+ primaryRole: "data_junior",
936
+ useWhen: Object.freeze({
937
+ zh: "当用户要判断一家公司能否穿过周期还债,算杠杆、利息覆盖、DSCR、FCF / 债务与流动性时使用;关键词:偿债能力、DSCR、杠杆、信用分析。",
938
+ en: "Use when the task matches this method: answers one question: can this borrower service and repay through the cycle. Five ratio families — leverage, interest coverage, DSCR, free cash flow to debt, liquidity — each on a normalized and a stressed basis, then collateral haircuts, recovery ranking, covenant headroom and who actually stands behind it. Triggers on Credit Analysis, Risk, Financial health, US equity.",
939
+ }),
940
+ requires: Object.freeze(["financial_statements","filings"]),
941
+ overlaps: Object.freeze([]),
942
+ canonicalFor: Object.freeze([]),
943
+ }),
944
+ "ecl-computation": Object.freeze({
945
+ market: Object.freeze(["global"]),
946
+ stage: "research",
947
+ methods: Object.freeze(["accounting","risk"]),
948
+ roles: Object.freeze(["data_junior"]),
949
+ primaryRole: "data_junior",
950
+ useWhen: Object.freeze({
951
+ zh: "当用户要按 IFRS 9 三阶段拆分预期信用损失:阶段迁徙、PD / LGD / EAD、账龄矩阵与情景加权时使用;关键词:预期信用损失、IFRS 9、PD、LGD、减值。",
952
+ en: "Use when the task matches this method: takes the IFRS 9 impairment logic apart: stage assignment and migration, the PD / LGD / EAD parameters, the simplified provision matrix over aging buckets, macro scenario weighting and coverage ratios, then one more question — what changes if the downside scenario gains ten points of probability. Triggers on Expected Credit Loss, Risk, Financial health, Filings.",
953
+ }),
954
+ requires: Object.freeze(["financial_statements","filings"]),
955
+ overlaps: Object.freeze([]),
956
+ canonicalFor: Object.freeze([]),
957
+ }),
958
+ "insurance-reserving": Object.freeze({
959
+ market: Object.freeze(["global"]),
960
+ stage: "research",
961
+ methods: Object.freeze(["accounting","risk"]),
962
+ roles: Object.freeze(["data_junior"]),
963
+ primaryRole: "data_junior",
964
+ useWhen: Object.freeze({
965
+ zh: "当用户要看保险准备金链条:赔款发展三角、链式法、Bornhuetter-Ferguson、IBNR 与综合成本率时使用;关键词:保险准备金、IBNR、发展三角、综合成本率。",
966
+ en: "Use when the task matches this method: runs the reserve chain end to end: loss development triangles, age-to-age factors, chain ladder and Bornhuetter-Ferguson, IBNR, then the combined ratio — keeping \"are unpaid claims estimated well\" and \"does this book actually earn\" as two separate questions. Triggers on Insurance Reserving, Risk, Financial health.",
967
+ }),
968
+ requires: Object.freeze(["financial_statements","filings"]),
969
+ overlaps: Object.freeze([]),
970
+ canonicalFor: Object.freeze([]),
971
+ }),
972
+ "banking-compliance": Object.freeze({
973
+ market: Object.freeze(["global"]),
974
+ stage: "research",
975
+ methods: Object.freeze(["risk","financial-health"]),
976
+ roles: Object.freeze(["data_junior"]),
977
+ primaryRole: "data_junior",
978
+ useWhen: Object.freeze({
979
+ zh: "当用户要看银行资本与流动性指标:CET1、RWA、杠杆率、LCR / NSFR 与压力形状时使用;关键词:银行资本、CET1、RWA、LCR、NSFR。",
980
+ en: "Use when the task matches this method: the hardest numbers on a bank name: CET1 / Tier 1 / total capital adequacy, risk-weighted assets and their weight structure, the leverage ratio, LCR and NSFR, plus a pass that asks whether capital still holds once defaults arrive. Triggers on Bank Capital Ratios, Risk, Financial health, Macro & industry.",
981
+ }),
982
+ requires: Object.freeze(["financial_statements","filings"]),
983
+ overlaps: Object.freeze([]),
984
+ canonicalFor: Object.freeze([]),
985
+ }),
986
+ "forensic-accounting": Object.freeze({
987
+ market: Object.freeze(["global"]),
988
+ stage: "review",
989
+ methods: Object.freeze(["accounting","evidence"]),
990
+ roles: Object.freeze(["data_junior"]),
991
+ primaryRole: "data_junior",
992
+ useWhen: Object.freeze({
993
+ zh: "当用户要用 Benford、整数重复金额、资金循环与供应商关联方重合作取证式排查时使用;关键词:取证会计、Benford、资金循环、关联方。",
994
+ en: "Use when the task matches this method: screens a ledger forensically: Benford first-digit tests, round-number and repeated-amount patterns, round-trip flows, vendor and related-party overlaps — written up as an evidence chain that can survive review and cross-examination. Triggers on Forensic Ledger Screening, Verification, Risk, Financial health.",
995
+ }),
996
+ requires: Object.freeze(["financial_statements","filings","user_input"]),
997
+ overlaps: Object.freeze(["financial-health","financial-report-analyst","china-break-trace","result-validator","fact-check","evidence-gap-check"]),
998
+ canonicalFor: Object.freeze([]),
999
+ }),
1000
+ "cross-market-listing-choice": Object.freeze({
1001
+ market: Object.freeze(["a-share","us-stock"]),
1002
+ stage: "review",
1003
+ methods: Object.freeze(["portfolio","tax","risk"]),
1004
+ roles: Object.freeze(["main","data_junior"]),
1005
+ primaryRole: "main",
1006
+ useWhen: Object.freeze({
1007
+ zh: "当同一家公司有 A/H、ADR/港股多条上市线,用户要选一条持有、加仓或观察时使用;关键词:A/H 溢价、ADR、选线、汇率、股息税。",
1008
+ en: "Use when the task matches this method: picks which listing of a single issuer to hold, add, or watch: A/H premium and currency/dividend withholding, liquidity and channel access, ADR conversion ratios and filing paths. The company is researched once — A and H are two lines of the same business, so what changes is spread, tax, currency and whether you can reach it. Triggers on Cross-Market Listing Choice, A-share, US equity, Portfolio, Risk.",
1009
+ }),
1010
+ requires: Object.freeze(["price_history","fx","filings"]),
1011
+ overlaps: Object.freeze([]),
1012
+ canonicalFor: Object.freeze([]),
1013
+ }),
1014
+ })
1015
+
1016
+ /** Resolve a reserved role to the method set it executes today. */
1017
+ export function selectedSkillRoleKey(role) {
1018
+ return SELECTED_SKILL_ROLE_ALIASES[role] ?? role
1019
+ }
1020
+
1021
+ /** One entry per catalog name; a missing row is a catalog/provider drift, not an empty list. */
1022
+ export function selectedSkillRouting(name) {
1023
+ return SELECTED_SKILL_ROUTING[name]
1024
+ }
1025
+
1026
+ /** Catalog entries a role may load. Callers still apply the enabled selection. */
1027
+ export function selectedSkillNamesForRole(role, catalog) {
1028
+ const key = selectedSkillRoleKey(role)
1029
+ return catalog.filter((entry) => SELECTED_SKILL_ROUTING[entry.name]?.roles.includes(key)).map((entry) => entry.name)
1030
+ }
1031
+
1032
+ /** Trigger text used by the host catalog, the role prompt and the card. */
1033
+ export function selectedSkillUseWhen(name, locale = 'zh') {
1034
+ const routing = SELECTED_SKILL_ROUTING[name]
1035
+ return routing?.useWhen[locale] ?? routing?.useWhen.zh ?? ''
1036
+ }