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.
- package/.claude/commands/alpha.md +18 -10
- package/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/.grok/commands/alpha.md +18 -10
- package/.opencode/command/alpha.md +18 -10
- package/AGENTS.md +6 -6
- package/CHANGELOG.md +52 -0
- package/README.ja.md +10 -6
- package/README.md +10 -6
- package/README.zh-CN.md +10 -6
- package/commands/alpha.md +18 -10
- package/docs/INSTALL.md +6 -6
- package/docs/personas.md +5 -5
- package/mcp/lib/rpc.mjs +27 -6
- package/mcp/lib/screen.mjs +9 -1
- package/mcp/lib/sec.mjs +62 -8
- package/package.json +1 -1
- package/personas/masters/masters-adversarial/druckenmiller.md +2 -1
- package/personas/masters/masters-modern/aschenbrenner.md +2 -1
- package/personas/masters/masters-quant/asness.md +2 -1
- package/personas/masters/masters-value-classic/fisher.md +2 -1
- package/personas/masters/masters-value-classic/klarman.md +2 -1
- package/skills/alphacouncil-agent/SKILL.md +23 -19
|
@@ -22,24 +22,32 @@ Request: **$ARGUMENTS**
|
|
|
22
22
|
When `$ARGUMENTS` is empty, print exactly this and stop:
|
|
23
23
|
|
|
24
24
|
```
|
|
25
|
-
/alpha
|
|
26
|
-
/alpha
|
|
27
|
-
/alpha
|
|
28
|
-
/alpha
|
|
29
|
-
/alpha
|
|
30
|
-
/alpha market
|
|
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
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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"
|
package/.grok/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
|
|
26
|
-
/alpha
|
|
27
|
-
/alpha
|
|
28
|
-
/alpha
|
|
29
|
-
/alpha
|
|
30
|
-
/alpha market
|
|
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
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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
|
|
26
|
-
/alpha
|
|
27
|
-
/alpha
|
|
28
|
-
/alpha
|
|
29
|
-
/alpha
|
|
30
|
-
/alpha market
|
|
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
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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
|
|
80
|
-
| `/alpha
|
|
81
|
-
| `/alpha
|
|
82
|
-
| `/alpha
|
|
83
|
-
| `/alpha
|
|
84
|
-
| `/alpha market
|
|
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
|
|
117
|
-
| `/alpha
|
|
118
|
-
| `/alpha
|
|
119
|
-
| `/alpha
|
|
120
|
-
| `/alpha
|
|
121
|
-
| `/alpha market
|
|
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
|
|
134
|
-
| `/alpha
|
|
135
|
-
| `/alpha
|
|
136
|
-
| `/alpha
|
|
137
|
-
| `/alpha
|
|
138
|
-
| `/alpha market
|
|
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
|
|
117
|
-
| `/alpha
|
|
118
|
-
| `/alpha
|
|
119
|
-
| `/alpha
|
|
120
|
-
| `/alpha
|
|
121
|
-
| `/alpha market
|
|
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
|
|
26
|
-
/alpha
|
|
27
|
-
/alpha
|
|
28
|
-
/alpha
|
|
29
|
-
/alpha
|
|
30
|
-
/alpha market
|
|
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
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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
|
|
58
|
-
/alpha
|
|
59
|
-
/alpha
|
|
60
|
-
/alpha
|
|
61
|
-
/alpha
|
|
62
|
-
/alpha market
|
|
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
|
|
586
|
-
|
|
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(
|
|
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
|
-
|
|
592
|
-
|
|
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
|
-
|
|
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;
|
package/mcp/lib/screen.mjs
CHANGED
|
@@ -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
|
-
|
|
85
|
-
|
|
86
|
-
|
|
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 (
|
|
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
|
-
|
|
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.
|
|
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",
|
|
@@ -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
|
|
33
|
+
## Stage 0 — Ask which masters, then run
|
|
34
34
|
|
|
35
|
-
**
|
|
35
|
+
**One question, about the master bench only. Then start.**
|
|
36
36
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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
|
-
|
|
42
|
-
|
|
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
|
-
|
|
45
|
-
|
|
46
|
-
|
|
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
|
-
|
|
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
|
-
|
|
51
|
-
|
|
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
|
-
|
|
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
|
|