alphacouncil-agent 1.0.2 → 1.0.3

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 (36) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/.codex-plugin/plugin.json +1 -1
  4. package/CHANGELOG.md +45 -0
  5. package/README.md +24 -15
  6. package/README.zh-CN.md +18 -10
  7. package/data/authored/core-seats.mjs +8 -4
  8. package/data/build-profile.v1.json +1 -1
  9. package/data/persona-v3-build-specs.v1.mjs +1 -1
  10. package/docs/plans/v1.1-say-something-worth-reading.md +116 -0
  11. package/knowledge/ai-assisted-solo/experiments/runs/a.json +2 -2
  12. package/knowledge/ai-assisted-solo/experiments/runs/b.json +2 -2
  13. package/knowledge/ai-assisted-solo/experiments/runs/c.json +2 -2
  14. package/knowledge/ai-assisted-solo/experiments/runs/d13.json +2 -2
  15. package/knowledge/ai-assisted-solo/experiments/runs/d26.json +9 -9
  16. package/knowledge/ai-assisted-solo/experiments/runs/e-d13.json +4 -4
  17. package/knowledge/ai-assisted-solo/experiments/runs/e-d26.json +12 -12
  18. package/knowledge/ai-assisted-solo/experiments/runs/h_ai_reference.json +13 -13
  19. package/knowledge/ai-assisted-solo/experiments/simulation-input.json +6 -6
  20. package/knowledge/ai-assisted-solo/experiments/simulation-manifest.json +19 -19
  21. package/knowledge/solo-test/masters/master_bogle/decision_policy.json +4 -3
  22. package/knowledge/solo-test/masters/master_bogle/provisional-index.json +3 -0
  23. package/knowledge/solo-test/masters/master_bogle/sources.jsonl +1 -1
  24. package/mcp/lib/constants.mjs +3 -0
  25. package/mcp/lib/fundamentals.mjs +11 -0
  26. package/mcp/lib/grounding.mjs +67 -1
  27. package/mcp/lib/insider-ownership.mjs +23 -12
  28. package/mcp/lib/orchestrator.mjs +10 -2
  29. package/mcp/lib/personas/engine.mjs +66 -9
  30. package/mcp/lib/personas-v3/deterministic-executor.mjs +39 -2
  31. package/mcp/lib/personas-v3/grounding-adapter.mjs +4 -0
  32. package/mcp/lib/personas-v3/runtime.mjs +9 -2
  33. package/mcp/lib/screen.mjs +27 -1
  34. package/mcp/lib/sec.mjs +80 -17
  35. package/mcp/lib/voice-from-decision.mjs +211 -0
  36. package/package.json +1 -1
@@ -6,14 +6,14 @@
6
6
  },
7
7
  "metadata": {
8
8
  "description": "AlphaCouncil plugins for public-equity research.",
9
- "version": "1.0.2"
9
+ "version": "1.0.3"
10
10
  },
11
11
  "plugins": [
12
12
  {
13
13
  "name": "alphacouncil-agent",
14
14
  "source": "./",
15
15
  "description": "Multi-agent company, ETF and index research: evidence packets, method seats, bull/bear debate and portfolio-manager synthesis.",
16
- "version": "1.0.2",
16
+ "version": "1.0.3",
17
17
  "author": {
18
18
  "name": "Zhao73"
19
19
  },
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "alphacouncil-agent",
3
- "version": "1.0.2",
3
+ "version": "1.0.3",
4
4
  "description": "Multi-agent company, ETF and market-index research for Claude Code with sourced evidence, method seats, bull/bear debate and a full portfolio-manager report.",
5
5
  "author": {
6
6
  "name": "Zhao73"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "alphacouncil-agent",
3
- "version": "1.0.2",
3
+ "version": "1.0.3",
4
4
  "description": "Host-visible or background company, ETF and index research with shared evidence packets.",
5
5
  "author": {
6
6
  "name": "Zhao73"
package/CHANGELOG.md CHANGED
@@ -2,6 +2,51 @@
2
2
 
3
3
  Notable changes per release. Dates are UTC.
4
4
 
5
+ ## [1.0.3] — 2026-07-29
6
+
7
+ Three real runs are the specification: a GLW run put all eight selected seats at `out_of_scope`
8
+ with weight zero, an INTC run sent six to the deterministic fallback, and a LITE run reported
9
+ "no ticker was provided" for a ticker that had been provided. The filings contained the data
10
+ every one of them said was missing.
11
+
12
+ ### Fixed
13
+
14
+ - **The missing facts were mostly missing tag aliases.** `grossProfit` resolved for five of
15
+ fifteen large caps, because most filers publish revenue and cost of revenue separately rather
16
+ than tagging it; it is now derived from those two, matched by period end, with a tagged value
17
+ always winning. `capex` missed Corning entirely, which files `PaymentsForCapitalImprovements`
18
+ — that one absent alias removed owner earnings, and with it Buffett and Ackman, for every
19
+ issuer tagging it that way. Gross margin now resolves for all fourteen testable filers.
20
+ - **Market facts were fetched only for baskets.** Asness, Marks and Damodaran require
21
+ `index.aggregate_earnings_yield` and reported it missing on every single-company run. The
22
+ market's aggregate earnings yield is not a property of the subject; it is the yardstick the
23
+ subject is measured against.
24
+ - **A seat could not reach its own answer about an absent fact.** Pabrai is authored with a veto
25
+ that says no downside floor means pass. That fact is also a tool input, and a tool declaring
26
+ `on_missing: "fail"` aborted the policy before any veto ran. A veto that reads only facts
27
+ needs nothing a tool produces, so when one has already decided the seat, the tools it would
28
+ have fed no longer abort the run.
29
+ - **A grounding timeout discarded everything.** The caller threw away a completed quote, screen
30
+ and filing set because one feed was slow, and the analysts described the empty result as a
31
+ missing ticker. Grounding settles at its own budget and returns what arrived. Section 16
32
+ ownership was reading filings one at a time — up to sixty throttled round trips on the
33
+ critical path — and is now batched: LITE completes in seven seconds.
34
+ - **SEC rate limiting collapsed a run.** A 429 is now retried with a bounded backoff instead of
35
+ being indistinguishable in the report from the data not existing.
36
+ - **A registrant with no filings is one diagnosis, not eight.** `XOM` resolves through SEC's own
37
+ ticker file to a newly formed holding company with zero us-gaap tags.
38
+ - **The maturity suffix stopped leaking into sentences.** Statements read "using the X
39
+ provisional operator lens method".
40
+
41
+ ### Added
42
+
43
+ - **Seats say what they looked at.** The five-field voice — what I see, how my method reads it,
44
+ would I act, what changes my mind, where I disagree — is composed from the frozen decision:
45
+ the facts read and their values, what the tools produced, which scoring conditions held and
46
+ which did not, and what would move the verdict. Because it is derived from the decision it
47
+ cannot drift from it, and anonymous rule ids are mapped back to the seat's readable names.
48
+ Abstentions get the same structure.
49
+
5
50
  ## [1.0.2] — 2026-07-29
6
51
 
7
52
  ### Added
package/README.md CHANGED
@@ -32,7 +32,7 @@
32
32
  <a href="docs/INSTALL.md"><b>Install</b></a> ·
33
33
  <a href="#-usage"><b>Usage</b></a> ·
34
34
  <a href="#-tools--27-all-keyless"><b>Tools</b></a> ·
35
- <a href="#-the-bench--26-investor-method-lenses"><b>The bench</b></a> ·
35
+ <a href="#-the-bench--27-investor-method-lenses"><b>The bench</b></a> ·
36
36
  <a href="#-architecture"><b>Architecture</b></a> ·
37
37
  <a href="CHANGELOG.md"><b>Changelog</b></a> ·
38
38
  <a href="#-disclaimer"><b>Disclaimer</b></a>
@@ -57,7 +57,11 @@ AlphaCouncil Agent is a Codex and Claude Code plugin for public-equity research
57
57
  | | |
58
58
  |---|---|
59
59
  | 🏛️ **A council, not one opinion** | Eight specialist analysts by default, eleven available — market data, earnings, forward expectations, quant, valuation, news and supply chain, insider/SEC, IB events, macro, narrative, crowding. |
60
- | 🎭 **26 selectable investor lenses** | Buffett, Munger, Graham, Lynch, Marks, Damodaran, Ackman, Cathie Wood, Pabrai and more read the **same facts** through different stated research priorities. Every council run shows all 26 with actual maturity before research. Full accepts any non-empty selection or `all`; quick requires 1-4 and rejects `all`. |
60
+ | 🎭 **27 selectable investor lenses** | Buffett, Munger, Graham, Lynch, Marks, Damodaran, Ackman, Cathie Wood, Pabrai, Bogle and more read the **same facts** through different stated research priorities. Every council run shows all 27 with actual maturity before research. Full accepts any non-empty selection or `all`; quick requires 1-4 and rejects `all`. |
61
+ | 🧺 **A basket is not a company, and the bench knows it** | An ETF or index is priced by look-through: a fund owning 1% of a business has a claim on 1% of its owner earnings, so a company method reads a basket **without changing its method**. Ratios aggregate by weight; absolute figures become the fund's own dollar claim; a share count is refused because it has no portfolio meaning. |
62
+ | 📰 **A basket gets its own industry news** | `SOX` has no press office. Its industry is derived from the weighted SIC groups of its holdings, so SOXX resolves to semiconductors and survives a rebalance. Where no group dominates, the basket is queried as the several industries it actually is. |
63
+ | 🌏 **What else you are betting on** | Correlation to the broad market, to KOSPI, to KOSDAQ and to the semiconductor cycle, plus dispersion across the eleven sector SPDRs. Sessions pair by date, because Korea and the United States keep different holidays. |
64
+ | 💵 **Fund flow that refuses to be faked** | Creations minus redemptions, priced. Only a filed share count or the issuer's own assets-over-NAV identity may price a flow; a count reconstructed from positions is refused, because a difference cancels the number and keeps the error. |
61
65
  | 🐂🐻 **Adversarial by design** | Full runs a three-round bull/bear cross-exam and the visible/deep path can add three adversarial verifiers. Quick runs one parallel bull/bear statement round and a short PM; it checks scoped source IDs but explicitly does not claim adversarial verification. |
62
66
  | ⏱️ **Bounded full headless run** | Plugin-managed full starts all eight analysts together, runs Bull/Bear together inside each round, and persists a terminal run within 30 minutes. Provider failures produce an explicit `incomplete` result, never silently missing seats. |
63
67
  | 🔍 **Auditable, never hallucinated** | Every claim maps to a source ID. A screen rule with missing inputs is `skipped`, never a pass. An undated headline is excluded, not shown as recent. Gaps are a section, not an omission. |
@@ -68,14 +72,19 @@ AlphaCouncil Agent is a Codex and Claude Code plugin for public-equity research
68
72
 
69
73
  This repository is the uploadable source copy. Runtime outputs are written outside the repo under `~/.alphacouncil-agent/runs/<run_id>/`.
70
74
 
71
- ## What 1.0.0 ships
75
+ ## What this ships
72
76
 
73
- `npm install -g alphacouncil-agent` installs 1.0.0.
77
+ `npm install -g alphacouncil-agent` installs the current release.
74
78
 
75
79
  Twenty-seven method seats, each running its own formulas and its own thresholds against typed
76
- facts built from SEC filings, FRED series, issuer holdings disclosures and published index
77
- aggregates. Fifty-four executable tools. Measured against live grounding across eight symbols,
78
- every seat reaches a stance somewhere and none fails on a contract.
80
+ facts built from SEC filings, FRED series, issuer holdings disclosures, published index
81
+ aggregates, Section 16 ownership, cross-market price history and dated industry news.
82
+ Fifty-four executable tools.
83
+
84
+ Measured against live grounding, with no fixtures: every one of the 27 seats reaches a stance
85
+ somewhere across a mixed set of symbols, with no contract failures. A basket that had **no data
86
+ path at all** — `SOX` was in neither registry — now produces 40-plus typed facts, and the seats
87
+ that read them are running the same methods they run on a company.
79
88
 
80
89
  Seats carry the `operator_lens` admission level. Their formulas and thresholds are
81
90
  AI-authored and trace to named published work, but have not been through human review, and the
@@ -145,7 +154,7 @@ with analyst Markdown files and `artifact_index.md` in the same run directory. F
145
154
  shows the system quote (or an explicit quote-data gap), all eight analyst statuses/summaries,
146
155
  and every selected method seat's frozen stance plus readable explanation/status. Its final
147
156
  section contains the exact selected-seat count and one statement per stable ID; `all` ends
148
- with all 26 statements. These are provisional method-seat outputs, never quotes from the
157
+ with all 27 statements. These are provisional method-seat outputs, never quotes from the
149
158
  named people.
150
159
 
151
160
  ### Slash commands
@@ -156,7 +165,7 @@ rather than four in a menu of a hundred.
156
165
  | Invocation | What runs | Model spend |
157
166
  |---|---|---|
158
167
  | `/alpha <ticker>` | Shows every master, confirms `1..N`/ranges/`all`, then full; plugin-managed headless is ≤30m | deterministic stance + one isolated voice worker per selected v3 seat |
159
- | `/alpha <ticker> quick` | Shows all 26, confirms 1-4 (no `all`), then plugin-managed `quick_v1` (≤10m) | varies with selection |
168
+ | `/alpha <ticker> quick` | Shows all 27, confirms 1-4 (no `all`), then plugin-managed `quick_v1` (≤10m) | varies with selection |
160
169
  | `/alpha <ticker> screen` | Mechanical filings screen only | **none** |
161
170
  | `/alpha <ticker> options` | IV term structure, skew, positioning | **none** |
162
171
  | `/alpha <ticker> news` | Dated filings and headlines | **none** |
@@ -197,7 +206,7 @@ Japanese and Korean; each worker receives the run language.
197
206
 
198
207
  Quick is never inferred from impatience or a full-run failure. It runs only through the
199
208
  plugin-managed headless `analyze_symbol(council_mode="quick")`; `plan_visible_run` rejects
200
- quick. After the complete 26-seat display and a 1-4-seat confirmation, it executes:
209
+ quick. After the complete 27-seat display and a 1-4-seat confirmation, it executes:
201
210
 
202
211
  1. `market_data`, `earnings_deep_dive`, `valuation_long_short` and
203
212
  `news_industry_management` in one parallel wave;
@@ -234,7 +243,7 @@ Default stock-analysis runs are full runs, not lite summaries:
234
243
  - News, industry context, supply chain, and management's words checked against their actions
235
244
  - SEC filings, Form 4 insider transactions, buybacks, dilution, debt and capital allocation
236
245
  - Investment-banking event analysis for M&A, ECM, debt, buybacks and strategic transactions
237
- - A selectable bench of 26 investor method lenses reading the same facts
246
+ - A selectable bench of 27 investor method lenses reading the same facts
238
247
  - Bull researcher, bear researcher and portfolio-manager synthesis
239
248
 
240
249
  Full is fail-fast at its mandatory evidence barrier. If a required evidence role still
@@ -275,7 +284,7 @@ not only in the docs, because the payload is what gets quoted downstream:
275
284
  contracts — is dropped rather than averaged in, because a zero does not look like a gap,
276
285
  it looks like a calm stock.
277
286
 
278
- ## 🏛️ The bench — 26 investor method lenses
287
+ ## 🏛️ The bench — 27 investor method lenses
279
288
 
280
289
  Reconstructions of publicly documented methods, not anything the named people said. Each
281
290
  states how it thinks, what it notices first, its characteristic challenge, and **its own
@@ -291,8 +300,8 @@ failure mode** — a seat that cannot name how it goes wrong will not flag it wh
291
300
  | Modern | Aschenbrenner |
292
301
  | v3 expansion | Damodaran · Ackman · Cathie Wood · Pabrai · Jhunjhunwala |
293
302
 
294
- The 1.0.0 `solo_test` catalog has 26 selectable physical v3 packs, but **26 physical packs is
295
- not 26 approved method models**. Every seat is a provisional `operator_lens` backed by
303
+ The `solo_test` catalog has 27 selectable physical v3 packs, but **27 physical packs is
304
+ not 27 approved method models**. Every seat is a provisional `operator_lens` backed by
296
305
  project-derived proxy material; the 52 tools are executable test proxies, not human-approved
297
306
  formula attribution. Operational and `method_model` counts are both zero, and production GA
298
307
  remains fail-closed.
@@ -312,7 +321,7 @@ the verifier node shown here.
312
321
  flowchart TD
313
322
  U["@alphacouncil-agent<br/>ticker / question"] --> G[("Established facts<br/>filings · quotes · macro · options")]
314
323
  G --> AG{{"Analyst council"}}
315
- G --> MS{{"Master bench<br/>26 lenses"}}
324
+ G --> MS{{"Master bench<br/>27 lenses"}}
316
325
  AG --> A1["📈 Market data"]
317
326
  AG --> A2["💰 Earnings"]
318
327
  AG --> A3["⚖️ Valuation"]
package/README.zh-CN.md CHANGED
@@ -47,7 +47,7 @@ AlphaCouncil Agent 是一个面向**上市股票研究**的 Codex / Claude Code
47
47
 
48
48
  | | |
49
49
  |---|---|
50
- | 🏛️ **是委员会,不是一家之言** | 完整模式默认 8 个证据席、最多 11 个;quick 固定 4 个并行证据席。两者都在研究前完整展示 26 个方法席。 |
50
+ | 🏛️ **是委员会,不是一家之言** | 完整模式默认 8 个证据席、最多 11 个;quick 固定 4 个并行证据席。两者都在研究前完整展示 27 个方法席。 |
51
51
  | 🐂🐻 **天生对抗式** | 完整模式跑三轮多空交叉质询;quick 只跑一轮并行 Bull/Bear 陈述和短 PM,且明确不声称完成对抗 verifier。 |
52
52
  | ⏱️ **完整 headless 有硬时限** | 插件托管 full 将 8 个分析师同波启动、每轮 Bull/Bear 同时启动,并在 30 分钟内保存终态;外部服务故障会明确 `incomplete`,不会静默漏席。 |
53
53
  | 🔍 **可审计,不瞎编** | 每条结论都映射到 source ID;缺失数据写进「数据缺口」章节,绝不隐藏。 |
@@ -61,11 +61,15 @@ AlphaCouncil Agent 是一个面向**上市股票研究**的 Codex / Claude Code
61
61
 
62
62
  ## 1.0.0 交付了什么
63
63
 
64
- `npm install -g alphacouncil-agent` 装到的就是 1.0.0。
64
+ `npm install -g alphacouncil-agent` 装到的就是最新正式版。
65
65
 
66
- 27 个方法席,每一席跑自己的公式和自己的阈值,读的是从 SEC 申报、FRED 序列、发行商持仓披露
67
- 和公开指数聚合值构建的类型化事实。54 个可执行工具。在 8 个标的的活体行情上实测:每一席都能
68
- 在某个标的上给出立场,没有任何一席因契约失败而崩掉。
66
+ 27 个方法席,每一席跑自己的公式和自己的阈值,读的是从 SEC 申报、FRED 序列、发行商持仓披露、
67
+ 公开指数聚合值、Section 16 持股、跨市场价格历史和带日期的行业新闻构建的类型化事实。
68
+ 54 个可执行工具。
69
+
70
+ 活体行情实测、不用任何 fixture:27 席全部能在混合标的集合中的某个标的上给出立场,零契约失败。
71
+ 一个此前**根本没有数据路径**的篮子(`SOX` 两个注册表里都没有)现在能产出 40 多个类型化事实,
72
+ 而读它们的席位跑的是和分析个股时**同一套方法**。
69
73
 
70
74
  席位的 admission 级别是 `operator_lens`。公式与阈值由 AI 撰写、可追溯到具名公开著作,但**尚未
71
75
  经过人工评审**,真机四宿主端到端也**尚未执行** —— 所以语料报告的已验证 `method_model` 为
@@ -126,7 +130,7 @@ codex plugin marketplace add Zhao73/alphacouncil-agent
126
130
  同一目录还会写入每个分析师的 Markdown 文件和 `artifact_index.md` 文件索引。完整模式的摘要
127
131
  会显示系统价格(或明确的行情缺口)、8 个分析师的状态/摘要,以及每个所选方法席冻结的立场
128
132
  和可读解释/状态。摘要最后一节给出准确的所选席位数,并逐席输出一个陈词;选择 `all` 时
129
- 结尾就是完整 26 席。它们是项目派生的临时方法席输出,不是本人引语。
133
+ 结尾就是完整 27 席。它们是项目派生的临时方法席输出,不是本人引语。
130
134
 
131
135
  ### 斜杠命令
132
136
 
@@ -135,7 +139,7 @@ codex plugin marketplace add Zhao73/alphacouncil-agent
135
139
  | 输入 | 跑什么 | 额度消耗 |
136
140
  |---|---|---|
137
141
  | `/alpha <ticker>` | 逐人展示全部大师,确认后运行 full;插件托管 headless ≤30 分钟 | 每个所选 v3 席为确定性立场 + 一个独立 voice worker |
138
- | `/alpha <ticker> quick` | 展示全部 26 席,确认 1-4 席(禁用 `all`),再跑插件托管 `quick_v1`(≤10 分钟) | 随选择数量变化 |
142
+ | `/alpha <ticker> quick` | 展示全部 27 席,确认 1-4 席(禁用 `all`),再跑插件托管 `quick_v1`(≤10 分钟) | 随选择数量变化 |
139
143
  | `/alpha <ticker> screen` | 只跑机械筛选 | **零** |
140
144
  | `/alpha <ticker> options` | 隐含波动率期限结构、偏斜、持仓分布 | **零** |
141
145
  | `/alpha <ticker> news` | 带日期的申报与新闻 | **零** |
@@ -166,7 +170,7 @@ full 的交付摘要必须列出全部所选 stable master ID、全部 8 个分
166
170
  ### Quick v1 —— 有界,但不等于完整议会
167
171
 
168
172
  不会因为用户着急或完整运行失败就自动切换 quick。Quick 只能通过插件托管的 headless
169
- `analyze_symbol(council_mode="quick")` 运行;`plan_visible_run` 会拒绝 quick。完整展示 26 席并
173
+ `analyze_symbol(council_mode="quick")` 运行;`plan_visible_run` 会拒绝 quick。完整展示 27 席并
170
174
  确认 1-4 席后,执行图固定为:
171
175
 
172
176
  1. `market_data`、`earnings_deep_dive`、`valuation_long_short`、
@@ -203,7 +207,7 @@ Claude Code、OpenCode、Grok Build 装完即可用。Codex 的 prompts 是用
203
207
  - 新闻、行业背景、产业链,以及管理层言行核对
204
208
  - SEC 申报、Form 4 内部人交易、回购、稀释、债务与资本配置
205
209
  - 并购、股权与债务融资、回购等事件分析
206
- - 可逐席选择的 26 个投资方法视角读取同一批事实
210
+ - 可逐席选择的 27 个投资方法视角读取同一批事实
207
211
  - 多头、空头与 PM 裁决
208
212
 
209
213
  完整模式在 mandatory evidence barrier 上 fail-fast。任何必需证据席在一次有界 parse-only
@@ -250,7 +254,7 @@ Claude Code、OpenCode、Grok Build 装完即可用。Codex 的 prompts 是用
250
254
  | v3 扩展 | 达莫达兰 · 阿克曼 · 凯茜·伍德 · Pabrai · 琼琼瓦拉 |
251
255
 
252
256
  1.0.0 `solo_test` 目录已有 27 个可选的物理 v3 包,但 **27 个物理包不等于 27 个已获批的
253
- 方法模型**。所有 26 席都只是 provisional `operator_lens`;52 个工具是可执行的
257
+ 方法模型**。所有 27 席都只是 provisional `operator_lens`;52 个工具是可执行的
254
258
  `provisional_derived_proxy` 测试代理,不是经过人工审批的公式归因。`operational` 与
255
259
  `method_model` 数量均为 0,正式生产 GA 继续 fail-closed。
256
260
 
@@ -377,3 +381,7 @@ npm run check
377
381
  <a href="#readme-top">↑ 回到顶部</a>
378
382
 
379
383
  </div>
384
+ | 🧺 **一篮子不是一家公司,而且这套系统知道** | ETF 和指数走穿透定价:持有某公司 1% 的基金,对它 1% 的所有者收益有真实索取权 —— 所以公司方法**不改一个字**就能读一篮子。比率按权重聚合,绝对量变成基金自己的美元索取权,股本被拒绝因为它在组合层面没有意义。 |
385
+ | 📰 **一篮子有自己的行业新闻** | `SOX` 没有新闻发言人。它的行业由持仓的加权 SIC 组推出,所以 SOXX 自动解析成半导体,而且指数调仓后依然成立。没有单一行业占优时,按它**实际横跨的几个行业**分别查。 |
386
+ | 🌏 **你到底在赌什么** | 对大盘、对 KOSPI、对 KOSDAQ、对费城半导体的相关性,以及 11 个板块 SPDR 的离散度。交易日**按日期配对** —— 韩美假期不同,按数组位置压缩会拿周二比周三。 |
387
+ | 💵 **不允许被做假的资金流** | 申购减赎回、按 NAV 计价。只有申报份额或发行商自己的 AUM÷NAV 恒等式可以参与计算;由持仓反推的份额被拒绝,因为相减会把数字消掉、把误差留下。 |
@@ -238,7 +238,7 @@ export const coreSeats = Object.freeze({
238
238
  proposed_native_decision_contract: {
239
239
  schema_id: "expected_market_return_v1",
240
240
  eligibility_facts: ["basket dividend yield", "basket earnings growth", "long bond yield", "holdings concentration"],
241
- states: ["insufficient_return_inputs", "overpriced_market", "fair_expected_return", "low_cost_index_candidate"],
241
+ states: ["not_a_basket", "insufficient_return_inputs", "overpriced_market", "fair_expected_return", "low_cost_index_candidate"],
242
242
  required_outputs: ["fundamental expected return", "expected return over the long bond", "valuation component", "breadth of the holding"],
243
243
  fail_closed_reasons: ["no basket-level yield", "no earnings growth input", "no holdings breakdown"],
244
244
  },
@@ -269,10 +269,14 @@ export const coreSeats = Object.freeze({
269
269
  // The method is about owning the whole market. Without a holdings breakdown you cannot
270
270
  // tell whether the fund is the market or a concentrated bet dressed as an index.
271
271
  {
272
- condition_id: "master_bogle.holdings_breadth_visible",
272
+ condition_id: "master_bogle.subject_is_a_basket",
273
273
  condition: { op: "exists", value: { fact_id: "fund.top_ten_weight" } },
274
- on_false: { native_state: "insufficient_return_inputs", common_stance: "out_of_scope" },
275
- on_uncomputable: { native_state: "insufficient_return_inputs", common_stance: "out_of_scope" },
274
+ // A holdings breakdown exists for a basket and cannot exist for a single company, so
275
+ // this is the seat's scope test rather than a data check. Bogle's method prices what
276
+ // a whole market earns; asked about one business it declines by construction, and the
277
+ // state says that rather than naming a fact the subject was never going to have.
278
+ on_false: { native_state: "not_a_basket", common_stance: "out_of_scope" },
279
+ on_uncomputable: { native_state: "not_a_basket", common_stance: "out_of_scope" },
276
280
  },
277
281
  ],
278
282
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schema_version": 1,
3
3
  "channel": "solo_test",
4
- "package_version": "1.0.2",
4
+ "package_version": "1.0.3",
5
5
  "persona_pack_version": "0.9.4",
6
6
  "pack_root": "knowledge/solo-test/masters",
7
7
  "assurance_class": "provisional_derived_proxy",
@@ -1072,7 +1072,7 @@ const seats = [
1072
1072
  decision: {
1073
1073
  schemaId: "expected_market_return_v1",
1074
1074
  eligibility: ["basket dividend yield", "basket earnings growth", "long bond yield", "holdings concentration"],
1075
- states: ["insufficient_return_inputs", "overpriced_market", "fair_expected_return", "low_cost_index_candidate"],
1075
+ states: ["not_a_basket", "insufficient_return_inputs", "overpriced_market", "fair_expected_return", "low_cost_index_candidate"],
1076
1076
  outputs: ["fundamental expected return", "expected return over the long bond", "valuation component", "breadth of the holding"],
1077
1077
  failClosed: ["no basket-level yield", "no earnings growth input", "no holdings breakdown"],
1078
1078
  },
@@ -0,0 +1,116 @@
1
+ # v1.1 — Every seat reaches a verdict, and says something worth reading
2
+
3
+ Two real runs are the specification for this plan. An INTC run put six seats into the
4
+ deterministic fallback and a GLW run put **all eight** selected seats at `out_of_scope` with
5
+ weight zero — and the filings contained the data every one of them said was missing.
6
+
7
+ Everything below is either a defect those runs exposed or the reason a seat that did speak said
8
+ one sentence.
9
+
10
+ ## What is already fixed
11
+
12
+ Landed on `main` before this plan, and the measurements below are after it:
13
+
14
+ - **Tag aliases.** `grossProfit` resolved for five of fifteen large caps, because most filers
15
+ never tag it and publish revenue and cost of revenue separately. It is now derived from those.
16
+ `capex` missed Corning entirely, which files `PaymentsForCapitalImprovements` — that single
17
+ absent alias removed owner earnings, and with it Buffett and Ackman, for every issuer tagging
18
+ it that way. `interestExpense` and `operatingIncome` gained the aliases four more filers use.
19
+ Gross margin now resolves for all fourteen testable filers; GLW went from missing owner
20
+ earnings to 7/7 screen rules and 7/8 derived facts.
21
+ - **The maturity suffix stopped leaking into sentences.** Statements read "using the X
22
+ provisional operator lens method". The stripper existed and was not applied on that path.
23
+
24
+ ## The five defects that remain
25
+
26
+ ### 1. A seat cannot reach its own answer about an absent fact
27
+
28
+ `master_pabrai` is authored with a veto that says: no reconstructable downside floor means
29
+ pass. On INTC the floor was absent, so the **eligibility gate failed first** and the seat
30
+ reported "missing `valuation.downside_floor`". The veto the author wrote for exactly this case
31
+ never ran. Same shape for `graham.no_asset_floor`, `klarman.no_reconstructable_downside`,
32
+ `burry.cannot_survive_the_wait`, `fisher.no_worthwhile_margin`.
33
+
34
+ The cause is mechanical: those facts are **tool inputs**, so `authoredFactUse` marks them
35
+ required, and a missing required fact ends the run before any veto is evaluated.
36
+
37
+ **Fix.** A hard veto whose condition references a fact is the seat's declared handling of that
38
+ fact. Before failing a seat for a missing required fact, evaluate the vetoes that reference it;
39
+ if one fires on absence, that veto's `on_trigger` is the decision. This is not a new policy — it
40
+ is running the policy the author already wrote, in the case it was written for.
41
+
42
+ ### 2. Market-level facts are fetched only for baskets
43
+
44
+ `master_asness`, `master_marks` and `master_damodaran` require
45
+ `index.aggregate_earnings_yield`. On INTC — a company — the pipeline never fetched it, so three
46
+ seats reported a missing fact on every single-company run in the product's history.
47
+
48
+ This is a category error in the plumbing, not in the seats. The market's aggregate earnings
49
+ yield is not a property of the subject; it is the yardstick the subject is measured against.
50
+ Damodaran's implied-ERP method needs it, Asness's Fed-model critique **is about it**, and Marks
51
+ reads it as where the cycle stands. All three are asking about the market, correctly.
52
+
53
+ **Fix.** Fetch the broad-market index aggregate for every US subject, company or basket. The
54
+ subject decides whose *holdings* are read; it does not decide whether the market has a P/E.
55
+
56
+ ### 3. Bogle has no way to decline a company
57
+
58
+ `master_bogle` prices a basket. Asked about INTC it reported "missing `index.dividend_yield`",
59
+ which reads as a data gap and is really a scope statement. Its build spec plans a
60
+ `single_business` veto that was never authored.
61
+
62
+ **Fix.** Author it. The seat declines a single operating company by construction and says so in
63
+ its own words, the way `li_lu` and `forensic_short` already do.
64
+
65
+ ### 4. A subject can resolve to a registrant with no filings
66
+
67
+ `XOM` resolves through SEC's own ticker file to **ExxonMobil Holdings Corp**, CIK 0002115436, a
68
+ newly formed entity with **zero** us-gaap tags. The operating history — 438 tags — sits under
69
+ CIK 0000034088. Every fact then reports as missing, individually, with no line saying the
70
+ registrant itself is empty.
71
+
72
+ **Fix.** Detect an empty Company Facts document and say so as one diagnosis rather than eight.
73
+ Then attempt recovery: the submissions record carries former names, and a former name that
74
+ resolves to a registrant with facts is the predecessor. Where recovery fails, the run states
75
+ which registrant it read and that it has no XBRL history — actionable, rather than a mystery.
76
+
77
+ ### 5. Seats say one sentence
78
+
79
+ The five-field voice contract exists — `what_i_see`, `how_my_method_reads_it`, `would_i_act`,
80
+ `what_changes_my_mind`, `where_i_disagree` — and the paths that actually run fill a single
81
+ `voice_statement` instead. So a seat that computed a real verdict from real facts reports it in
82
+ one line, and the reader cannot see what it looked at.
83
+
84
+ **Fix.** The deterministic record already contains everything the fields need: which facts were
85
+ read and their values, which scoring rules hit and missed, which vetoes fired, the band the
86
+ score landed in, and the conditions that would change it. Compose the five fields **from the
87
+ frozen decision** rather than asking a model to restate a sentence. This is the honest version:
88
+ the seat's explanation becomes a rendering of what it actually computed, and it cannot drift
89
+ from the verdict because it is derived from it.
90
+
91
+ Declined seats get the same structure: what was looked for, why the method needs it, what would
92
+ change the answer.
93
+
94
+ ## Order of work
95
+
96
+ Each step is independently verifiable, and the measurement after each is the same one: how many
97
+ seats reach a stance on a mixed symbol set, with contract failures counted separately.
98
+
99
+ | step | defect | expected effect |
100
+ |---|---|---|
101
+ | 1 | market-level facts for companies (#2) | 3 seats on every company run |
102
+ | 2 | absence-handling vetoes reachable (#1) | 4–5 seats, converted from "missing" to a verdict |
103
+ | 3 | bogle declines a company (#3) | 1 seat, and it stops reading as a data gap |
104
+ | 4 | empty registrant (#4) | whole-run failures become one named diagnosis |
105
+ | 5 | five-field voice from the frozen decision (#5) | every speaking seat, which is the point |
106
+
107
+ Steps 1–3 are what turn "缺少数据" into an answer. Step 5 is what makes the answer worth
108
+ reading. Step 4 is small and prevents the worst failure mode, which is a run where everything is
109
+ missing and nothing says why.
110
+
111
+ ## What this plan does not do
112
+
113
+ It does not make a seat speak by lowering a threshold or by substituting a proxy for a fact the
114
+ method actually needs. A seat that declines after reading the evidence is a result; the defect
115
+ was never that seats declined, it was that they could not tell the reader whether they had
116
+ declined or had simply not been given anything to read.
@@ -18,7 +18,7 @@
18
18
  "formal_h_satisfied": false,
19
19
  "human_reference": false,
20
20
  "input_binding": {
21
- "input_hash": "sha256:db8f31c70e4b4589561a53127b16985a8b9d09000ba536df3467eacf857d2d0c",
21
+ "input_hash": "sha256:cc4ffaa54c9477000383adc82ba43800c3725c331638f2f8f63cad15582a128f",
22
22
  "path": "simulation-input.json"
23
23
  },
24
24
  "network_allowed": false,
@@ -54,7 +54,7 @@
54
54
  "verifier_checks": []
55
55
  },
56
56
  "reviewer_kind": "ai",
57
- "run_artifact_hash": "sha256:a0161522586f9a9b2ee80b68081279ec2b9399692e8e9e1ec56aef00379d27db",
57
+ "run_artifact_hash": "sha256:699e79ff212ba32d287d8847828b46e6bd46076519c6dc8dca5e9ac09f6d769f",
58
58
  "run_id": "A",
59
59
  "schema_version": 1,
60
60
  "simulation_scope": "single deterministic seat surrogate; formal single-model answer is not simulated"
@@ -16,7 +16,7 @@
16
16
  "formal_h_satisfied": false,
17
17
  "human_reference": false,
18
18
  "input_binding": {
19
- "input_hash": "sha256:db8f31c70e4b4589561a53127b16985a8b9d09000ba536df3467eacf857d2d0c",
19
+ "input_hash": "sha256:cc4ffaa54c9477000383adc82ba43800c3725c331638f2f8f63cad15582a128f",
20
20
  "path": "simulation-input.json"
21
21
  },
22
22
  "network_allowed": false,
@@ -37,7 +37,7 @@
37
37
  "verifier_checks": []
38
38
  },
39
39
  "reviewer_kind": "ai",
40
- "run_artifact_hash": "sha256:133ca81d8703085824a374f545ca30f83e90e4af45b8bdab17ed5aaa0e39adb1",
40
+ "run_artifact_hash": "sha256:423ac48286f88cd5e95942dce855507559d54fe7fd3a5481327424c4e6966f85",
41
41
  "run_id": "B",
42
42
  "schema_version": 1,
43
43
  "simulation_scope": "frozen-input control digest only; eight LLM analyst outputs are not simulated"
@@ -16,7 +16,7 @@
16
16
  "formal_h_satisfied": false,
17
17
  "human_reference": false,
18
18
  "input_binding": {
19
- "input_hash": "sha256:db8f31c70e4b4589561a53127b16985a8b9d09000ba536df3467eacf857d2d0c",
19
+ "input_hash": "sha256:cc4ffaa54c9477000383adc82ba43800c3725c331638f2f8f63cad15582a128f",
20
20
  "path": "simulation-input.json"
21
21
  },
22
22
  "network_allowed": false,
@@ -37,7 +37,7 @@
37
37
  "verifier_checks": []
38
38
  },
39
39
  "reviewer_kind": "ai",
40
- "run_artifact_hash": "sha256:0760f289508bcbed0222e48531f3b0f8c394243fca4d7f6ad0a8de0b53fbb1b9",
40
+ "run_artifact_hash": "sha256:9a10ff578582c9476676ac454577d40e71aeb83dea128275e76d1d7e1d566f6c",
41
41
  "run_id": "C",
42
42
  "schema_version": 1,
43
43
  "simulation_scope": "prompt-catalog binding only; prompt-only LLM outputs are not simulated"
@@ -30,7 +30,7 @@
30
30
  "formal_h_satisfied": false,
31
31
  "human_reference": false,
32
32
  "input_binding": {
33
- "input_hash": "sha256:db8f31c70e4b4589561a53127b16985a8b9d09000ba536df3467eacf857d2d0c",
33
+ "input_hash": "sha256:cc4ffaa54c9477000383adc82ba43800c3725c331638f2f8f63cad15582a128f",
34
34
  "path": "simulation-input.json"
35
35
  },
36
36
  "network_allowed": false,
@@ -234,7 +234,7 @@
234
234
  "verifier_checks": []
235
235
  },
236
236
  "reviewer_kind": "ai",
237
- "run_artifact_hash": "sha256:6e5ae1711c012a4a7bb670090485ed071f5fdb66f33145e3adf9fb394c2231df",
237
+ "run_artifact_hash": "sha256:4ea0207eb1f9090b7a841585a268d8bef366a61d23b22bdeee0295bb52d47610",
238
238
  "run_id": "D13",
239
239
  "schema_version": 1,
240
240
  "simulation_scope": "13 physical provisional deterministic seats on frozen synthetic typed facts"
@@ -44,12 +44,12 @@
44
44
  "formal_h_satisfied": false,
45
45
  "human_reference": false,
46
46
  "input_binding": {
47
- "input_hash": "sha256:db8f31c70e4b4589561a53127b16985a8b9d09000ba536df3467eacf857d2d0c",
47
+ "input_hash": "sha256:cc4ffaa54c9477000383adc82ba43800c3725c331638f2f8f63cad15582a128f",
48
48
  "path": "simulation-input.json"
49
49
  },
50
50
  "network_allowed": false,
51
51
  "production_effect": "none",
52
- "result_hash": "sha256:60f6be2cd9f6592112477193e168f38ab6c87bc97e2e6f6988a41d3ab93c1a1e",
52
+ "result_hash": "sha256:a02104172ac2dac35447f40aa9e0a075fffdedad67111b08055be4fe108e3bc6",
53
53
  "results": {
54
54
  "blocked_fail_closed_count": 1,
55
55
  "completion_status": "completed_machine_simulation",
@@ -417,18 +417,18 @@
417
417
  "structured_decision_hash": "sha256:c7a93f8c67eb3c423fc94ef0d51bb868ab5444d75aba2d17455e9ce0a20965d1"
418
418
  },
419
419
  {
420
- "anonymous_method_hash": "sha256:7c9acb22fb3cc01bde6064242f52e2cd9d64cde774945543c6465c4eacfe23fb",
421
- "deterministic_core_hash": "sha256:9d6d0a0af67b24c6b66edba2816e8b7e6b68ece2049752e5803bb3d6d9ea11d3",
420
+ "anonymous_method_hash": "sha256:7e72f0c819a737e9e2c95938807bd1f856427fefbff42cc6a52dad7c4b9648b9",
421
+ "deterministic_core_hash": "sha256:aedc8b29c59176e6cf5994b51682a2fb1cfe2cb62f0f5882f4de16c220ce00f6",
422
422
  "fact_pack_hash": "sha256:d035c7f7cbace9a80cce787b1ea3204f7b85437e4552dec34681765f0ab3af26",
423
- "frozen_decision_hash": "sha256:6a20b189b8a782c7e03c290eab45f7fc3ee8826fb3bc158ded0880d4e1f287ad",
423
+ "frozen_decision_hash": "sha256:f82a1fb3c31d68ae5c1ce9e93fa6d1f61f3f373c14a999d7ac52bc398b8f1ca4",
424
424
  "native_state": "provisional_fair_expected_return",
425
- "pack_hash": "sha256:73e829f5d2e3b1124689635cb70bbef8f764559603689a5eae9920716eaf5d1c",
425
+ "pack_hash": "sha256:cbc29f36bcf214b24045d582bf954d06cda6cec3aab06c41f650f7410df510f0",
426
426
  "persona_id": "master_bogle",
427
- "policy_execution_hash": "sha256:faa5ebcd8ead470e03bb2c38e6b62eb2aade6218f049655e7e901aeccf280f5b",
427
+ "policy_execution_hash": "sha256:3f4dfca52772b1f9ad7adec925acdba1d45bdabcd9a5d1272646d86601e20c4c",
428
428
  "score_ratio": 0.6666666666666666,
429
429
  "stance": "cautious",
430
430
  "status": "executed",
431
- "structured_decision_hash": "sha256:039e8c42dea63e6bc432446a6a285a3a3c1f6b4a2011faa46f3f40d81113e12a"
431
+ "structured_decision_hash": "sha256:71b52271b65d7229fe95524d953262eb175380066709f7bf50e4ee9386083a0e"
432
432
  }
433
433
  ],
434
434
  "deterministic_execution_count": 27,
@@ -449,7 +449,7 @@
449
449
  "verifier_checks": []
450
450
  },
451
451
  "reviewer_kind": "ai",
452
- "run_artifact_hash": "sha256:184b9acfc9670ced5e8a41f346a3f6fc90d3e7f5db5f6093f61e4425d267d527",
452
+ "run_artifact_hash": "sha256:eb5d0df7917c119e07f82f7d7b84b4d4e84c6423753462ca7a26f9be16ebfef8",
453
453
  "run_id": "D26",
454
454
  "schema_version": 1,
455
455
  "simulation_scope": "27 physical provisional deterministic seats on frozen synthetic typed facts"
@@ -30,12 +30,12 @@
30
30
  "formal_h_satisfied": false,
31
31
  "human_reference": false,
32
32
  "input_binding": {
33
- "input_hash": "sha256:db8f31c70e4b4589561a53127b16985a8b9d09000ba536df3467eacf857d2d0c",
33
+ "input_hash": "sha256:cc4ffaa54c9477000383adc82ba43800c3725c331638f2f8f63cad15582a128f",
34
34
  "path": "simulation-input.json"
35
35
  },
36
36
  "network_allowed": false,
37
37
  "production_effect": "none",
38
- "result_hash": "sha256:f77176ca2d3788eb4bcd741ae4d7de67fa0daa57e4049f6dbe26b45ce9d3b587",
38
+ "result_hash": "sha256:cae640f5823d7fb27090bf7591d444917cc7f5bfe339cf57151f2fae3669fdcd",
39
39
  "results": {
40
40
  "blocked_fail_closed_count": 0,
41
41
  "completion_status": "completed_machine_simulation",
@@ -234,7 +234,7 @@
234
234
  "verifier_checks": [
235
235
  {
236
236
  "check_id": "physical_input_hash_binding",
237
- "input_hash": "sha256:db8f31c70e4b4589561a53127b16985a8b9d09000ba536df3467eacf857d2d0c",
237
+ "input_hash": "sha256:cc4ffaa54c9477000383adc82ba43800c3725c331638f2f8f63cad15582a128f",
238
238
  "status": "pass"
239
239
  },
240
240
  {
@@ -251,7 +251,7 @@
251
251
  ]
252
252
  },
253
253
  "reviewer_kind": "ai",
254
- "run_artifact_hash": "sha256:76d61211082a3e02ac4e9196b5732183d6ca6c529e9e990622a228bc0e599bd5",
254
+ "run_artifact_hash": "sha256:3817bcac7b4ce7d1d0ddf06381b31b463b05790461f38de6b17e26ae2250f297",
255
255
  "run_id": "E:D13",
256
256
  "schema_version": 1,
257
257
  "simulation_scope": "D13 deterministic seats plus machine-only hash, rederivation and fail-closed checks"