alphacouncil-agent 0.5.4 → 0.6.0

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.
@@ -22,24 +22,32 @@ Request: **$ARGUMENTS**
22
22
  When `$ARGUMENTS` is empty, print exactly this and stop:
23
23
 
24
24
  ```
25
- /alpha MU full council — asks which preset first
26
- /alpha MU quick 4 analysts + debate, no bench, no verification
27
- /alpha MU screen mechanical filings screen only (no model spend)
28
- /alpha MU options IV term structure, skew, positioning (no model spend)
29
- /alpha MU news dated filings and headlines (no model spend)
30
- /alpha market AI what the market is talking about (no model spend)
25
+ /alpha <TICKER> full council — asks which preset first
26
+ /alpha <TICKER> quick 4 analysts + debate, no bench, no verification
27
+ /alpha <TICKER> screen mechanical filings screen only (no model spend)
28
+ /alpha <TICKER> options IV term structure, skew, positioning (no model spend)
29
+ /alpha <TICKER> news dated filings and headlines (no model spend)
30
+ /alpha market <theme> what the market is talking about (no model spend)
31
+
32
+ examples
33
+ /alpha AAPL /alpha 0700.HK quick /alpha 7203.T news
34
+ /alpha NVDA screen /alpha market rates /alpha "is TSM cheap?"
31
35
  ```
32
36
 
37
+ Any listed equity. Filings-based modes need a US filer; for other markets say which market it
38
+ is and use `market_coverage`, rather than returning nothing.
39
+
33
40
  Say plainly that the four marked modes call keyless data tools and spawn no subagents, so
34
41
  they cost nothing beyond this turn. The council modes spawn one subagent per seat, and that
35
42
  is where the spend is.
36
43
 
37
44
  ## Full council
38
45
 
39
- 1. **Ask which preset first.** Call `list_council_options` and present the three with their
40
- seat counts. A council is 7 to 44 seats and that range is the user's time and money.
41
- **Skip the question when the request already answered it** a named roster, "everything",
42
- "be quick". A confirmation nobody needed is an interruption.
46
+ 1. **Ask which masters, once, then run.** Call `list_council_options` and ask only about the
47
+ master bench the six schools by name with their members, plus "all" and "none". Analysts
48
+ default to the eight-seat fan-out; do not ask about them. After the answer, start
49
+ immediately: no preset question, no confirmation. **Skip the question entirely** when the
50
+ request already said (a named school, "everything", "no masters", "be quick").
43
51
  2. Follow `skills/alphacouncil-agent/SKILL.md` from Stage 0. Do not improvise a shorter
44
52
  workflow: a report that looks finished and skipped the bench is worse than an obviously
45
53
  partial one.
@@ -6,14 +6,14 @@
6
6
  },
7
7
  "metadata": {
8
8
  "description": "AlphaCouncil plugins for public-equity research.",
9
- "version": "0.5.4"
9
+ "version": "0.6.0"
10
10
  },
11
11
  "plugins": [
12
12
  {
13
13
  "name": "alphacouncil-agent",
14
14
  "source": "./",
15
15
  "description": "Multi-agent equity research: evidence packets, bull/bear debate, portfolio-manager decision.",
16
- "version": "0.5.4",
16
+ "version": "0.6.0",
17
17
  "author": {
18
18
  "name": "Zhao73"
19
19
  },
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "alphacouncil-agent",
3
- "version": "0.5.4",
3
+ "version": "0.6.0",
4
4
  "description": "Multi-agent public-equity research workflow for Claude Code: spawns analyst workers, gathers sourced JSON evidence packets, runs bull/bear debate, and produces a portfolio-manager Buy/Overweight/Hold/Underweight/Sell decision with a full report.",
5
5
  "author": {
6
6
  "name": "Zhao73"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "alphacouncil-agent",
3
- "version": "0.5.4",
3
+ "version": "0.6.0",
4
4
  "description": "Host-visible or background public-equity research workflow with shared evidence packets.",
5
5
  "author": {
6
6
  "name": "Zhao73"
@@ -22,24 +22,32 @@ Request: **$ARGUMENTS**
22
22
  When `$ARGUMENTS` is empty, print exactly this and stop:
23
23
 
24
24
  ```
25
- /alpha MU full council — asks which preset first
26
- /alpha MU quick 4 analysts + debate, no bench, no verification
27
- /alpha MU screen mechanical filings screen only (no model spend)
28
- /alpha MU options IV term structure, skew, positioning (no model spend)
29
- /alpha MU news dated filings and headlines (no model spend)
30
- /alpha market AI what the market is talking about (no model spend)
25
+ /alpha <TICKER> full council — asks which preset first
26
+ /alpha <TICKER> quick 4 analysts + debate, no bench, no verification
27
+ /alpha <TICKER> screen mechanical filings screen only (no model spend)
28
+ /alpha <TICKER> options IV term structure, skew, positioning (no model spend)
29
+ /alpha <TICKER> news dated filings and headlines (no model spend)
30
+ /alpha market <theme> what the market is talking about (no model spend)
31
+
32
+ examples
33
+ /alpha AAPL /alpha 0700.HK quick /alpha 7203.T news
34
+ /alpha NVDA screen /alpha market rates /alpha "is TSM cheap?"
31
35
  ```
32
36
 
37
+ Any listed equity. Filings-based modes need a US filer; for other markets say which market it
38
+ is and use `market_coverage`, rather than returning nothing.
39
+
33
40
  Say plainly that the four marked modes call keyless data tools and spawn no subagents, so
34
41
  they cost nothing beyond this turn. The council modes spawn one subagent per seat, and that
35
42
  is where the spend is.
36
43
 
37
44
  ## Full council
38
45
 
39
- 1. **Ask which preset first.** Call `list_council_options` and present the three with their
40
- seat counts. A council is 7 to 44 seats and that range is the user's time and money.
41
- **Skip the question when the request already answered it** a named roster, "everything",
42
- "be quick". A confirmation nobody needed is an interruption.
46
+ 1. **Ask which masters, once, then run.** Call `list_council_options` and ask only about the
47
+ master bench the six schools by name with their members, plus "all" and "none". Analysts
48
+ default to the eight-seat fan-out; do not ask about them. After the answer, start
49
+ immediately: no preset question, no confirmation. **Skip the question entirely** when the
50
+ request already said (a named school, "everything", "no masters", "be quick").
43
51
  2. Follow `skills/alphacouncil-agent/SKILL.md` from Stage 0. Do not improvise a shorter
44
52
  workflow: a report that looks finished and skipped the bench is worse than an obviously
45
53
  partial one.
@@ -22,24 +22,32 @@ Request: **$ARGUMENTS**
22
22
  When `$ARGUMENTS` is empty, print exactly this and stop:
23
23
 
24
24
  ```
25
- /alpha MU full council — asks which preset first
26
- /alpha MU quick 4 analysts + debate, no bench, no verification
27
- /alpha MU screen mechanical filings screen only (no model spend)
28
- /alpha MU options IV term structure, skew, positioning (no model spend)
29
- /alpha MU news dated filings and headlines (no model spend)
30
- /alpha market AI what the market is talking about (no model spend)
25
+ /alpha <TICKER> full council — asks which preset first
26
+ /alpha <TICKER> quick 4 analysts + debate, no bench, no verification
27
+ /alpha <TICKER> screen mechanical filings screen only (no model spend)
28
+ /alpha <TICKER> options IV term structure, skew, positioning (no model spend)
29
+ /alpha <TICKER> news dated filings and headlines (no model spend)
30
+ /alpha market <theme> what the market is talking about (no model spend)
31
+
32
+ examples
33
+ /alpha AAPL /alpha 0700.HK quick /alpha 7203.T news
34
+ /alpha NVDA screen /alpha market rates /alpha "is TSM cheap?"
31
35
  ```
32
36
 
37
+ Any listed equity. Filings-based modes need a US filer; for other markets say which market it
38
+ is and use `market_coverage`, rather than returning nothing.
39
+
33
40
  Say plainly that the four marked modes call keyless data tools and spawn no subagents, so
34
41
  they cost nothing beyond this turn. The council modes spawn one subagent per seat, and that
35
42
  is where the spend is.
36
43
 
37
44
  ## Full council
38
45
 
39
- 1. **Ask which preset first.** Call `list_council_options` and present the three with their
40
- seat counts. A council is 7 to 44 seats and that range is the user's time and money.
41
- **Skip the question when the request already answered it** a named roster, "everything",
42
- "be quick". A confirmation nobody needed is an interruption.
46
+ 1. **Ask which masters, once, then run.** Call `list_council_options` and ask only about the
47
+ master bench the six schools by name with their members, plus "all" and "none". Analysts
48
+ default to the eight-seat fan-out; do not ask about them. After the answer, start
49
+ immediately: no preset question, no confirmation. **Skip the question entirely** when the
50
+ request already said (a named school, "everything", "no masters", "be quick").
43
51
  2. Follow `skills/alphacouncil-agent/SKILL.md` from Stage 0. Do not improvise a shorter
44
52
  workflow: a report that looks finished and skipped the bench is worse than an obviously
45
53
  partial one.
package/AGENTS.md CHANGED
@@ -76,12 +76,12 @@ rather than four in a menu of a hundred.
76
76
 
77
77
  | Invocation | What runs | Model spend |
78
78
  |---|---|---|
79
- | `/alpha MU` | Full council — asks which preset first | one subagent per seat |
80
- | `/alpha MU quick` | 4 analysts + debate, no bench, no verification | 7 seats |
81
- | `/alpha MU screen` | Mechanical filings screen only | **none** |
82
- | `/alpha MU options` | IV term structure, skew, positioning | **none** |
83
- | `/alpha MU news` | Dated filings and headlines | **none** |
84
- | `/alpha market AI` | What the market is talking about | **none** |
79
+ | `/alpha <ticker>` | Full council — asks which preset first | one subagent per seat |
80
+ | `/alpha <ticker> quick` | 4 analysts + debate, no bench, no verification | 7 seats |
81
+ | `/alpha <ticker> screen` | Mechanical filings screen only | **none** |
82
+ | `/alpha <ticker> options` | IV term structure, skew, positioning | **none** |
83
+ | `/alpha <ticker> news` | Dated filings and headlines | **none** |
84
+ | `/alpha market <theme>` | What the market is talking about | **none** |
85
85
  | `/alpha` | Lists the modes and stops | **none** |
86
86
 
87
87
  The four marked **none** call keyless data tools and spawn no subagents, so they cost
package/CHANGELOG.md CHANGED
@@ -2,6 +2,58 @@
2
2
 
3
3
  Notable changes per release. Dates are UTC.
4
4
 
5
+ ## [0.6.0] — 2026-07-26
6
+
7
+ Minor rather than patch: **every screened number changes.** Anyone comparing a result from
8
+ 0.5.x will see different figures, and the 0.5.x ones were wrong.
9
+
10
+ ### Fixed
11
+
12
+ - **Quarterly and stub periods were counted as years.** A 10-K reports quarterly and
13
+ acquisition-stub periods alongside annual ones, and the reader keyed only on the end date.
14
+ Lumentum's fiscal 2015 became ten separate "years" — nine quarters and stubs plus the real
15
+ 363-day period — so every multi-year rule averaged quarterly income against annual equity.
16
+ LITE's ten-year ROE read 2.26% and is **-1.64%**; MU's read 10.03% and is **12.83%**.
17
+ Periods must now span 300–400 days, wide enough for a 53-week fiscal year, with instant
18
+ balance-sheet facts exempt because they have no duration.
19
+ - **Tag aliases stopped at the first match instead of merging.** Revenue moved to the ASC 606
20
+ tag in 2022, so a company filing since 2013 appeared to have four years of history — which
21
+ then fired a "listed under ten years" exemption on a decade-old filer. Aliases now merge,
22
+ the preferred one winning a contested year and a later filing winning within one alias.
23
+ - **The dilution rule had never once been computed.** Share counts live under the XBRL
24
+ `shares` unit and the reader asked for `USD`, so it reported `skipped` for every company
25
+ ever screened — seven rules advertised, six ever computed, and a skip is indistinguishable
26
+ from a genuine data gap. AAPL now computes 7 of 7.
27
+
28
+ ### Testing
29
+
30
+ - The existing dilution test passed throughout because its fixture also put share counts
31
+ under `USD` — the same mistake as the reader, so the two agreed with each other. The
32
+ fixture now uses the unit XBRL actually uses.
33
+ - A regression test pins that one company's filings cannot leak into another's result.
34
+ Verified live as well: LITE, then AAPL, then LITE again, identical to the digit.
35
+
36
+ ## [0.5.5] — 2026-07-26
37
+
38
+ ### Fixed
39
+
40
+ - **Five masters never ran.** Aschenbrenner, Druckenmiller, Fisher, Asness and Klarman were
41
+ not in the `masters-core` roster, which is what the standard preset selects, while the
42
+ seat estimate counted every master. The menu offered 21 lenses and the run delivered 16,
43
+ with nothing failing and nothing warning. A test now asserts the roster equals the full
44
+ set rather than merely being large.
45
+
46
+ ### Changed
47
+
48
+ - **Stage 0 asks one question, about the master bench, then runs.** It previously asked which
49
+ preset, then which analysts, then confirmed — an interview before any work. The analysts
50
+ have an obvious default; the bench is the part a user has a view on and where cost varies.
51
+ - `list_council_options` prints the **named** roster: every analyst with what it covers, and
52
+ the six master schools with their members. Presets remain as shortcuts. Naming the seats is
53
+ what made the missing five visible.
54
+ - Command help uses `<TICKER>` with examples across US, Hong Kong and Tokyo listings. One
55
+ real ticker repeated down the column read as if the tool were about that company.
56
+
5
57
  ## [0.5.4] — 2026-07-26
6
58
 
7
59
  ### Fixed
package/README.ja.md CHANGED
@@ -113,16 +113,20 @@ codex plugin marketplace add Zhao73/alphacouncil-agent
113
113
 
114
114
  | 入力 | 実行内容 | モデル消費 |
115
115
  |---|---|---|
116
- | `/alpha MU` | フル委員会 —— 先にどのプリセットか確認します | 席ごとに 1 サブエージェント |
117
- | `/alpha MU quick` | アナリスト 4 名+討論。マスター陣なし、検証なし | 7 席 |
118
- | `/alpha MU screen` | 機械的スクリーニングのみ | **なし** |
119
- | `/alpha MU options` | IV ターム構造、スキュー、建玉分布 | **なし** |
120
- | `/alpha MU news` | 日付付きの提出書類とニュース | **なし** |
121
- | `/alpha market AI` | 市場が語っている物語 | **なし** |
116
+ | `/alpha <ticker>` | フル委員会 —— 先にどのプリセットか確認します | 席ごとに 1 サブエージェント |
117
+ | `/alpha <ticker> quick` | アナリスト 4 名+討論。マスター陣なし、検証なし | 7 席 |
118
+ | `/alpha <ticker> screen` | 機械的スクリーニングのみ | **なし** |
119
+ | `/alpha <ticker> options` | IV ターム構造、スキュー、建玉分布 | **なし** |
120
+ | `/alpha <ticker> news` | 日付付きの提出書類とニュース | **なし** |
121
+ | `/alpha market <theme>` | 市場が語っている物語 | **なし** |
122
122
  | `/alpha` | モード一覧を出して停止 | **なし** |
123
123
 
124
124
  **なし** と記した 4 つはキー不要のデータツールを呼ぶだけで、サブエージェントを一切起動しません。入力したそのターン以外に消費はありません。委員会モードは席ごとにサブエージェントを起動し、それがこのプラグインのコストのすべてです。
125
125
 
126
+ 上場銘柄なら何でも:`/alpha AAPL` · `/alpha 0700.HK quick` · `/alpha 7203.T news` · `/alpha market rates`。
127
+ 提出書類ベースのモードは米国登録企業が必要です。他市場は黙って空を返すのではなく `market_coverage` で対応状況を示します。
128
+
129
+
126
130
  Claude Code、OpenCode、Grok Build ではインストール後すぐ使えます。Codex の prompts はユーザースコープなので一度コピーしてください:
127
131
  `mkdir -p ~/.codex/prompts && cp commands/alpha.md ~/.codex/prompts/`
128
132
 
package/README.md CHANGED
@@ -130,18 +130,22 @@ rather than four in a menu of a hundred.
130
130
 
131
131
  | Invocation | What runs | Model spend |
132
132
  |---|---|---|
133
- | `/alpha MU` | Full council — asks which preset first | one subagent per seat |
134
- | `/alpha MU quick` | 4 analysts + debate, no bench, no verification | 7 seats |
135
- | `/alpha MU screen` | Mechanical filings screen only | **none** |
136
- | `/alpha MU options` | IV term structure, skew, positioning | **none** |
137
- | `/alpha MU news` | Dated filings and headlines | **none** |
138
- | `/alpha market AI` | What the market is talking about | **none** |
133
+ | `/alpha <ticker>` | Full council — asks which preset first | one subagent per seat |
134
+ | `/alpha <ticker> quick` | 4 analysts + debate, no bench, no verification | 7 seats |
135
+ | `/alpha <ticker> screen` | Mechanical filings screen only | **none** |
136
+ | `/alpha <ticker> options` | IV term structure, skew, positioning | **none** |
137
+ | `/alpha <ticker> news` | Dated filings and headlines | **none** |
138
+ | `/alpha market <theme>` | What the market is talking about | **none** |
139
139
  | `/alpha` | Lists the modes and stops | **none** |
140
140
 
141
141
  The four marked **none** call keyless data tools and spawn no subagents, so they cost
142
142
  nothing beyond the turn you type them in. The council modes spawn one subagent per seat, and
143
143
  that is the entire cost of running this.
144
144
 
145
+ Any listed equity: `/alpha AAPL` · `/alpha 0700.HK quick` · `/alpha 7203.T news` · `/alpha market rates`.
146
+ Filings-based modes need a US filer; other markets are reported through `market_coverage` rather than silently returning nothing.
147
+
148
+
145
149
  Available in Claude Code, OpenCode and Grok Build as soon as the plugin is installed. Codex keeps
146
150
  its prompts user-scoped, so copy it once: `mkdir -p ~/.codex/prompts && cp commands/alpha.md ~/.codex/prompts/`
147
151
 
package/README.zh-CN.md CHANGED
@@ -113,16 +113,20 @@ codex plugin marketplace add Zhao73/alphacouncil-agent
113
113
 
114
114
  | 输入 | 跑什么 | 额度消耗 |
115
115
  |---|---|---|
116
- | `/alpha MU` | 完整议会 —— 先问你跑哪个预设 | 每席一个子代理 |
117
- | `/alpha MU quick` | 4 分析师 + 辩论,无大师、无验证 | 7 席 |
118
- | `/alpha MU screen` | 只跑机械筛选 | **零** |
119
- | `/alpha MU options` | 隐含波动率期限结构、偏斜、持仓分布 | **零** |
120
- | `/alpha MU news` | 带日期的申报与新闻 | **零** |
121
- | `/alpha market AI` | 市场在讲什么故事 | **零** |
116
+ | `/alpha <ticker>` | 完整议会 —— 先问你跑哪个预设 | 每席一个子代理 |
117
+ | `/alpha <ticker> quick` | 4 分析师 + 辩论,无大师、无验证 | 7 席 |
118
+ | `/alpha <ticker> screen` | 只跑机械筛选 | **零** |
119
+ | `/alpha <ticker> options` | 隐含波动率期限结构、偏斜、持仓分布 | **零** |
120
+ | `/alpha <ticker> news` | 带日期的申报与新闻 | **零** |
121
+ | `/alpha market <theme>` | 市场在讲什么故事 | **零** |
122
122
  | `/alpha` | 列出模式后停下 | **零** |
123
123
 
124
124
  标「零」的四个只调免 key 数据工具、**不启动任何子代理**,除了你敲的这一轮之外不消耗额度。议会模式每个席位起一个子代理,那是这个插件的全部成本所在。
125
125
 
126
+ 任何上市股票:`/alpha AAPL` · `/alpha 0700.HK quick` · `/alpha 7203.T news` · `/alpha market rates`。
127
+ 基于申报的模式需要美国申报主体;其他市场会通过 `market_coverage` 说明覆盖情况,而不是静默返回空结果。
128
+
129
+
126
130
  Claude Code、OpenCode、Grok Build 装完即可用。Codex 的 prompts 是用户级的,拷贝一次:
127
131
  `mkdir -p ~/.codex/prompts && cp commands/alpha.md ~/.codex/prompts/`
128
132
 
package/commands/alpha.md CHANGED
@@ -22,24 +22,32 @@ Request: **$ARGUMENTS**
22
22
  When `$ARGUMENTS` is empty, print exactly this and stop:
23
23
 
24
24
  ```
25
- /alpha MU full council — asks which preset first
26
- /alpha MU quick 4 analysts + debate, no bench, no verification
27
- /alpha MU screen mechanical filings screen only (no model spend)
28
- /alpha MU options IV term structure, skew, positioning (no model spend)
29
- /alpha MU news dated filings and headlines (no model spend)
30
- /alpha market AI what the market is talking about (no model spend)
25
+ /alpha <TICKER> full council — asks which preset first
26
+ /alpha <TICKER> quick 4 analysts + debate, no bench, no verification
27
+ /alpha <TICKER> screen mechanical filings screen only (no model spend)
28
+ /alpha <TICKER> options IV term structure, skew, positioning (no model spend)
29
+ /alpha <TICKER> news dated filings and headlines (no model spend)
30
+ /alpha market <theme> what the market is talking about (no model spend)
31
+
32
+ examples
33
+ /alpha AAPL /alpha 0700.HK quick /alpha 7203.T news
34
+ /alpha NVDA screen /alpha market rates /alpha "is TSM cheap?"
31
35
  ```
32
36
 
37
+ Any listed equity. Filings-based modes need a US filer; for other markets say which market it
38
+ is and use `market_coverage`, rather than returning nothing.
39
+
33
40
  Say plainly that the four marked modes call keyless data tools and spawn no subagents, so
34
41
  they cost nothing beyond this turn. The council modes spawn one subagent per seat, and that
35
42
  is where the spend is.
36
43
 
37
44
  ## Full council
38
45
 
39
- 1. **Ask which preset first.** Call `list_council_options` and present the three with their
40
- seat counts. A council is 7 to 44 seats and that range is the user's time and money.
41
- **Skip the question when the request already answered it** a named roster, "everything",
42
- "be quick". A confirmation nobody needed is an interruption.
46
+ 1. **Ask which masters, once, then run.** Call `list_council_options` and ask only about the
47
+ master bench the six schools by name with their members, plus "all" and "none". Analysts
48
+ default to the eight-seat fan-out; do not ask about them. After the answer, start
49
+ immediately: no preset question, no confirmation. **Skip the question entirely** when the
50
+ request already said (a named school, "everything", "no masters", "be quick").
43
51
  2. Follow `skills/alphacouncil-agent/SKILL.md` from Stage 0. Do not improvise a shorter
44
52
  workflow: a report that looks finished and skipped the bench is worse than an obviously
45
53
  partial one.
package/docs/INSTALL.md CHANGED
@@ -54,12 +54,12 @@ persona set loads, and what the data directory holds.
54
54
  One command, `/alpha`. Modes are arguments.
55
55
 
56
56
  ```text
57
- /alpha MU full council — asks which preset first
58
- /alpha MU quick 4 analysts + debate, no bench, no verification
59
- /alpha MU screen mechanical filings screen only (no model spend)
60
- /alpha MU options IV term structure, skew, positioning (no model spend)
61
- /alpha MU news dated filings and headlines (no model spend)
62
- /alpha market AI what the market is talking about (no model spend)
57
+ /alpha <ticker> full council — asks which preset first
58
+ /alpha <ticker> quick 4 analysts + debate, no bench, no verification
59
+ /alpha <ticker> screen mechanical filings screen only (no model spend)
60
+ /alpha <ticker> options IV term structure, skew, positioning (no model spend)
61
+ /alpha <ticker> news dated filings and headlines (no model spend)
62
+ /alpha market <theme> what the market is talking about (no model spend)
63
63
  /alpha lists the modes and stops (no model spend)
64
64
  ```
65
65
 
package/docs/personas.md CHANGED
@@ -26,16 +26,16 @@ To add a role, add one file. It appears in the tool schema automatically.
26
26
  | `bear_researcher` | debate | yes | default | deep | Bear Researcher | short-case, rebuttal | original |
27
27
  | `portfolio_manager` | debate | yes | default | deep | Portfolio Manager | verdict, rating, synthesis | original |
28
28
  | `_master_base` | master | no | - | deep | Master seat preamble | shared | original |
29
- | `master_aschenbrenner` | master | yes | masters-modern | deep | Aschenbrenner Lens | scaling, compute, power, timeline-pricing | original |
29
+ | `master_aschenbrenner` | master | yes | masters-modern, masters-core | deep | Aschenbrenner Lens | scaling, compute, power, timeline-pricing | original |
30
30
  | `master_buffett` | master | yes | masters-value, masters-core | deep | Buffett Lens | moat, owner-earnings, circle-of-competence | ai-berkshire (MIT) |
31
31
  | `master_graham` | master | yes | masters-value-classic, masters-core | deep | Graham Lens | margin-of-safety, balance-sheet, mr-market | original |
32
32
  | `master_simons` | master | yes | masters-quant, masters-core | deep | Simons Lens | signal-vs-noise, no-narrative, sample-size | original |
33
33
  | `master_soros` | master | yes | masters-adversarial, masters-core | deep | Soros Lens | reflexivity, boom-bust, test-the-thesis | original |
34
- | `master_druckenmiller` | master | yes | masters-adversarial | deep | Druckenmiller Lens | liquidity, concentration, eighteen-months-ahead | original |
35
- | `master_fisher` | master | yes | masters-value-classic | deep | Fisher Lens | scuttlebutt, growth-quality, r-and-d | original |
34
+ | `master_druckenmiller` | master | yes | masters-adversarial, masters-core | deep | Druckenmiller Lens | liquidity, concentration, eighteen-months-ahead | original |
35
+ | `master_fisher` | master | yes | masters-value-classic, masters-core | deep | Fisher Lens | scuttlebutt, growth-quality, r-and-d | original |
36
36
  | `master_munger` | master | yes | masters-value, masters-core | deep | Munger Lens | inversion, mental-models, failure-paths | ai-berkshire (MIT) |
37
37
  | `master_thorp` | master | yes | masters-quant, masters-core | deep | Thorp Lens | kelly-sizing, edge-and-odds, risk-of-ruin | original |
38
- | `master_asness` | master | yes | masters-quant | deep | Asness Factor Lens | factor-exposure, value-momentum-quality, is-it-just-beta | original |
38
+ | `master_asness` | master | yes | masters-quant, masters-core | deep | Asness Factor Lens | factor-exposure, value-momentum-quality, is-it-just-beta | original |
39
39
  | `master_dalio` | master | yes | masters-adversarial, masters-core | deep | Dalio Lens | debt-cycle, machine-view, regime | original |
40
40
  | `master_duan_yongping` | master | yes | masters-value, masters-core | deep | Duan Yongping Lens | business-model, stop-doing-list, corporate-culture | ai-berkshire (MIT) |
41
41
  | `master_lynch` | master | yes | masters-value-classic, masters-core | deep | Peter Lynch Lens | category-first, peg, story-in-two-minutes | original |
@@ -43,7 +43,7 @@ To add a role, add one file. It appears in the tool schema automatically.
43
43
  | `master_marks` | master | yes | masters-value-classic, masters-core | deep | Howard Marks Lens | second-level-thinking, cycle-position, risk-is-permanent-loss | original |
44
44
  | `master_short_seller` | master | yes | masters-adversarial, masters-core | deep | Short Seller Lens | forensic-accounting, crowding, borrow | original |
45
45
  | `master_burry` | master | yes | masters-adversarial, masters-core | deep | Michael Burry Lens | primary-documents, contrarian, structural-short | original |
46
- | `master_klarman` | master | yes | masters-value-classic | deep | Klarman Lens | absolute-return, cash-as-option, bottom-up | original |
46
+ | `master_klarman` | master | yes | masters-value-classic, masters-core | deep | Klarman Lens | absolute-return, cash-as-option, bottom-up | original |
47
47
  | `master_taleb` | master | yes | masters-options, masters-core | deep | Taleb Lens (Convexity and Tails) | tail-risk, convexity, options | original |
48
48
  | `master_natenberg` | master | yes | masters-options, masters-core | deep | Natenberg Lens (Volatility Pricing) | implied-volatility, options-pricing, market-making | original |
49
49
  | `master_sinclair` | master | yes | masters-options, masters-core | deep | Sinclair Lens (Volatility Trading and Execution) | volatility-forecasting, edge-measurement, position-sizing, options | original |
package/mcp/lib/rpc.mjs CHANGED
@@ -582,16 +582,37 @@ export async function handleToolCall(id, params) {
582
582
  }
583
583
  if (name === "list_council_options") {
584
584
  const data = councilOptions({ language: args.language || "English" });
585
- const rows = data.presets.map((p) => [
586
- p.id, p.label, `${p.seats} seats`, `~${p.rough_minutes}m`, p.good_for,
585
+ const zh = /中文|chinese|zh/i.test(String(args.language || ""));
586
+ // Named seats, not three abstractions. A user choosing what to spend on should see who
587
+ // is in the room; "standard, 32 seats" hides both the composition and the omissions --
588
+ // it hid five masters that the preset never actually ran.
589
+ const analystRows = data.analysts.map((a) => [
590
+ a.id, a.title, a.in_default ? (zh ? "默认" : "default") : (zh ? "可选" : "optional"), a.covers || "-",
591
+ ]);
592
+ const masterRows = data.master_rosters.map((r) => [
593
+ r.roster, String(r.count), r.members.map((m) => m.id.replace("master_", "")).join(", "),
587
594
  ]);
588
595
  const text = [
589
- table(["Preset", "What runs", "Seats", "Rough cost", "Good for"], rows, { title: "Choose a council" }),
596
+ table(
597
+ zh ? ["席位", "职责", "是否默认", "覆盖"] : ["Seat", "Role", "In default", "Covers"],
598
+ analystRows, { title: zh ? `分析师 — ${data.analysts.length} 位可选,默认 ${data.default_analysts.length} 位` : `Analysts — ${data.analysts.length} available, ${data.default_analysts.length} in the default fan-out`, zh },
599
+ ),
600
+ "",
601
+ table(
602
+ zh ? ["学派名册", "人数", "成员"] : ["School", "Count", "Members"],
603
+ masterRows, { title: zh ? `大师议席 — 共 ${data.all_masters_count} 位` : `Master bench — ${data.all_masters_count} lenses`, zh },
604
+ ),
590
605
  "",
591
- `Master rosters: ${data.master_rosters.map((r) => `${r.roster} (${r.count})`).join(" · ")} — ${data.all_masters_count} lenses in total.`,
592
- `Analysts: ${data.analysts.length} available, ${data.default_analysts.length} in the default fan-out.`,
606
+ table(
607
+ zh ? ["预设", "内容", "席位", "相对成本"] : ["Preset", "What runs", "Seats", "Relative cost"],
608
+ data.presets.map((p) => [p.id, p.label, `${p.seats}`, `~${p.rough_minutes}`]),
609
+ { title: zh ? "快捷预设(也可以自己点名)" : "Shortcuts — or name the seats yourself", zh },
610
+ ),
593
611
  "",
594
- "Ask the user which they want before starting. Do not ask if they already said.",
612
+ zh
613
+ ? "把上面的名单给用户看,让他们**自己勾选**:可以按学派名册选、可以点名单个席位、也可以全选。预设只是快捷方式,不是唯一选项。用户已经说清楚要什么就别问。"
614
+ : "Show the user these lists and let them **pick**: by school, by individual seat, or all of them. "
615
+ + "The presets are shortcuts, not the only way to choose. Do not ask if they already said.",
595
616
  ].join("\n");
596
617
  sendResult(id, jsonContent(text, data));
597
618
  return;
@@ -17,8 +17,16 @@ const pct = (x) => (x === null ? null : Number((x * 100).toFixed(2)));
17
17
  const last = (series, n) => series.slice(-n);
18
18
  const sum = (xs) => xs.reduce((a, b) => a + b, 0);
19
19
 
20
+ /**
21
+ * XBRL reports share counts under the `shares` unit, not `USD`. Requesting the default unit
22
+ * for a share concept returns nothing, so the dilution rule reported `skipped` for every
23
+ * company that has ever been screened -- seven rules advertised, six ever computed, and the
24
+ * skip looked exactly like a genuine data gap.
25
+ */
26
+ const UNIT_BY_CONCEPT = { sharesOutstanding: "shares" };
27
+
20
28
  function values(facts, key, asOf) {
21
- const found = annualSeries(facts, CONCEPTS[key], { asOf });
29
+ const found = annualSeries(facts, CONCEPTS[key], { asOf, unit: UNIT_BY_CONCEPT[key] || "USD" });
22
30
  return found ? found.series.map((e) => ({ end: e.end, filed: e.filed, val: e.val })) : [];
23
31
  }
24
32
 
package/mcp/lib/sec.mjs CHANGED
@@ -70,26 +70,80 @@ export async function fetchCompanyFacts(cik) {
70
70
  * Tries several tags because the same economic quantity has different names depending on
71
71
  * when and under which taxonomy a company filed.
72
72
  */
73
+ /**
74
+ * How long a reported period is, in days. Instant facts (balance-sheet items) have no start.
75
+ */
76
+ const spanDays = (entry) =>
77
+ entry.start ? Math.round((Date.parse(entry.end) - Date.parse(entry.start)) / 86400000) : null;
78
+
79
+ /**
80
+ * Is this entry an annual figure?
81
+ *
82
+ * A 10-K carries quarterly and stub periods alongside the annual ones. Keying only on the
83
+ * end date treated each as its own year: Lumentum's 2015 produced ten "years" from one
84
+ * fiscal year -- nine quarters and stubs plus the real 363-day period. Every multi-year rule
85
+ * then averaged quarterly income against annual equity, silently.
86
+ *
87
+ * Fiscal years run 52 or 53 weeks, so the window has to be wider than 365 exactly.
88
+ */
89
+ const ANNUAL_MIN_DAYS = 300;
90
+ const ANNUAL_MAX_DAYS = 400;
91
+ const isAnnual = (entry) => {
92
+ const days = spanDays(entry);
93
+ // Instant facts have no duration: shares outstanding, equity, total assets.
94
+ if (days === null) return true;
95
+ return days >= ANNUAL_MIN_DAYS && days <= ANNUAL_MAX_DAYS;
96
+ };
97
+
98
+ /** The fiscal year a period belongs to, taken from its end date. */
99
+ const fiscalYear = (entry) => Number(String(entry.end).slice(0, 4));
100
+
101
+ /**
102
+ * Annual history for a concept, merged across every alias.
103
+ *
104
+ * Merging matters as much as the annual filter. The function used to return at the first
105
+ * alias with any data, and revenue moved to RevenueFromContractWithCustomerExcludingAssessedTax
106
+ * when ASC 606 was adopted -- so a company reporting under the new tag since 2022 looked like
107
+ * it had four years of history, which then fired a "listed under ten years" exemption on a
108
+ * company that had been public for a decade.
109
+ *
110
+ * Aliases are ordered by preference, so an earlier alias wins where both cover a year.
111
+ */
73
112
  export function annualSeries(facts, tags, { asOf = null, unit = "USD" } = {}) {
74
113
  const cutoff = asOf ? new Date(asOf).getTime() : null;
114
+ const byYear = new Map();
115
+ let usedTags = [];
116
+
75
117
  for (const tag of tags) {
76
118
  const entries = facts?.facts?.["us-gaap"]?.[tag]?.units?.[unit];
77
119
  if (!Array.isArray(entries) || entries.length === 0) continue;
120
+ let contributed = false;
78
121
 
79
- const byPeriod = new Map();
80
122
  for (const entry of entries) {
81
123
  if (entry.form !== "10-K" || !entry.end || !Number.isFinite(entry.val)) continue;
124
+ if (!isAnnual(entry)) continue;
82
125
  // Look-ahead guard: a filing is only usable once it was actually filed.
83
126
  if (cutoff && new Date(entry.filed).getTime() > cutoff) continue;
84
- const prior = byPeriod.get(entry.end);
85
- // Keep the most recently filed value for a period: restatements supersede.
86
- if (!prior || new Date(entry.filed) > new Date(prior.filed)) byPeriod.set(entry.end, entry);
127
+
128
+ const year = fiscalYear(entry);
129
+ const prior = byYear.get(year);
130
+ if (!prior) {
131
+ byYear.set(year, { ...entry, tag });
132
+ contributed = true;
133
+ continue;
134
+ }
135
+ // An earlier alias always wins the year; within one alias, the latest filing wins,
136
+ // because a restatement supersedes what it restates.
137
+ if (prior.tag === tag && new Date(entry.filed) > new Date(prior.filed)) {
138
+ byYear.set(year, { ...entry, tag });
139
+ }
87
140
  }
88
- if (byPeriod.size === 0) continue;
89
- const series = [...byPeriod.values()].sort((a, b) => new Date(a.end) - new Date(b.end));
90
- return { tag, unit, series };
141
+ if (contributed) usedTags.push(tag);
91
142
  }
92
- return null;
143
+
144
+ if (byYear.size === 0) return null;
145
+ const series = [...byYear.values()].sort((a, b) => new Date(a.end) - new Date(b.end));
146
+ return { tag: usedTags[0], tags: usedTags, unit, series };
93
147
  }
94
148
 
95
149
  /** Concept aliases, ordered by preference. */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "alphacouncil-agent",
3
- "version": "0.5.4",
3
+ "version": "0.6.0",
4
4
  "description": "Multi-agent public-equity research workflow plugin for Codex & Claude Code: sourced evidence packets, bull/bear debate, and a portfolio-manager Buy/Overweight/Hold/Underweight/Sell decision.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -6,7 +6,8 @@
6
6
  "order": 20,
7
7
  "enabled": true,
8
8
  "rosters": [
9
- "masters-adversarial"
9
+ "masters-adversarial",
10
+ "masters-core"
10
11
  ],
11
12
  "title": {
12
13
  "zh": "德鲁肯米勒视角",
@@ -6,7 +6,8 @@
6
6
  "order": 10,
7
7
  "enabled": true,
8
8
  "rosters": [
9
- "masters-modern"
9
+ "masters-modern",
10
+ "masters-core"
10
11
  ],
11
12
  "title": {
12
13
  "zh": "Aschenbrenner 视角",
@@ -6,7 +6,8 @@
6
6
  "order": 30,
7
7
  "enabled": true,
8
8
  "rosters": [
9
- "masters-quant"
9
+ "masters-quant",
10
+ "masters-core"
10
11
  ],
11
12
  "title": {
12
13
  "zh": "Asness 因子视角",
@@ -6,7 +6,8 @@
6
6
  "order": 20,
7
7
  "enabled": true,
8
8
  "rosters": [
9
- "masters-value-classic"
9
+ "masters-value-classic",
10
+ "masters-core"
10
11
  ],
11
12
  "title": {
12
13
  "zh": "费雪视角",
@@ -6,7 +6,8 @@
6
6
  "order": 50,
7
7
  "enabled": true,
8
8
  "rosters": [
9
- "masters-value-classic"
9
+ "masters-value-classic",
10
+ "masters-core"
10
11
  ],
11
12
  "title": {
12
13
  "zh": "克拉曼视角",
@@ -30,32 +30,36 @@ Do not ask startup option questions by default. For underspecified requests such
30
30
 
31
31
  Ask only when the user explicitly requests option selection before launch. Use the inferred language for visible main-thread preflight/progress updates, visible agent prompts, evidence packets, debate packets, and final synthesis unless the user explicitly requests another language. Always pass the original user request in `prompt`, and pass the inferred language as `language` to AlphaCouncil Agent MCP tools.
32
32
 
33
- ## Stage 0 — Ask which council to run (every host)
33
+ ## Stage 0 — Ask which masters, then run
34
34
 
35
- **Before planning a run, call `list_council_options` and let the user choose.**
35
+ **One question, about the master bench only. Then start.**
36
36
 
37
- A council is anywhere from 7 to 44 seats. That range is the user's time and money, and
38
- choosing silently is wrong in both directions: pick small and the bench they were promised
39
- never runs, pick everything and a one-line question costs a full fan-out.
37
+ The analysts have a sensible default -- the eight-seat fan-out -- and asking about them every
38
+ time is a question with an obvious answer. The bench is the part a user actually has a view
39
+ on, and it is where the cost varies most: 21 lenses or 4 is a real difference.
40
40
 
41
- Present the three presets with their seat counts and relative cost, and say that they can
42
- instead name individual analysts and a master roster. Then wait for the answer.
41
+ 1. Call `list_council_options`.
42
+ 2. Ask **once**: which master schools? Offer the six by name with their members, plus "all"
43
+ and "none".
44
+ - **Claude Code** — `AskUserQuestion` with `multiSelect: true`, one option per school,
45
+ each naming its members.
46
+ - **Codex, OpenCode, Grok Build** — print the school table and take a plain reply.
43
47
 
44
- **Do not ask when they have already told you.** A user who named a roster, said "run
45
- everything", said "just be quick", or is repeating a run with the same shape has answered;
46
- asking again is an interruption, not diligence.
48
+ Naming each host is not redundancy. Leaving it implicit is exactly how the master bench
49
+ ended up never running on Codex and OpenCode: the instruction existed, in a section only
50
+ one host read.
51
+ 3. **Then run.** Do not ask about analysts, presets, or confirmation. The answer to "which
52
+ masters" is the whole configuration decision.
47
53
 
48
- How to ask, per host:
54
+ Analysts default to the eight-seat fan-out. Use all eleven only if the user asked for
55
+ breadth, and say so in the report rather than asking first.
49
56
 
50
- - **Claude Code** use `AskUserQuestion` with the presets as options.
51
- - **Codex, OpenCode, Grok Build** ask in chat as a short numbered list and wait for a reply.
57
+ **Skip the question entirely when the request already answered it** — a named school,
58
+ "everything", "no masters", "be quick", or a repeat of a run with the same shape. A
59
+ confirmation nobody needed is an interruption.
52
60
 
53
- Two things to say plainly when you ask:
54
-
55
- - The estimates are relative magnitudes, not promises. "Roughly three times the seats" is
56
- honest; "about 33 minutes" is not.
57
- - If they choose everything, say once that it will be noticeably slower — then run it. They
58
- are allowed to spend their own time; they are not required to guess what it costs.
61
+ Say the cost once, in the same message as the question: each master is one subagent, so the
62
+ bench is the difference between roughly 11 seats and roughly 32. Do not quote minutes.
59
63
 
60
64
  ## Visible-First Workflow
61
65