@v587d/capital-generation 2.7.5 → 2.7.7

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 (35) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/README.md +6 -6
  3. package/THIRD_PARTY_NOTICES.md +12 -10
  4. package/capital-config/client.js +2 -2
  5. package/capital-config/package.json +1 -1
  6. package/capital-watchlist/package.json +1 -1
  7. package/chart-ui/package.json +1 -1
  8. package/lib/agents/selected-skills-provider.js +91 -41
  9. package/lib/index.js +3 -2
  10. package/lib/web-retriever/local-fetch.d.ts +1 -1
  11. package/lib/web-retriever/local-fetch.js +1 -1
  12. package/lib/web-retriever/wind-client.d.ts +1 -1
  13. package/lib/web-retriever/wind-client.js +1 -1
  14. package/package.json +1 -1
  15. package/selected-skills/InvestSkill/UPSTREAM.md +2 -2
  16. package/selected-skills/catalog.js +105 -10
  17. package/selected-skills/claude-for-financial-services-cn/UPSTREAM.md +49 -37
  18. package/selected-skills/claude-for-financial-services-cn/vertical-plugins/china-finance/skills/china-catalyst-calendar/SKILL.md +1 -1
  19. package/selected-skills/claude-for-financial-services-cn/vertical-plugins/china-finance/skills/china-comps-analysis/SKILL.md +1 -1
  20. package/selected-skills/claude-for-financial-services-cn/vertical-plugins/china-finance/skills/china-idea-generation/SKILL.md +24 -20
  21. package/selected-skills/claude-for-financial-services-cn/vertical-plugins/china-finance/skills/china-initiating-coverage/SKILL.md +1 -1
  22. package/selected-skills/claude-for-financial-services-cn/vertical-plugins/china-finance/skills/china-morning-note/SKILL.md +27 -41
  23. package/selected-skills/claude-for-financial-services-cn/vertical-plugins/china-finance/skills/china-sector-overview/SKILL.md +1 -1
  24. package/selected-skills/claude-for-financial-services-cn/vertical-plugins/china-finance/skills/china-thesis-tracker/SKILL.md +22 -18
  25. package/selected-skills/trading-skills/UPSTREAM.md +30 -16
  26. package/selected-skills/trading-skills/skills/catalyst-map/SKILL.md +1 -1
  27. package/selected-skills/trading-skills/skills/evidence-gap-check/SKILL.md +1 -1
  28. package/selected-skills/trading-skills/skills/execution-plan-check/SKILL.md +1 -1
  29. package/selected-skills/trading-skills/skills/journal-pattern-analyzer/SKILL.md +1 -1
  30. package/selected-skills/trading-skills/skills/portfolio-concentration/SKILL.md +1 -1
  31. package/selected-skills/trading-skills/skills/position-management/SKILL.md +1 -1
  32. package/selected-skills/trading-skills/skills/position-sizing/SKILL.md +1 -1
  33. package/selected-skills/trading-skills/skills/position-sizing/references/calculation-helpers.md +3 -1
  34. package/selected-skills/trading-skills/skills/thesis-validation/SKILL.md +1 -1
  35. package/selected-skills/trading-skills/skills/watchlist-review/SKILL.md +1 -1
@@ -22,6 +22,17 @@ function selectedNames(selection) {
22
22
  function readSelection(source) {
23
23
  return typeof source === 'function' ? source() : source;
24
24
  }
25
+ // 选择指纹只认 catalog 的 key 集合:pre-step 每轮拿它对比"上次交给注册表的选择",
26
+ // 变了才失效目录缓存,未变就零成本放行。
27
+ function selectionFingerprint(selection) {
28
+ return SELECTED_SKILL_CATALOG.map(({ key }) => (selection[key] === true ? '1' : '0')).join('');
29
+ }
30
+ // agent/pre-step 是 dsh-agent 声明的事件,类型不在本包的 import 面里;按结构挂到注入后的
31
+ // Agent context(其 scope tag 就是该 Agent,dispatch 的 scope filter 才放行这条监听)。
32
+ function onPreStepEvent(ctx, listener) {
33
+ const events = ctx;
34
+ return events.on?.('agent/pre-step', listener);
35
+ }
25
36
  function strictCapitalPreset(ctx, agent) {
26
37
  try {
27
38
  const presets = ctx.get?.('agentPresets');
@@ -35,62 +46,101 @@ function strictCapitalPreset(ctx, agent) {
35
46
  /** Register explicitly selected community experiments on the Capital root Agent only. */
36
47
  export function registerRootSelectedSkills(ctx, selection, createFilesystemProvider = createFilesystemSkillProvider) {
37
48
  // Static callers retain the cheap all-disabled fast path. The Capital plugin
38
- // passes a reader so a settings toggle is observed for the next root Agent.
49
+ // passes a reader so a settings toggle is observed at the next step of every
50
+ // live root Agent: list()/get() filter against the current selection, and the
51
+ // pre-step hook below refreshes the visible catalog when the selection changes.
39
52
  if (typeof selection !== 'function' && selectedNames(selection).size === 0)
40
53
  return;
41
54
  const listenCtx = ctx.root ?? ctx;
42
55
  if (typeof listenCtx.on !== 'function')
43
56
  return;
44
- const stop = listenCtx.on('agent/created', ({ agent }) => {
57
+ const stop = listenCtx.on('agent/created', async ({ agent }) => {
45
58
  if (!agent || !isRootAgent(agent) || !strictCapitalPreset(ctx, agent))
46
59
  return;
47
- const enabled = selectedNames(readSelection(selection));
48
- if (enabled.size === 0)
49
- return;
50
60
  const agentCtx = agent.ctx;
51
61
  if (!agentCtx || typeof agentCtx.inject !== 'function') {
52
62
  ctx.logger?.warn?.('capital-generation: selected skills are unavailable (root Agent cannot inject skills)');
53
63
  return;
54
64
  }
55
- agentCtx.inject(['skills'], (injectedCtx) => {
56
- const skills = injectedCtx.skills;
57
- if (typeof skills?.registerProvider !== 'function') {
58
- ctx.logger?.warn?.('capital-generation: selected skills are unavailable (root Agent has no skills registry)');
59
- return;
60
- }
61
- let filesystemProvider;
62
- injectedCtx.effect(() => {
63
- const unregister = skills.registerProvider((control) => {
64
- filesystemProvider = createFilesystemProvider(injectedCtx, control, {
65
- providerName: PROVIDER_NAME,
66
- includeDefaultRoots: false,
67
- customSkillDirs: SKILL_ROOTS,
68
- watch: true,
65
+ try {
66
+ // agent/created 是串行事件、DSH 等监听器 settle 才继续创建:await 注入 Fiber,
67
+ // provider 与 pre-step 钩子都在首轮 prompt 前落位(首轮 catalog 不与注册竞态)。
68
+ await agentCtx.inject(['skills'], (injectedCtx) => {
69
+ const skills = injectedCtx.skills;
70
+ if (typeof skills?.registerProvider !== 'function') {
71
+ ctx.logger?.warn?.('capital-generation: selected skills are unavailable (root Agent has no skills registry)');
72
+ return;
73
+ }
74
+ let filesystemProvider;
75
+ let control;
76
+ // 上次交给 skills 注册表的选择指纹。开关是 settings 偏好,不在 Agent 创建时定格:
77
+ // 全关也照常注册 provider(否则会话创建后打开开关永远不出现),靠下面的 pre-step
78
+ // 钩子每轮对齐设置。
79
+ let served = selectionFingerprint(readSelection(selection));
80
+ injectedCtx.effect(() => {
81
+ const unregister = skills.registerProvider((registration) => {
82
+ control = registration;
83
+ filesystemProvider = createFilesystemProvider(injectedCtx, registration, {
84
+ providerName: PROVIDER_NAME,
85
+ includeDefaultRoots: false,
86
+ customSkillDirs: SKILL_ROOTS,
87
+ watch: true,
88
+ });
89
+ const provider = {
90
+ name: PROVIDER_NAME,
91
+ async list(options) {
92
+ // 调用期现读:开关是 settings 偏好,不许在 Agent 创建时定格。
93
+ const enabled = selectedNames(readSelection(selection));
94
+ // 全关是默认常态:短路掉,不碰快照目录(filesystem watcher 在它的 list()
95
+ // 里才启动,短路保证默认关闭的会话不起任何 watcher)。
96
+ if (enabled.size === 0)
97
+ return [];
98
+ const result = await filesystemProvider.list(options);
99
+ if (Array.isArray(result))
100
+ return result.filter((candidate) => enabled.has(candidate.name));
101
+ return { ...result, candidates: result.candidates.filter((candidate) => enabled.has(candidate.name)) };
102
+ },
103
+ get(candidate, options) {
104
+ if (!selectedNames(readSelection(selection)).has(candidate.name)) {
105
+ throw new Error(`selected skill is not enabled: ${candidate.name}`);
106
+ }
107
+ return filesystemProvider.get(candidate, options);
108
+ },
109
+ };
110
+ return provider;
69
111
  });
70
- const provider = {
71
- name: PROVIDER_NAME,
72
- async list(options) {
73
- const result = await filesystemProvider.list(options);
74
- if (Array.isArray(result))
75
- return result.filter((candidate) => enabled.has(candidate.name));
76
- return { ...result, candidates: result.candidates.filter((candidate) => enabled.has(candidate.name)) };
77
- },
78
- get(candidate, options) {
79
- if (!enabled.has(candidate.name)) {
80
- throw new Error(`selected skill is not enabled: ${candidate.name}`);
112
+ // 每轮 pre-step 重读开关:集合变了就调 provider control 的 invalidate(),失效
113
+ // skills 的目录缓存(revision++),tool-skill 随后的 catalog 快照因此按最新开关
114
+ // 重算;未变则 digest 不变、catalog 不重发。必须在放行 next() 之前做完——
115
+ // waterfall 里 tool-skill 是 await next() 之后才快照,但监听器注册顺序不归我们
116
+ // 管,先做完再放行在两种顺序下都赶得上本轮快照。设置读取失败只降级,不阻断本轮。
117
+ const stopPreStep = onPreStepEvent(injectedCtx, (_payload, next) => {
118
+ try {
119
+ const fingerprint = selectionFingerprint(readSelection(selection));
120
+ if (fingerprint !== served) {
121
+ served = fingerprint;
122
+ control?.invalidate();
81
123
  }
82
- return filesystemProvider.get(candidate, options);
83
- },
124
+ }
125
+ catch (error) {
126
+ ctx.logger?.warn?.(`capital-generation: selected skill settings unreadable (${String(error)})`);
127
+ }
128
+ return next();
129
+ });
130
+ return () => {
131
+ if (typeof stopPreStep === 'function')
132
+ stopPreStep();
133
+ unregister();
134
+ void filesystemProvider?.dispose();
135
+ filesystemProvider = undefined;
84
136
  };
85
- return provider;
86
- });
87
- return () => {
88
- unregister();
89
- void filesystemProvider?.dispose();
90
- filesystemProvider = undefined;
91
- };
92
- }, `capital-generation: selected skills for ${agentSessionId(agent) ?? 'root'}`);
93
- });
137
+ }, `capital-generation: selected skills for ${agentSessionId(agent) ?? 'root'}`);
138
+ });
139
+ }
140
+ catch (error) {
141
+ // selected skills 是可选能力:注入失败只降级告警,不能把整个 Agent 创建挡掉。
142
+ ctx.logger?.warn?.(`capital-generation: selected skills are unavailable (${String(error)})`);
143
+ }
94
144
  });
95
145
  ctx.effect?.(() => () => {
96
146
  if (typeof stop === 'function')
package/lib/index.js CHANGED
@@ -205,8 +205,9 @@ export function apply(ctx, config) {
205
205
  return resolvedConfig;
206
206
  };
207
207
  const effectiveConfig = readEffectiveConfig();
208
- // selectedSkills 是 live 的 settings 偏好:按 root Agent 创建时重读;无 settings
209
- // 服务时沿用 preset 配置,避免为静态关闭配置额外挂一个永远空转的监听器。
208
+ // selectedSkills 是 live 的 settings 偏好:provider 在每轮 agent/pre-step 与每次
209
+ // list()/get() 调用现读,切换开关不需要新建会话(见 docs/dev/selected-skills.md);
210
+ // 无 settings 服务时沿用 preset 配置,避免为静态关闭配置额外挂一个永远空转的监听器。
210
211
  const selectedSkills = typeof settings?.describe === 'function'
211
212
  ? () => readEffectiveConfig().selectedSkills ?? {}
212
213
  : effectiveConfig.selectedSkills ?? {};
@@ -6,7 +6,7 @@
6
6
  * between validation and connect. Closing that window would require a custom
7
7
  * dispatcher; this module keeps the same explicit trade-off as dsh-search-first.
8
8
  */
9
- export declare const LOCAL_FETCH_CLIENT_VERSION = "2.7.5";
9
+ export declare const LOCAL_FETCH_CLIENT_VERSION = "2.7.7";
10
10
  export declare const LOCAL_FETCH_MAX_URL_LENGTH = 2048;
11
11
  export type LocalFetchErrorCode = 'ABORTED' | 'TIMEOUT' | 'INVALID_URL' | 'BLOCKED_URL' | 'DNS' | 'REDIRECT' | 'HTTP' | 'TOO_LARGE' | 'UNSUPPORTED_CONTENT_TYPE';
12
12
  export declare class LocalFetchError extends Error {
@@ -7,7 +7,7 @@
7
7
  * dispatcher; this module keeps the same explicit trade-off as dsh-search-first.
8
8
  */
9
9
  import { htmlToMarkdown, stripInvisibleText } from './html-markdown.js';
10
- export const LOCAL_FETCH_CLIENT_VERSION = '2.7.5';
10
+ export const LOCAL_FETCH_CLIENT_VERSION = '2.7.7';
11
11
  export const LOCAL_FETCH_MAX_URL_LENGTH = 2048;
12
12
  export class LocalFetchError extends Error {
13
13
  code;
@@ -52,7 +52,7 @@ export interface WindCallResult {
52
52
  * `test/chart-composition.test.mjs` 守着(会因漂移而失败),这里原本是写死的第二处,
53
53
  * 一次发版就得记得改两遍。所以本常量由测试一并核对(见 `test/wind-client.test.mjs`)。
54
54
  */
55
- export declare const WIND_CLIENT_VERSION = "2.7.5";
55
+ export declare const WIND_CLIENT_VERSION = "2.7.7";
56
56
  export interface WindClient {
57
57
  callTool(toolName: string, args: Record<string, unknown>, signal?: AbortSignal): Promise<WindCallResult>;
58
58
  }
@@ -35,7 +35,7 @@ export const WIND_SERVER_ENDPOINTS = {
35
35
  * `test/chart-composition.test.mjs` 守着(会因漂移而失败),这里原本是写死的第二处,
36
36
  * 一次发版就得记得改两遍。所以本常量由测试一并核对(见 `test/wind-client.test.mjs`)。
37
37
  */
38
- export const WIND_CLIENT_VERSION = '2.7.5';
38
+ export const WIND_CLIENT_VERSION = '2.7.7';
39
39
  function errorText(error) {
40
40
  return error instanceof Error ? error.message : String(error);
41
41
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@v587d/capital-generation",
3
- "version": "2.7.5",
3
+ "version": "2.7.7",
4
4
  "description": "Capital Generation:面向中国散户的 AI 投资助手插件(Capital mode Agent Preset)",
5
5
  "icon": "assets/cg-icon.png",
6
6
  "author": "v587d",
@@ -63,8 +63,8 @@
63
63
  - Runtime status: `experimental` / 显式实验。默认全关,只在使用者于「插件」→ Capital Generation →「配置」
64
64
  逐格打开后,对**之后新建**的 Capital 根 Agent 可见;子 Agent 不继承。
65
65
  - Financial boundary: 正文口径天生是美股(SEC EDGAR / Form 4 / 13F、FRED、美国税制),并且多模块给出
66
- 0–10 打分与分批仓位的写法。本插件不提供投资建议:每条 catalog 的 `riskNote` 写明打分是自洽度信号、
67
- 股数区间是推演练习,不是订单,也不承诺表现。
66
+ 0–10 打分与分批仓位的写法。本插件不提供代交易服务(没有券商接口,不代使用者下单或改单):
67
+ 每条 catalog 的 `riskNote` 写明打分是自洽度信号、股数区间是推演练习,不是订单,也不承诺表现。
68
68
  - Data-fetch assumption: 每颗 skill 开篇都要求 Agent 先用网页搜索取实时报价。**这不授予新权限**——
69
69
  取数仍受本插件的角色与工具边界约束(主 Agent 委派、原始 rows 不出工具层),skill 正文只是方法论材料。
70
70
  - Review status: 收录供使用者自行实验,不构成对任何金融方法的背书。复核前先读上面的 Catalog scope,
@@ -494,8 +494,8 @@ export const SELECTED_SKILL_CATALOG = Object.freeze([
494
494
  reviewBy: '2026-11-06',
495
495
  tags: ['us-stock', 'portfolio', 'monitoring'],
496
496
  riskNote: {
497
- zh: '正文里的股数区间是推演用的练习,不是买卖指令;本插件不提供投资建议,仓位决定在使用者。',
498
- en: 'Its share-count ranges are rehearsal arithmetic, not orders; this plugin gives no investment advice.',
497
+ zh: '正文里的股数区间是推演用的练习,不是买卖指令;本插件没有券商接口、不替使用者下单,仓位决定在使用者。',
498
+ en: 'Its share-count ranges are rehearsal arithmetic, not orders; this plugin holds no broker interface and places nothing for you — the sizing call stays with you.',
499
499
  },
500
500
  },
501
501
  {
@@ -817,8 +817,8 @@ export const SELECTED_SKILL_CATALOG = Object.freeze([
817
817
  reviewBy: '2026-11-06',
818
818
  tags: ['trade-discipline', 'risk', 'monitoring', 'us-stock'],
819
819
  riskNote: {
820
- zh: '冷启动实验;上游自 2026-03-16 起无提交,启用前请自行复核来源。检查的是计划的可操作性:本插件不下单、不改单,也不给仓位数字。',
821
- en: 'Cold-start experiment; upstream has been quiet since 2026-03-16, so review the sources before use. It reviews whether a plan is executable: this plugin places and amends no orders and gives no position size.',
820
+ zh: '冷启动实验;上游自 2026-03-16 起无提交,启用前请自行复核来源。检查的是计划的可操作性:本插件没有券商接口,不下单、不改单,也不会替你执行任何一笔。',
821
+ en: 'Cold-start experiment; upstream has been quiet since 2026-03-16, so review the sources before use. It reviews whether a plan is executable: this plugin has no broker interface, places and amends no orders and executes nothing for you.',
822
822
  },
823
823
  },
824
824
  {
@@ -878,6 +878,44 @@ export const SELECTED_SKILL_CATALOG = Object.freeze([
878
878
  en: 'Cold-start experiment; upstream has been quiet since 2026-03-16, so review the sources before use. The rule changes it suggests are process exercises: this plugin adjusts no holdings and places no orders on them.',
879
879
  },
880
880
  },
881
+ {
882
+ key: 'positionSizing',
883
+ name: 'position-sizing',
884
+ label: { zh: '入场仓位测算', en: 'Position Sizing' },
885
+ description: {
886
+ zh: '从账户规模、单笔风险预算、入场价与止损价反推一个可辩护的仓位,并把摩擦成本、事件风险与流动性挡在公式之外——它只算大小,不评判这笔该不该做。',
887
+ en: 'Works a defensible size back from account equity, a per-trade risk budget, entry and stop, with trading friction taken into account; it sizes the trade and deliberately does not judge the thesis.',
888
+ },
889
+ owner: 'marian2js',
890
+ repository: 'trading-skills',
891
+ status: 'watchlist',
892
+ lastCommit: '2026-03-16',
893
+ reviewBy: '2026-11-06',
894
+ tags: ['trade-discipline', 'risk', 'portfolio', 'us-stock'],
895
+ riskNote: {
896
+ zh: '冷启动实验;上游自 2026-03-16 起无提交,启用前请自行复核来源。它给出的仓位数字是方法推演,不是订单:本插件没有券商接口,不据它下单,也不替你动任何一笔仓;账户规模与风险预算由你提供,取不到就停下而不是猜。止损、滑点、合约乘数与流动性那一档按美股/境外口径写(A 股 T+1、涨跌停与集合竞价都不成立)。',
897
+ en: 'Cold-start experiment; upstream has been quiet since 2026-03-16, so review the sources before use. The size it produces is a method exercise, not an order: this plugin holds no broker interface, places nothing on it and moves no position for you. Account equity and risk budget come from you — if they are missing it stops rather than guesses. Stops, slippage, contract multipliers and liquidity assumptions are US / offshore conventions (A-share T+1, daily limits and the call auction do not map onto them).',
898
+ },
899
+ },
900
+ {
901
+ key: 'positionManagement',
902
+ name: 'position-management',
903
+ label: { zh: '持仓论点复核', en: 'Position Management' },
904
+ description: {
905
+ zh: '对照原始论点、失效条件、催化剂日历与执行约束复查一笔在手仓位,给出继续持有、减仓、收紧止损还是离场的判断,并交代这个判断建立在哪些证据上。',
906
+ en: '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.',
907
+ },
908
+ owner: 'marian2js',
909
+ repository: 'trading-skills',
910
+ status: 'watchlist',
911
+ lastCommit: '2026-03-16',
912
+ reviewBy: '2026-11-06',
913
+ tags: ['trade-discipline', 'monitoring', 'portfolio', 'us-stock'],
914
+ riskNote: {
915
+ zh: '冷启动实验;上游自 2026-03-16 起无提交,启用前请自行复核来源。持仓加减(持有 / 减仓 / 收紧 / 离场)属于方法推演,本插件没有券商接口、不代你执行任何一笔;原始论点或持仓信息缺失时它按临时口径复查并点名缺口,不编一份干净的事前计划。期权、盘后时段与执行约束那一档按美股/境外口径写,A 股的 T+1、涨跌停与集合竞价在正文里没有对应物。',
916
+ en: 'Cold-start experiment; upstream has been quiet since 2026-03-16, so review the sources before use. The hold / trim / tighten / exit call is a method exercise: this plugin holds no broker interface and executes nothing for you. When the original plan or position detail is missing it reviews provisionally and names the gap instead of inventing a tidy prior plan. Options, extended hours and execution constraints follow US / offshore conventions — A-share T+1, daily price limits and the call auction have no counterpart in the text.',
917
+ },
918
+ },
881
919
  {
882
920
  key: 'chinaEarningsAnalysis',
883
921
  name: 'china-earnings-analysis',
@@ -931,8 +969,8 @@ export const SELECTED_SKILL_CATALOG = Object.freeze([
931
969
  reviewBy: '2026-11-08',
932
970
  tags: ['a-share', 'valuation', 'competition'],
933
971
  riskNote: {
934
- zh: '冷启动实验;上游最近一次提交是 2026-09-14,启用前请自行复核来源。区间随倍数假设大幅移动,末尾的目标价与投资建议属于推演练习,本插件不据它下单,也不给仓位数字。',
935
- en: 'Cold-start experiment; upstream last moved on 2026-09-14, so review the sources before use. The range moves with the multiple assumptions, and the closing target price and recommendation are exercises: this plugin places no orders and derives no position size from them.',
972
+ zh: '冷启动实验;上游最近一次提交是 2026-09-14,启用前请自行复核来源。区间随倍数假设大幅移动,末尾的目标价与投资建议属于推演练习,本插件没有券商接口,不据它下单,也不会替你执行任何一笔。',
973
+ en: 'Cold-start experiment; upstream last moved on 2026-09-14, so review the sources before use. The range moves with the multiple assumptions, and the closing target price and recommendation are exercises: this plugin has no broker interface and places no order on them.',
936
974
  },
937
975
  },
938
976
  {
@@ -969,8 +1007,8 @@ export const SELECTED_SKILL_CATALOG = Object.freeze([
969
1007
  reviewBy: '2026-11-08',
970
1008
  tags: ['a-share', 'macro', 'competition', 'business-analysis'],
971
1009
  riskNote: {
972
- zh: '冷启动实验;上游最近一次提交是 2026-09-14,启用前请自行复核来源。行业口径的统计取不到就写成缺口,不折算成记忆里的数;多空一览与"重点标的、目标价、评级"一节属于推演练习,本插件不据它下单,也不给仓位。',
973
- en: 'Cold-start experiment; upstream last moved on 2026-09-14, so review the sources before use. Industry statistics that do not come back stay a named gap rather than a remembered figure; the long / short list and the 重点标的、目标价、评级 section are exercises — no orders and no position size come from them.',
1010
+ zh: '冷启动实验;上游最近一次提交是 2026-09-14,启用前请自行复核来源。行业口径的统计取不到就写成缺口,不折算成记忆里的数;多空一览与"重点标的、目标价、评级"一节属于推演练习,本插件没有券商接口,不据它下单,也不会替你执行任何一笔。',
1011
+ en: 'Cold-start experiment; upstream last moved on 2026-09-14, so review the sources before use. Industry statistics that do not come back stay a named gap rather than a remembered figure; the long / short list and the 重点标的、目标价、评级 section are exercises, and this plugin — with no broker interface — places no order on them.',
974
1012
  },
975
1013
  },
976
1014
  {
@@ -1045,8 +1083,65 @@ export const SELECTED_SKILL_CATALOG = Object.freeze([
1045
1083
  reviewBy: '2026-11-08',
1046
1084
  tags: ['a-share', 'valuation', 'business-analysis', 'filings'],
1047
1085
  riskNote: {
1048
- zh: '冷启动实验;上游最近一次提交是 2026-09-14,启用前请自行复核来源。五档评级与目标价是把材料写成一个结论的推演练习,本插件不据它下单,也不给仓位数字;报告写在最终答复里、不产出文件,页数只是体量参考。',
1049
- en: 'Cold-start experiment; upstream last moved on 2026-09-14, so review the sources before use. The five-tier rating and target price are a conclusion exercise: this plugin places no orders and gives no position size on them. The report is written into the final reply rather than a file, and the page counts are only a sense of scale.',
1086
+ zh: '冷启动实验;上游最近一次提交是 2026-09-14,启用前请自行复核来源。五档评级与目标价是把材料写成一个结论的推演练习,本插件没有券商接口,不据它下单,也不会替你执行任何一笔;报告写在最终答复里、不产出文件,页数只是体量参考。',
1087
+ en: 'Cold-start experiment; upstream last moved on 2026-09-14, so review the sources before use. The five-tier rating and target price are a conclusion exercise: this plugin has no broker interface and places no order on them. The report is written into the final reply rather than a file, and the page counts are only a sense of scale.',
1088
+ },
1089
+ },
1090
+ {
1091
+ key: 'chinaMorningNote',
1092
+ name: 'china-morning-note',
1093
+ label: { zh: 'A 股晨会纪要', en: 'A-Share Morning Note' },
1094
+ description: {
1095
+ zh: '按国内卖方晨会节奏(开盘前 7:00–8:30)写一份当日策略:隔夜与外盘变化、盘前情绪、当日解禁与披露事件、盯盘要点,收到 2–4 条当日想法。',
1096
+ en: '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.',
1097
+ },
1098
+ owner: 'jwangkun',
1099
+ repository: 'claude-for-financial-services-cn',
1100
+ status: 'watchlist',
1101
+ lastCommit: '2026-09-14',
1102
+ reviewBy: '2026-11-08',
1103
+ tags: ['a-share', 'monitoring', 'portfolio'],
1104
+ riskNote: {
1105
+ zh: '冷启动实验;上游最近一次提交是 2026-09-14,启用前请自行复核来源。晨会里的方向(Long / Short / Watch)、止损位与仓位写法都是推演练习:本插件没有券商接口,不据它下单,也不替你动仓。行情、公告与事件一律走宿主取数通道,没回来的字段写成缺口。',
1106
+ en: 'Cold-start experiment; upstream last moved on 2026-09-14, so review the sources before use. The Long / Short / Watch calls, stop levels and sizing language in the note are a rehearsal exercise: this plugin holds no broker interface, places no order on them and moves no position for you. Quotes, filings and events come through the host retrieval channel, and anything that does not come back is written up as a gap.',
1107
+ },
1108
+ },
1109
+ {
1110
+ key: 'chinaThesisTracker',
1111
+ name: 'china-thesis-tracker',
1112
+ label: { zh: 'A 股持仓论点跟踪', en: 'A-Share Thesis Tracker' },
1113
+ description: {
1114
+ zh: '为持仓与自选逐只维护投资逻辑:记下论点前提、跟踪关键数据点与催化剂、按新披露更新有效性,并给出维持 / 加仓 / 减仓 / 离场的判断与目标价、止损位。',
1115
+ en: '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.',
1116
+ },
1117
+ owner: 'jwangkun',
1118
+ repository: 'claude-for-financial-services-cn',
1119
+ status: 'watchlist',
1120
+ lastCommit: '2026-09-14',
1121
+ reviewBy: '2026-11-08',
1122
+ tags: ['a-share', 'monitoring', 'portfolio'],
1123
+ riskNote: {
1124
+ zh: '冷启动实验;上游最近一次提交是 2026-09-14,启用前请自行复核来源。加仓 / 减仓 / 离场与目标价、止损位属于推演练习:本插件没有券商接口,不据它执行任何一笔,也不掌握你的实际持仓与成本——那些得由你给,缺了就只复查逻辑不动作。',
1125
+ en: 'Cold-start experiment; upstream last moved on 2026-09-14, so review the sources before use. The add / reduce / exit calls with target price and stop are a rehearsal exercise: this plugin holds no broker interface, executes nothing on them and does not know your actual holdings or cost basis — provide them, and with them missing it reviews the logic without recommending action.',
1126
+ },
1127
+ },
1128
+ {
1129
+ key: 'chinaIdeaGeneration',
1130
+ name: 'china-idea-generation',
1131
+ label: { zh: 'A 股选股与机会生成', en: 'A-Share Idea Screening' },
1132
+ description: {
1133
+ zh: '按量化筛选、主题线索与形态识别三条线系统性地找 A 股标的:多空两侧各出清单,逐条写催化剂、为什么现在、信念档与验证下一步。',
1134
+ en: '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.',
1135
+ },
1136
+ owner: 'jwangkun',
1137
+ repository: 'claude-for-financial-services-cn',
1138
+ status: 'watchlist',
1139
+ lastCommit: '2026-09-14',
1140
+ reviewBy: '2026-11-08',
1141
+ tags: ['a-share', 'technicals', 'portfolio'],
1142
+ riskNote: {
1143
+ zh: '冷启动实验;上游最近一次提交是 2026-09-14,启用前请自行复核来源。清单里的 Long / Short 方向、信念档与仓位建议属于推演练习,不是订单:本插件没有券商接口,也不据它们替你下任何一笔;筛选条件要的数字取不到就点名缺口,不用记忆里的数补齐。',
1144
+ en: 'Cold-start experiment; upstream last moved on 2026-09-14, so review the sources before use. The Long / Short directions, conviction tiers and sizing suggestions on the list are a rehearsal exercise, not orders: this plugin holds no broker interface and places nothing for you on them. Numbers a screen needs but retrieval cannot get are named as gaps rather than filled from memory.',
1050
1145
  },
1051
1146
  },
1052
1147
  ])
@@ -37,10 +37,10 @@
37
37
  上游 `CLAUDE.md` 自己写明 "Skills are authored in `vertical-plugins/china-finance/skills/`" 且
38
38
  "Agent plugins bundle vendored copies of their skills. **Never edit bundled copies directly.**"——
39
39
  登记规范根与上游的作者口径一致,那些副本因此在 diff 里与上游逐字节相同。
40
- 3. **取数面改写:9 份 `SKILL.md`,28 处段落级改动(+152 / −200 行)。** 分析结论、判定档位、阈值表、
41
- 报告骨架与输出模板一字未改。可核对的两个总数:这九颗里的 ```python 伪调用围栏 **14 处 → 0**;
42
- `IFIND_DATA_SOURCE_MODE` 开关块在这九颗里 **全部删除**(规范根其余 21 颗与另五条款线照旧带着原文开关——
43
- 不进可选清单的正文不改也不扫,§8.6 第一段那条口径;所以整颗快照里仍有 176 个文件出现这个变量名,
40
+ 3. **取数面改写:12 份 `SKILL.md`,37 处段落级改动(+250 / −333 行)。** 分析结论、判定档位、阈值表、
41
+ 报告骨架与输出模板一字未改。可核对的两个总数:这十二颗里的 ```python 伪调用围栏 **18 处 → 0**;
42
+ `IFIND_DATA_SOURCE_MODE` 开关块在这十二颗里 **全部删除**(规范根其余 19 颗与另五条款线照旧带着原文开关——
43
+ 不进可选清单的正文不改也不扫,§8.6 第一段那条口径;所以整颗快照里仍有 173 个文件出现这个变量名,
44
44
  `grep` 到它不代表改写漏了,运行时那些颗一律被 catalog 闭集挡在读取之外)。
45
45
  本颗的 hazard 与前五颗不同族:**63 颗正文每一颗都把取数层写死进正文**——`## Data Sources (Multi-Tier)`
46
46
  三档服务商(Tier-0 万得 Wind,带 `WIND_API_KEY`、`ak_` 前缀与密钥申请 URL;Tier-1 同花顺 iFind,
@@ -48,12 +48,12 @@
48
48
  `ifind_get_stock_events(query)`、`ak.bond_zh_us_rate()`),尾部统一的 `IFIND_DATA_SOURCE_MODE`
49
49
  环境变量开关块,以及把服务商名写进引用格式的 `Source: AkShare, [date]` 与"所有数字都应来自 …"检查项。
50
50
  改动分六类:
51
- - **TIER(9 份)**:服务商阶梯 → "这一节要的是哪些字段、as-of 哪天"的委派 brief 清单;
51
+ - **TIER(12 份)**:服务商阶梯 → "这一节要的是哪些字段、as-of 哪天"的委派 brief 清单;
52
52
  保留上游的字段词汇(三表、最新价 / PE / PB、板块成分股、指数基准、新闻与公告),
53
53
  删掉的是"谁家有数据、密钥去哪申请"。
54
- - **CALL(9 份、14 处围栏)**:```python 伪调用围栏与 workflow 步骤里的内联调用 → 散文式取数请求。
54
+ - **CALL(12 份、18 处围栏)**:```python 伪调用围栏与 workflow 步骤里的内联调用 → 散文式取数请求。
55
55
  本插件没有 shell(§1.6),这些工具名指向的是快照里那四个 MCP 服务端,运行时不存在。
56
- - **MODE(9 份)**:`IFIND_DATA_SOURCE_MODE` 开关尾块整段删除,换成一句"取数档位由宿主的凭据域决定,
56
+ - **MODE(12 份)**:`IFIND_DATA_SOURCE_MODE` 开关尾块整段删除,换成一句"取数档位由宿主的凭据域决定,
57
57
  这份产出既不配置它,也不向使用者索取凭据"(§5:密钥只进 credentials 域)。
58
58
  - **CITE(5 份)**:引用格式与检查项里的服务商名 → 回到取数通道真正给出的东西(数据集引用、披露文件名与页码)。
59
59
  `巨潮资讯` / 交易所 / 监管机构作为**出处**保留(那是披露场所,也是宿主检索通道本就在用的来源),
@@ -67,33 +67,42 @@
67
67
  唯一带预测形状字段的是东财研报条目上的本年 / 次年 EPS 预测)。所以改写后的正文把这四档写成
68
68
  "卖方单家口径 ≠ 市场共识",情景与差异要么写在去年、自家先前口径或公司披露区间上并**标明是哪种基线**,
69
69
  要么写成缺口——"用记忆里的增速估一个预期"没有任何工具会拦,只能改在正文里。
70
- - **ROUTE(1 处)**:`china-catalyst-calendar` 的 `## Integration with Other Skills` 表原句保留,
71
- 加第五颗同一句前置条件(点名的 skill 只有使用者显式开启才存在于会话里,本插件明确不提供的那两类永远不存在)。
70
+ - **ROUTE(2 处)**:`china-catalyst-calendar` 的 `## Integration with Other Skills` 表原句保留,
71
+ 加第五颗同一句前置条件(点名的 skill 只有使用者显式开启才存在于会话里,本插件明确不提供的那一类——
72
+ 替使用者下单与改单——永远不存在)。本轮判据纠正后这一句在两颗快照的八份正文里一起从"那两类(下单、给仓位)"
73
+ 改成执行面口径,因为仓位测算那颗已经收录。
74
+ `china-idea-generation` 的跟踪清单里有一句直接把下一步指向 `china-catalyst-calendar`——那颗可能没被开启,
75
+ 所以这一句改成活动名(事件日期与是否落地,逐条复查),不改方法论里"要跟踪催化剂"这条。
72
76
  另有两处按同一族处理:**DESC(1 处)**`china-dcf` 的 frontmatter `description` 自己写着
73
77
  "Uses AkShare MCP for financial statements",那半句换成口径描述,方法论部分不动;
74
78
  **CHART(1 处)**`china-initiating-coverage` 的 `**Chart standards:**` 块原文要求
75
79
  "Dark theme or light theme (consistent with firm template)" 与 `Source: AkShare historical data` →
76
80
  改成"这四张图说的是首次覆盖该有什么图表,图由宿主的出图通道渲染(出图只走 `render_chart`,§6.1),
77
81
  主题与标签排版是出图角色的决定",图表清单本身(收入与利润历史、倍数区间带、增长 vs 倍数散点、两年价格线)未改。
78
- **一处就地标注(3 份)**:`china-comps-analysis`、`china-sector-overview`、`china-initiating-coverage`
79
- 的模板以目标价 / 投资建议 / 多空方向收尾,且改动正好落在那份文件的尾块上,因此除了 `riskNote` 之外,
80
- 尾块里另写了一句"属于推演练习、本插件不据它下单也不给仓位"。`china-earnings-analysis` 与
82
+ **就地标注(6 份)**:`china-comps-analysis`、`china-sector-overview`、`china-initiating-coverage`、
83
+ `china-morning-note`、`china-thesis-tracker`、`china-idea-generation`
84
+ 的模板以目标价 / 投资建议 / 多空方向 / 加减仓决策收尾,且改动正好落在那份文件的尾块上,因此除了 `riskNote` 之外,
85
+ 尾块里另写了一句"属于推演练习,本插件没有券商接口,不据它下单,也不会替你执行任何一笔"。`china-earnings-analysis` 与
81
86
  `china-variance-commentary` 的评级只出现在报告骨架的某一节里(没有落到被改写的尾块),正文不动,
82
87
  完全由 catalog 的 `riskNote` 承担——两份都改或都不改都不是诚实的做法,这里是按"改写是否正好落在同一处"划线,
83
88
  线画在这里是为了让下一个人看得见。**评级五档表、`Long / Short` 一览与 `投资建议: [Buy / Hold / Sell]`
84
89
  这些上游判定档位与模板全部原样保留**(§8.6:不为口味改结论)。
85
- 4. **Apache-2.0 §4(b) 的改动声明:上面那 9 份文件各加一行。** 前五份快照是 MIT,再分发不要求在**被改的文件上**
86
- 留痕,改动口径只住在本文件里;Apache-2.0 第 4(b) 条要求"修改过的文件带上显著的声明",所以这九份在一级标题
90
+ 前三份原本那句写的是"不据它下单,也不给仓位",本轮放开晨会纪要 / 逻辑跟踪 / 选股三颗(它们确实给止损位与仓位写法)
91
+ 之后那句成了假话,于是连同 catalog 里对应的四条 `riskNote` 一起改成执行面口径——这是判据纠正的连锁,不是新增改写。
92
+ 4. **Apache-2.0 §4(b) 的改动声明:上面那 12 份文件各加一行。** 前五份快照是 MIT,再分发不要求在**被改的文件上**
93
+ 留痕,改动口径只住在本文件里;Apache-2.0 第 4(b) 条要求"修改过的文件带上显著的声明",所以这十二份在一级标题
87
94
  下面各有一句可见中文声明(点名所钉 commit `d7585ca`、改的是取数与凭据口径、逐条见本文件、方法论未改)。
88
- 其余 54 颗与上游逐字节相同,因此不带这一行。它是许可要求而不是编辑:不改语义、不改结论,
89
- `test/selected-skills-content.test.mjs` 有一条正向断言钉住"这九份必须各带一行",漏一颗就点名那一颗。
95
+ 其余 51 颗与上游逐字节相同,因此不带这一行。它是许可要求而不是编辑:不改语义、不改结论,
96
+ `test/selected-skills-content.test.mjs` 有一条正向断言钉住"这十二份必须各带一行",漏一颗就点名那一颗。
90
97
 
91
- - 收录判断(规范根 31 颗里 9 颗进 catalog,22 颗留在快照里当可审查材料;另五条款线 32 颗整条不进):
92
- - **进(9)**:`china-earnings-analysis`、`china-earnings-preview`、`china-comps-analysis`、`china-dcf`、
98
+ - 收录判断(规范根 31 颗里 12 颗进 catalog,19 颗留在快照里当可审查材料;另五条款线 32 颗整条不进):
99
+ - **进(12)**:`china-earnings-analysis`、`china-earnings-preview`、`china-comps-analysis`、`china-dcf`、
93
100
  `china-sector-overview`、`china-catalyst-calendar`、`china-break-trace`、`china-variance-commentary`、
94
- `china-initiating-coverage`。补的是既有 45 条里没有的形状:A 股卖方体例的业绩点评与超预期分解、
101
+ `china-initiating-coverage` 这九颗补的是当时既有 45 条里没有的形状:A 股卖方体例的业绩点评与超预期分解、
95
102
  财报前情景框架、A 股口径的可比倍数与 DCF 参数(10Y 国债、A 股 ERP、25%/15% 税率)、
96
- A 股披露节奏的催化剂日历、按报表科目与监管文书走的财务核查、差异表述的句子级写法、首次覆盖的报告骨架。
103
+ A 股披露节奏的催化剂日历、按报表科目与监管文书走的财务核查、差异表述的句子级写法、首次覆盖的报告骨架;
104
+ `china-morning-note`、`china-thesis-tracker`、`china-idea-generation` 这三颗是本轮按纠正后的判据收进来的,
105
+ 补的是开盘前那份晨会策略、逐只持仓的逻辑加减与按筛选条件系统性找标的。
97
106
  市场口径是 **A 股**(`tags` 全部带 `a-share`),与美股那 30 多颗互为对照,不通用。
98
107
  - **不进 · 它本身就是取数目录**:`china-market-data`。整颗是四个服务商 MCP 的工具清单
99
108
  (`mcp__ifind__*` / `mcp__akshare__*` 之类工具名表 + 28 个"要什么数据用哪个工具"的配方 +
@@ -107,13 +116,15 @@
107
116
  - **不进 · 同题材的薄一份且结构坏**:`china-comps`(105 行 vs `china-comps-analysis` 207 行)。
108
117
  它带着**两份 frontmatter**(`L1-4` 与 `L37-40` 各一份 `name` / `description`),
109
118
  正文是同一题材的早版;收哪一颗都让"目录名 ↔ frontmatter name ↔ catalog name"的三处一致变复杂。
110
- - **不进 · 给买卖动作与仓位数字**(与 `docs/reference/external-skill-scan-2026-10.md` 既定口径、
111
- 以及第五颗排除 `position-sizing` / `position-management` 同一条线):
112
- `china-morning-note`(晨会纪要的"2-4 条可执行 idea"、`方向: Long / Short / Watch`、止损位与仓位建议)、
113
- `china-thesis-tracker`(`[Maintain / Add / Reduce / Exit]` 与止损位、目标价)、
114
- `china-idea-generation`(选股清单给 `Long` 方向,`Position sizing recommendations` 一节)、
115
- `china-tax-loss-harvesting`(`Full exit: Sell and replace` / `Reduce position` 与执行买卖的清单,
116
- 且税损收割本身是美股应税账户语境的产物)。这四颗**不改写后收进来**,按第五颗的决定整颗不收。
119
+ - **本轮收回来的三颗(判据纠正,2026-10-12)**:`china-morning-note`、`china-thesis-tracker`、
120
+ `china-idea-generation`。这三颗当初按"给买卖方向与仓位数字"整颗不收(第五颗的 `position-sizing` /
121
+ `position-management` 是同一条误读挡的),而 §8.6 第 7 条被读成了内容禁令。本插件不收的从来是**执行面**
122
+ (第 4 条:没有券商下单接口,`mcp-servers/` 连发布包都不进);正文给出方向、止损位或仓位写法属于方法推演,
123
+ 收录后由 catalog 的 `riskNote` 与正文尾块那一句承担口径。改写只消掉取数层(服务商阶梯、```python 伪调用、
124
+ `IFIND_DATA_SOURCE_MODE` 开关),晨会模板的【今日策略】、逻辑跟踪的决策档与选股清单的 Conviction 档原样保留。
125
+ - **不进 · 市场口径(§8.6 第 8 条,不是第 7 条)**:`china-tax-loss-harvesting`。税损收割建立在 wash-sale
126
+ 规则与应税账户的成本基础上,A 股没有这套制度,所以它整颗不适用;`Full exit: Sell and replace` 那几行只是
127
+ 同一件事的表现形状——真正的障碍是口径不成立,不是它写了买卖。
117
128
  - **不进 · 要求产出或读取本地文件(§8.6 第 4、5 条)**:`china-xlsx-author`、`china-pptx-author`
118
129
  (后者的 `Usage` 直接是 `python3 scripts/generate_a_share_ppt.py`)、`china-ppt-template-creator`、
119
130
  `china-deck-refresh`、`china-audit-xls`、`china-ib-check-deck`、`china-clean-data-xls`、
@@ -133,11 +144,11 @@
133
144
  (上游规定不许直接编辑),后者是四份可运行的取数服务端(`server.py` + `requirements.txt` +
134
145
  密钥配置形态)。本插件从不执行快照里的脚本(§8.6 第 4 条的口径:管的是正文,不是文件在不在盘上)。
135
146
  - `test/selected-skills-provider.test.mjs` 用「skills 根目录 − 排除清单」派生本颗的可选清单,
136
- `test/persona.test.mjs` 另把 `china-market-data` / `china-skill-creator` / `china-dcf-model` /
137
- `china-idea-generation` 明确断为不进 catalog。
147
+ `test/persona.test.mjs` 另把 `china-market-data` / `china-skill-creator` / `china-dcf-model` 明确断为
148
+ 不进 catalog(执行面与生产线那一类)。
138
149
  - 复核方法:`git clone` 所钉 commit 后,只对**规范根**逐颗 `diff -r`:
139
150
  `diff -r /tmp/upstream/vertical-plugins/china-finance/skills <快照>/vertical-plugins/china-finance/skills`
140
- —— 差异只应是上面那 9 份 `SKILL.md`(28 段),其余 22 颗与另五条款线、`agent-plugins/`、`mcp-servers/`、
151
+ —— 差异只应是上面那 12 份 `SKILL.md`(37 段),其余 19 颗与另五条款线、`agent-plugins/`、`mcp-servers/`、
141
152
  `LICENSE` 逐字节相同。注意 `agent-plugins/<角色>/skills/` 里有**同名副本**,对整个仓库跑 `diff -r`
142
153
  会把它们一起列出来(本颗没动它们,列出来也不代表漂移);`fund-admin` 那五颗同名 skill 内容更薄,
143
154
  比对时按路径而不是按名字认。
@@ -147,7 +158,7 @@
147
158
  (每条款线的 plugin manifest 与 MCP 接线)、根级 `README.md` / `CLAUDE.md` / `IFIND-INTEGRATION-PLAN.md`。
148
159
  另有一条合规口径,不只是体积:**`mcp-servers/` 连发布包都不进**——四份能连付费数据接口的 python 服务端
149
160
  与本仓排除券商执行面(`trading-skills` 的 `etoro`)是同一条线,凭据只进 credentials 域(§5)。
150
- 不进可选清单的正文(规范根的 22 颗、另五条款线的 32 颗)**随包保留**作为可审查材料,
161
+ 不进可选清单的正文(规范根的 19 颗、另五条款线的 32 颗)**随包保留**作为可审查材料,
151
162
  照 InvestSkill 与 trading-skills 先例:provider 的 `list()` / `get()` 与 `/capital-skills/<name>.md`
152
163
  旁路都按 catalog 闭集过滤,运行时读不到它们。
153
164
  规则**只写裸名**:`test/packaging.test.mjs` 丢掉以 `/` 开头的规则、也不检查带内部斜杠的规则,
@@ -163,11 +174,12 @@
163
174
  - Runtime status: `watchlist` / 默认关闭的显式实验。只有使用者在「插件」→ Capital Generation →「精选 Skills」
164
175
  里逐格打开,它们才对**之后新建**的 Capital 根 Agent 可见;子 Agent 不继承,上游的 MCP 服务端与脚本从不执行。
165
176
  能力标签全部复用既有词表(`a-share` 加各颗自己的 `earnings` / `valuation` / `risk` / `monitoring` /
166
- `macro` / `competition` / `verification` / `business-analysis` / `filings` / `financial-health` / `cash-flow`),
167
- 本颗**没有新增标签**;`riskNote` 逐条写明两件事:评级、目标价与多空方向属于推演练习,
168
- 以及本插件取不到一致预期那一类字段。
169
- - Review status: 2026-11-08 复查上游、许可证与维护状态。这九颗按中国大陆卖方与机构研究惯例写
177
+ `macro` / `competition` / `verification` / `business-analysis` / `filings` / `financial-health` / `cash-flow` /
178
+ `technicals` / `portfolio`),本颗**没有新增标签**;`riskNote` 逐条写明两件事:评级、目标价、多空方向与
179
+ 止损位/仓位写法属于推演练习,以及本插件取不到一致预期那一类字段。
180
+ - Review status: 2026-11-08 复查上游、许可证与维护状态。这十二颗按中国大陆卖方与机构研究惯例写
170
181
  (中金 / 中信 / 华泰体例、申万与中信行业分类、CAS 科目、涨跌停与北向资金口径、A 股披露节奏),
171
- 与美股那三十多颗互为对照而**不通用**;五档评级与目标价那一套是本插件明确不提供的东西,
172
- 收录它们只为让使用者看见卖方流程长什么样,**不构成投资建议**,也不得反向当作监管或会计规则。
182
+ 与美股那三十多颗互为对照而**不通用**;本插件不提供的是执行面——没有券商接口,不据这些结论下单,也不代使用者动仓。
183
+ 五档评级、目标价与仓位写法作为卖方流程的一部分原样收录,逐条标注为推演练习:收录它们只为让使用者看见
184
+ 卖方流程长什么样,**不构成投资建议**,也不得反向当作监管或会计规则。
173
185
  本文件与本仓的收录判断不构成对上游观点、也不构成对 `anthropics/claude-for-financial-services` 观点的背书。
@@ -245,7 +245,7 @@ After catalyst passes:
245
245
  | china-morning-note | Daily catalyst briefing |
246
246
  | china-market-researcher | Sector catalyst themes |
247
247
 
248
- A skill named above is an option for the user, not a step this role can take: only the skills the user switched on exist in this session, and the ones this plugin deliberately does not offer — placing orders, setting position size — are not reachable at all. Say what you would check next and let the user decide.
248
+ A skill named above is an option for the user, not a step this role can take: only the skills the user switched on exist in this session, and what this plugin deliberately does not offer — placing or amending an order on the user's behalf — is not reachable at all. Say what you would check next and let the user decide.
249
249
 
250
250
  ## Quality Checks
251
251
 
@@ -193,4 +193,4 @@ Before delivering:
193
193
  - [ ] Valuation conclusion supported
194
194
  - [ ] Current price verified
195
195
  > 取数档位(接哪家数据服务、用哪个密钥)由宿主的凭据域决定:这张可比表不配置它,也不向使用者索取凭据。
196
- > 目标价区间与最后一行投资建议是把上面这些倍数写成一个结论的**推演练习**,本插件不据它下单,也不给仓位。
196
+ > 目标价区间与最后一行投资建议是把上面这些倍数写成一个结论的**推演练习**,本插件没有券商接口,不据它下单,也不会替你执行任何一笔。