alphacouncil-agent 0.6.0 → 0.8.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-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/CHANGELOG.md +89 -0
- package/data/social-handles.json +25 -0
- package/docs/persona-v2-spec.md +278 -0
- package/docs/personas.md +1 -1
- package/docs/plans/0.8.0-master-models.md +155 -0
- package/docs/roadmap.md +104 -0
- package/knowledge/masters/master_buffett/manifest.json +209 -0
- package/knowledge/masters/master_duan_yongping/manifest.json +201 -0
- package/knowledge/masters/master_marks/manifest.json +182 -0
- package/knowledge/masters/master_taleb/manifest.json +182 -0
- package/mcp/lib/constants.mjs +4 -0
- package/mcp/lib/gates.mjs +3 -1
- package/mcp/lib/markdown.mjs +189 -0
- package/mcp/lib/orchestrator.mjs +73 -7
- package/mcp/lib/packets.mjs +42 -1
- package/mcp/lib/personas-v2/ablation.mjs +148 -0
- package/mcp/lib/personas-v2/bridge.mjs +187 -0
- package/mcp/lib/personas-v2/loader.mjs +118 -0
- package/mcp/lib/personas-v2/memory.mjs +156 -0
- package/mcp/lib/personas-v2/policy.mjs +187 -0
- package/mcp/lib/personas-v2/slice.mjs +96 -0
- package/mcp/lib/rpc.mjs +56 -6
- package/mcp/lib/social.mjs +32 -1
- package/package.json +6 -1
- package/personas/masters/masters-adversarial/{short_seller.md → forensic_short.md} +20 -5
- package/schemas/persona-v2.schema.json +180 -0
|
@@ -6,14 +6,14 @@
|
|
|
6
6
|
},
|
|
7
7
|
"metadata": {
|
|
8
8
|
"description": "AlphaCouncil plugins for public-equity research.",
|
|
9
|
-
"version": "0.
|
|
9
|
+
"version": "0.8.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.8.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.8.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/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,95 @@
|
|
|
2
2
|
|
|
3
3
|
Notable changes per release. Dates are UTC.
|
|
4
4
|
|
|
5
|
+
## [0.8.0] — 2026-07-27
|
|
6
|
+
|
|
7
|
+
Minor rather than patch: **the master bench changes from prompt voices to method models,
|
|
8
|
+
and a defect is fixed that manufactured consensus in every prior run.**
|
|
9
|
+
|
|
10
|
+
A user asked why the masters never appear in the report. The answer turned out to be three
|
|
11
|
+
problems wearing one coat, and the third is the one that mattered.
|
|
12
|
+
|
|
13
|
+
### Fixed
|
|
14
|
+
|
|
15
|
+
- **An unrecognised master stance was silently rewritten as `cautious`.** The enum check
|
|
16
|
+
fell through to a default and the default was a real stance carrying real weight, so a
|
|
17
|
+
caller writing `avoid`, `long` or `neutral` got a seat that looked deliberate and voted.
|
|
18
|
+
A ten-seat run whose opinions ranged from avoid to long **recorded `cautious` ten times**
|
|
19
|
+
and rendered as a unanimity nobody produced. Worse in the other direction: a mistyped
|
|
20
|
+
`out_of_scope`, which carries zero weight, would have been promoted to a full vote.
|
|
21
|
+
Unmappable values now record as `out_of_scope` and warn; plausible synonyms are mapped;
|
|
22
|
+
the tool schema states the enum so a caller can see it before guessing.
|
|
23
|
+
- **Master opinions were rendered nowhere.** `markdown.mjs` contained no reference to
|
|
24
|
+
`master`. Opinions were recorded, gated for completeness and weighted into the synthesis,
|
|
25
|
+
and a run could select ten lenses, pass every gate, and publish a report in which none of
|
|
26
|
+
them were readable.
|
|
27
|
+
- **`record_*` echoed the entire run on every call.** Payloads grew with each recording and
|
|
28
|
+
a late call in a twenty-one-seat run passed 240k characters — context exhaustion arriving
|
|
29
|
+
exactly when a run was nearly finished. They now return progress and a path to
|
|
30
|
+
`status.json`.
|
|
31
|
+
- **The Bluesky handle loader silently returned an empty list**, because `readFileSync` was
|
|
32
|
+
never imported and the `catch` swallowed the `ReferenceError`.
|
|
33
|
+
|
|
34
|
+
### Added
|
|
35
|
+
|
|
36
|
+
- **Persona v2: method models, not impressions.** A master is now an eligibility gate, a
|
|
37
|
+
scoring function with cited thresholds, an evidence slice and a narrative — in that order,
|
|
38
|
+
with the model confined to the last. `docs/persona-v2-spec.md`,
|
|
39
|
+
`schemas/persona-v2.schema.json`.
|
|
40
|
+
- **Four pilot packs** — Buffett, Duan Yongping, Marks, Taleb — each with its own gate rather
|
|
41
|
+
than its own adjectives. On the real NOK facts the Buffett method declines (a 20-F filer
|
|
42
|
+
has no long-run series) while the Taleb method acts (an option chain exists). Different
|
|
43
|
+
methods see different companies, which twenty-one prompts over one brief never could.
|
|
44
|
+
- **The admission bar is enforced in the loader.** A corpus below 25 propositions / 5 primary
|
|
45
|
+
sources / 5 decisions / 3 failures / 10 vetoes / 10 counterfactuals is downgraded to
|
|
46
|
+
`operator_lens` and carries its shortfall. All four pilots are honestly below it. A display
|
|
47
|
+
name reading as a person, a doctrine rule citing no grade A/B source, and a threshold
|
|
48
|
+
without provenance are each refused.
|
|
49
|
+
- **Swap experiments.** Name swap: renaming a pack moves no verdict. Policy swap: Taleb's
|
|
50
|
+
policy under Buffett's name judges as Taleb. The differentiation diagnostic returns `none`
|
|
51
|
+
for four renamed copies of one method, which is what makes `effective` on the real four
|
|
52
|
+
worth anything.
|
|
53
|
+
- **Memory with both clauses of the leak rule** — `public_at <= as_of AND
|
|
54
|
+
memory_created_at <= as_of`. The second clause stops a model reading its own diary. Undated
|
|
55
|
+
records are excluded rather than assumed harmless, and a postmortem cannot be written
|
|
56
|
+
before the horizon it judges.
|
|
57
|
+
- **Enforced evidence slices.** The frozen fact pack is shared and unoverridable; what each
|
|
58
|
+
method may read on top of it is filtered in code, not requested in a prompt.
|
|
59
|
+
|
|
60
|
+
### Changed
|
|
61
|
+
|
|
62
|
+
- **The bench prints dissent first**, and a correlation note above every bench states that
|
|
63
|
+
the seats share a base model and an evidence brief, so their agreement is not independent
|
|
64
|
+
confirmation and the stance spread is not a vote count. Unanimity is reported as the
|
|
65
|
+
absence of independent dissent.
|
|
66
|
+
- **`master_bench` is a required report section**, conditional on a bench having run, so
|
|
67
|
+
screen and quick modes are not failed for omitting one they never selected.
|
|
68
|
+
- **Curated Bluesky accounts** are configurable by file or environment and ship **empty**:
|
|
69
|
+
unverified handles would be invented sources inside a tool that exists to refuse them. X
|
|
70
|
+
remains uncovered and the payload says so.
|
|
71
|
+
|
|
72
|
+
### Wired into the live run
|
|
73
|
+
|
|
74
|
+
`plan_visible_run` takes the deterministic pass before spawning anything. A seat whose
|
|
75
|
+
method cannot reach the security is settled during planning and written straight into the
|
|
76
|
+
run as an `out_of_scope` opinion — the completeness gate is satisfied and no agent is paid
|
|
77
|
+
for a lens that had already declined. A seat that can look receives its settled verdict
|
|
78
|
+
inside the prompt and is told to explain it rather than choose one; `record_master_opinion`
|
|
79
|
+
then reconciles what came back, and a narrated stance contradicting the arithmetic does not
|
|
80
|
+
win quietly — the deterministic verdict stands and the disagreement is kept as
|
|
81
|
+
`narrated_stance`.
|
|
82
|
+
|
|
83
|
+
Two distinctions the wiring forced. Absent grounding is not a screen that computed nothing:
|
|
84
|
+
a run that was never measured falls back to v1 prompts instead of having its bench declined
|
|
85
|
+
on missing data. And a declined seat cannot merely be skipped, because the completeness gate
|
|
86
|
+
counts every selected master.
|
|
87
|
+
|
|
88
|
+
### Still open
|
|
89
|
+
|
|
90
|
+
The remaining seventeen masters, and `N_eff` — which needs an error-correlation matrix, which
|
|
91
|
+
needs resolved ground truth that does not exist yet. Investment return is recorded as a
|
|
92
|
+
long-run outcome and is never a gate.
|
|
93
|
+
|
|
5
94
|
## [0.6.0] — 2026-07-26
|
|
6
95
|
|
|
7
96
|
Minor rather than patch: **every screened number changes.** Anyone comparing a result from
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_readme": [
|
|
3
|
+
"Curated Bluesky accounts read by get_social_pulse. Reading a named account is public;",
|
|
4
|
+
"search is not, so a curated list is the only free path to a professional layer -- and a",
|
|
5
|
+
"curated list was the better design anyway, because cashtag search is where the",
|
|
6
|
+
"promotional accounts live.",
|
|
7
|
+
"",
|
|
8
|
+
"This ships EMPTY on purpose. Shipping a list of handles that were never verified to",
|
|
9
|
+
"exist would put invented sources into a tool whose entire job is refusing invented",
|
|
10
|
+
"sources. Add accounts you have opened and checked yourself.",
|
|
11
|
+
"",
|
|
12
|
+
"Override the file with ALPHACOUNCIL_SOCIAL_HANDLES (comma-separated) or pass handles",
|
|
13
|
+
"directly to get_social_pulse.",
|
|
14
|
+
"",
|
|
15
|
+
"Honest scope: this does not restore X/Twitter coverage. X has no free discovery channel",
|
|
16
|
+
"-- Nitter search is dead, the X API bills per post, xAI bills per call -- so the",
|
|
17
|
+
"professional FinTwit layer stays uncovered unless you supply your own credential.",
|
|
18
|
+
"Reddit is not a substitute for it and must never be reported as one."
|
|
19
|
+
],
|
|
20
|
+
"handles": [],
|
|
21
|
+
"notes": {
|
|
22
|
+
"format": "Bluesky handle without the leading @, e.g. someone.bsky.social",
|
|
23
|
+
"max_read": 12
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
# Persona v2 — Method Models, Not Impressions
|
|
2
|
+
|
|
3
|
+
Specification for the 0.8.0 master rewrite. Background: `docs/roadmap.md`. Superseded
|
|
4
|
+
sections of the earlier plan are noted in `docs/plans/0.8.0-master-models.md`.
|
|
5
|
+
|
|
6
|
+
## Naming discipline
|
|
7
|
+
|
|
8
|
+
These are **method models**, never people. Every user-facing surface says so.
|
|
9
|
+
|
|
10
|
+
```
|
|
11
|
+
Buffett Method Model not "Warren Buffett"
|
|
12
|
+
Duan Yongping Method Model not "段永平"
|
|
13
|
+
Marks Method Model Taleb Method Model
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
A model whose source corpus does not clear the admission bar below is not named after a
|
|
17
|
+
person at all. It is an **Operator Lens** — `Duan-inspired Operator Lens` — and the report
|
|
18
|
+
says which of the two it is. Claiming to hold a living investor's judgment because a model
|
|
19
|
+
can imitate the cadence is the specific dishonesty this document exists to prevent.
|
|
20
|
+
|
|
21
|
+
## Why the previous design failed
|
|
22
|
+
|
|
23
|
+
Twenty-one masters were twenty-one prompt voices over one base model and one evidence
|
|
24
|
+
brief. Their errors correlate, so agreement between them is not confirmation. The published
|
|
25
|
+
result is blunt: LLM errors run **>60% correlated**, majority voting inherits legitimacy
|
|
26
|
+
from a theorem requiring independence, and with identical inputs debate is a **martingale** —
|
|
27
|
+
expected correctness does not improve across rounds.
|
|
28
|
+
|
|
29
|
+
The 0.7.0 work produced empirical support that nobody predicted. Recording ten opinions
|
|
30
|
+
whose stances ranged from avoid to long, the run stored **`cautious` ten times**: the enum
|
|
31
|
+
check fell through to a default, and the default was a real stance carrying real weight. A
|
|
32
|
+
unanimity no master produced, manufactured by a normalizer.
|
|
33
|
+
|
|
34
|
+
That is the load-bearing lesson for this spec: **a structured decision layer is only as
|
|
35
|
+
honest as its rejection layer.** Silent coercion of an unrecognised value into a plausible
|
|
36
|
+
one is the same failure as an imitation passing for a judgment — a shape that looks like a
|
|
37
|
+
decision, holding no decision.
|
|
38
|
+
|
|
39
|
+
## Six modules per model
|
|
40
|
+
|
|
41
|
+
Capability is the first five. Voice is the sixth and touches nothing above it.
|
|
42
|
+
|
|
43
|
+
| Module | File | Decides |
|
|
44
|
+
|---|---|---|
|
|
45
|
+
| Doctrine | `doctrine.jsonl` | what the method asserts, with sources |
|
|
46
|
+
| Research policy | `research_policy.json` | what it goes and looks for, privately |
|
|
47
|
+
| Decision policy | `decision_policy.json` | what it computes, vetoes, and refuses |
|
|
48
|
+
| Tools | `tools.json` | which calculators it may call |
|
|
49
|
+
| Memory | `memory_policy.json` | what it remembers and when it may read it |
|
|
50
|
+
| Voice | `voice.<lang>.md` | how the finished verdict reads |
|
|
51
|
+
|
|
52
|
+
**Voice may not participate in fact extraction, computation, or signal generation.** A
|
|
53
|
+
system that lets style reach the decision will score "sounds like Omaha" as "judges like
|
|
54
|
+
Omaha", which is the confusion the whole exercise is meant to end.
|
|
55
|
+
|
|
56
|
+
## Doctrine entries are rules, not quotations
|
|
57
|
+
|
|
58
|
+
```jsonc
|
|
59
|
+
{
|
|
60
|
+
"rule_id": "buffett.circle_of_competence.01",
|
|
61
|
+
"claim": "Stop valuing a business whose model cannot be explained in a paragraph",
|
|
62
|
+
"scope": ["public_equity", "operating_business"],
|
|
63
|
+
"trigger": "business_model_explanation_failed",
|
|
64
|
+
"action": "out_of_scope",
|
|
65
|
+
"source_ids": ["buffett:S17", "buffett:S23"],
|
|
66
|
+
"confidence": "high",
|
|
67
|
+
"counterexamples": [],
|
|
68
|
+
"version": 1
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Every entry carries source, scope, trigger, action, counterexamples, confidence, version.
|
|
73
|
+
An entry without `source_ids` cannot be loaded.
|
|
74
|
+
|
|
75
|
+
### Source grades
|
|
76
|
+
|
|
77
|
+
| Grade | What it is | May define |
|
|
78
|
+
|---|---|---|
|
|
79
|
+
| A | Signed letters, articles, formal talks, company filings | core decision rules |
|
|
80
|
+
| B | Verifiable full interviews or meeting transcripts | core decision rules |
|
|
81
|
+
| C | Direct quotation in reliable press | supporting rules only |
|
|
82
|
+
| D | Third-party summary | staging area, never a rule |
|
|
83
|
+
| E | Unsourced internet aphorism | rejected |
|
|
84
|
+
|
|
85
|
+
Only **A/B** define a rule. The repository stores short summaries, method propositions,
|
|
86
|
+
source URLs, dates, minimal necessary excerpts, and the boundary of applicability — not
|
|
87
|
+
long copyrighted passages.
|
|
88
|
+
|
|
89
|
+
### Admission bar for a named model
|
|
90
|
+
|
|
91
|
+
- ≥25 sourced method propositions
|
|
92
|
+
- ≥5 independent primary (A/B) sources
|
|
93
|
+
- ≥5 real decision cases
|
|
94
|
+
- ≥3 documented failures, misses, or changes of mind
|
|
95
|
+
- ≥10 executable veto conditions
|
|
96
|
+
- ≥10 counterfactual tests
|
|
97
|
+
|
|
98
|
+
Errors and reversals matter more than aphorisms: they are what define the boundary of a
|
|
99
|
+
method. Below the bar, the model is an Operator Lens and is labelled as one.
|
|
100
|
+
|
|
101
|
+
## Evidence: shared facts, private research
|
|
102
|
+
|
|
103
|
+
1. **Frozen fact pack** — price, filed figures, filing dates, share count, option chain.
|
|
104
|
+
Identical for every model and **not overridable**. Four models must not discover four
|
|
105
|
+
market caps in the name of independence.
|
|
106
|
+
2. **Private research** — each model then runs its own query plan. Buffett-method looks for
|
|
107
|
+
moat, capital allocation and owner earnings; Duan-method for user value, operating
|
|
108
|
+
culture and opportunity cost; Marks-method for consensus, cycle position and risk
|
|
109
|
+
premium; Taleb-method for fragility, leverage, liquidity and convexity.
|
|
110
|
+
**Private material is invisible to the other seats until after first submission.**
|
|
111
|
+
3. **Independent recomputation** — each model recomputes at least two load-bearing figures
|
|
112
|
+
from the frozen pack. It may disagree with a derived number; it may not silently
|
|
113
|
+
overwrite a filed one.
|
|
114
|
+
|
|
115
|
+
This is the only lever that produces disagreement from something other than tone.
|
|
116
|
+
|
|
117
|
+
## Anonymous first round
|
|
118
|
+
|
|
119
|
+
First-round output carries no name and no style: evidence selected, computation performed,
|
|
120
|
+
decision, confidence, abandonment condition, and where it is most likely wrong. Identity
|
|
121
|
+
and voice are attached afterwards, before debate.
|
|
122
|
+
|
|
123
|
+
## Structured decision, with a rejection layer
|
|
124
|
+
|
|
125
|
+
```jsonc
|
|
126
|
+
{
|
|
127
|
+
"stance": "constructive",
|
|
128
|
+
"action": "watch",
|
|
129
|
+
"confidence": 0.68,
|
|
130
|
+
"method_fit": 0.91,
|
|
131
|
+
"circle_of_competence": "inside",
|
|
132
|
+
"required_evidence_complete": false,
|
|
133
|
+
"vetoes_triggered": [],
|
|
134
|
+
"price_conditions": [],
|
|
135
|
+
"position_cap": 0,
|
|
136
|
+
"belief_updates": [],
|
|
137
|
+
"memory_ids_used": [],
|
|
138
|
+
"source_ids": []
|
|
139
|
+
}
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
**Position size is never chosen by the model.** Deterministic code sets it from historical
|
|
143
|
+
calibration, evidence quality, verification results, error correlation with other seats,
|
|
144
|
+
portfolio limits, and triggered vetoes.
|
|
145
|
+
|
|
146
|
+
Every enumerated field is validated on the way in. An unrecognised value is **rejected or
|
|
147
|
+
recorded as a zero-weight abstention with a warning — never coerced into a neighbouring
|
|
148
|
+
valid value.** This rule exists because its absence already produced a fake consensus once.
|
|
149
|
+
|
|
150
|
+
## Memory, with a time boundary
|
|
151
|
+
|
|
152
|
+
| Layer | Written when | Mutable by a run |
|
|
153
|
+
|---|---|---|
|
|
154
|
+
| Doctrine | source review + version release | no |
|
|
155
|
+
| Episodic | every judgment | append only |
|
|
156
|
+
| Belief | on belief change, pointing at episodes and sources | yes |
|
|
157
|
+
| Postmortem | only after the prediction horizon expires | append only |
|
|
158
|
+
| Working | during a run, archived after | no |
|
|
159
|
+
|
|
160
|
+
**The leak rule.** In a run at `as_of = T`, a model may read only memories where
|
|
161
|
+
`public_at <= T` **and** `memory_created_at <= T`. Without the second clause a model reads
|
|
162
|
+
the future through its own diary, and every backtest built on it is fiction.
|
|
163
|
+
|
|
164
|
+
## Proving it is not a performance
|
|
165
|
+
|
|
166
|
+
Diagnostics that can return "this bench is decorative".
|
|
167
|
+
|
|
168
|
+
| Experiment | Change | Expected if real |
|
|
169
|
+
|---|---|---|
|
|
170
|
+
| **Name swap** | names only | **no material change** |
|
|
171
|
+
| **Policy swap** | load Taleb policy under the Buffett name | follows the policy, not the name |
|
|
172
|
+
| **Evidence swap** | private packs only | explicable parts move, vetoes hold |
|
|
173
|
+
| **Memory ablation** | drop episodic / postmortem / reflection / private retrieval | isolates which layer adds value |
|
|
174
|
+
| **Voice removal** | neutral JSON, blind raters | method still identifiable |
|
|
175
|
+
| **Model cross-over** | each persona on several models | separates persona from model |
|
|
176
|
+
| **Counterfactual** | −40% price, 2× debt, margin drop, integrity event, convex→concave payoff | each model moves by its own rules |
|
|
177
|
+
|
|
178
|
+
Name swap and policy swap are the cheapest and the most decisive. If a name change moves
|
|
179
|
+
the verdict, the system is acting.
|
|
180
|
+
|
|
181
|
+
`variance = company + persona + model + persona×model`. **If the model effect exceeds the
|
|
182
|
+
persona effect, no personality has been built.**
|
|
183
|
+
|
|
184
|
+
### N_eff is deferred, deliberately
|
|
185
|
+
|
|
186
|
+
`N_eff ≈ (Σw)² / (wᵀ C w)` needs an error-correlation matrix `C`, which needs resolved
|
|
187
|
+
ground truth on many cases. It is therefore **not a v1 deliverable** and must not be printed
|
|
188
|
+
before the postmortem corpus exists. Until then the report discloses correlation
|
|
189
|
+
qualitatively and refuses to publish a tally.
|
|
190
|
+
|
|
191
|
+
## Pilot: four models, chosen to be hard
|
|
192
|
+
|
|
193
|
+
| Model | Must independently develop | Private inputs |
|
|
194
|
+
|---|---|---|
|
|
195
|
+
| Buffett | circle of competence, moat, owner earnings, capital allocation | 10y financials, capex split, buyback/M&A record, pricing-power evidence |
|
|
196
|
+
| Duan Yongping | business model, 本分 culture, user value, stop-list, opportunity cost, default inaction | product/user evidence, management behaviour timeline, culture events, candidate comparator |
|
|
197
|
+
| Marks | cycle position, consensus, price-implied expectations, permanent loss | credit spreads, liquidity, valuation percentile, sentiment and positioning |
|
|
198
|
+
| Taleb | fragility, tail risk, convexity, ruin, barbell | option chain, liability structure, liquidity stress, extreme scenarios, payoff shape |
|
|
199
|
+
|
|
200
|
+
Buffett and Duan Yongping are chosen **because they are similar**. If the system can only
|
|
201
|
+
separate those two by tone, Persona v2 has failed and expansion stops.
|
|
202
|
+
|
|
203
|
+
## Acceptance gates for the pilot
|
|
204
|
+
|
|
205
|
+
Recalibrate after the first ten cases.
|
|
206
|
+
|
|
207
|
+
| Metric | Bar |
|
|
208
|
+
|---|---|
|
|
209
|
+
| Method propositions with sources | 100% |
|
|
210
|
+
| Unsupported direct quotations | 0 |
|
|
211
|
+
| Look-ahead leaks | 0 |
|
|
212
|
+
| Structured-policy adherence | ≥95% |
|
|
213
|
+
| Citations that actually support the claim | ≥95% |
|
|
214
|
+
| Counterfactual direction correct | ≥85% |
|
|
215
|
+
| Decision stability on repeated identical input | ≥80% |
|
|
216
|
+
| Blind method identification after name+voice removal | >70% (chance = 25%) |
|
|
217
|
+
| Error-correlation reduction vs. the 21 prompt masters | ≥15% |
|
|
218
|
+
| Final report pass rate | ≥95% |
|
|
219
|
+
| Runs still failing after auto-repair | <5% |
|
|
220
|
+
|
|
221
|
+
If groups D/E do not beat B/C on factual accuracy, citation support, calibration, or unique
|
|
222
|
+
information contribution, **stop and do not build the remaining seventeen.**
|
|
223
|
+
|
|
224
|
+
### Control groups
|
|
225
|
+
|
|
226
|
+
A: single strong model · B: current 8 analysts · C: 8 analysts + 21 prompt masters ·
|
|
227
|
+
D: 8 analysts + 4 Persona v2 · E: D + verifiers · **F: human reference — optional.**
|
|
228
|
+
|
|
229
|
+
F requires two independent raters plus an adjudicator and is likely unobtainable for a
|
|
230
|
+
single-maintainer project. It is explicitly not allowed to block conclusions from A–E.
|
|
231
|
+
|
|
232
|
+
## Returns are not a validation metric
|
|
233
|
+
|
|
234
|
+
Investment return is a **lagging, low-power, confounded** indicator and cannot substitute
|
|
235
|
+
for source accuracy, look-ahead control, method adherence, or risk calibration.
|
|
236
|
+
|
|
237
|
+
- 36 historical plus 12 shadow cases cannot separate skill from luck, and correlated seats
|
|
238
|
+
reduce the effective sample further.
|
|
239
|
+
- "Right for the wrong reason" is indistinguishable from skill by return alone.
|
|
240
|
+
- Return is the metric look-ahead leakage inflates most and hides in best.
|
|
241
|
+
- The product claim is *this is what the method would say*, not *this makes money*. A
|
|
242
|
+
method model that declines while the stock triples is not thereby wrong; a filter has a
|
|
243
|
+
known opportunity cost.
|
|
244
|
+
|
|
245
|
+
Returns are recorded in the ledger as a long-run outcome. They are never a gate.
|
|
246
|
+
|
|
247
|
+
## Phases
|
|
248
|
+
|
|
249
|
+
| Phase | Output | Days |
|
|
250
|
+
|---|---|---|
|
|
251
|
+
| 0 | this spec, `schemas/persona-v2.schema.json`, case spec, source policy | 3–5 |
|
|
252
|
+
| 1 | four source corpora | 5–7 |
|
|
253
|
+
| 2 | `personas-v2/`, `policies/`, `master-tools/`, private research, anonymous round 1 | 7–10 |
|
|
254
|
+
| 3 | `memory/` with time filtering and postmortem gating | 5–7 |
|
|
255
|
+
| 4 | 36 frozen cases, 12 shadow cases, groups A–E, all swap experiments | 7–10 |
|
|
256
|
+
| 5 | shadow running, no live trading | 8–12 wks |
|
|
257
|
+
| 6 | expand only by missing method, not by fame | — |
|
|
258
|
+
|
|
259
|
+
Benchmarks are frozen in Phase 0 so success criteria cannot be invented afterwards to
|
|
260
|
+
flatter the result.
|
|
261
|
+
|
|
262
|
+
## No fine-tuning in phase one
|
|
263
|
+
|
|
264
|
+
Order is: sourced doctrine → independent retrieval → tools → decision policy → memory →
|
|
265
|
+
evaluation → *then* consider tuning. Fine-tuning learns cadence fastest and judgment
|
|
266
|
+
slowest, and twenty-one LoRAs over one base model still share their errors. If it ever
|
|
267
|
+
happens, the method adapter and the voice adapter are separate artifacts and the method
|
|
268
|
+
adapter faces the same ablations.
|
|
269
|
+
|
|
270
|
+
## Unresolved
|
|
271
|
+
|
|
272
|
+
- No open-source project has demonstrated faithful reproduction of a real investor's full
|
|
273
|
+
judgment. This spec does not claim to be first; it claims to be falsifiable.
|
|
274
|
+
- The swap-experiment battery is this project's construction from standard ablation
|
|
275
|
+
practice, not an industry standard.
|
|
276
|
+
- Letta has marked its older server generation legacy; pin a current version before
|
|
277
|
+
depending on its memory model.
|
|
278
|
+
- `N_eff` and group F are both deferred, for different reasons, and neither may gate v1.
|
package/docs/personas.md
CHANGED
|
@@ -39,9 +39,9 @@ To add a role, add one file. It appears in the tool schema automatically.
|
|
|
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 |
|
|
42
|
+
| `master_forensic_short` | master | yes | masters-adversarial, masters-core | deep | Forensic Short Seller Lens | forensic-accounting, crowding, borrow | original |
|
|
42
43
|
| `master_li_lu` | master | yes | masters-value, masters-core | deep | Li Lu Lens | ten-year-certainty, civilization-trend, management-integrity | ai-berkshire (MIT) |
|
|
43
44
|
| `master_marks` | master | yes | masters-value-classic, masters-core | deep | Howard Marks Lens | second-level-thinking, cycle-position, risk-is-permanent-loss | original |
|
|
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
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 |
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
# 0.8.0 — Masters Become Methods
|
|
2
|
+
|
|
3
|
+
Complete implementation plan. Background and citations: `docs/roadmap.md`.
|
|
4
|
+
|
|
5
|
+
## The defect, stated precisely
|
|
6
|
+
|
|
7
|
+
Three separate problems that turn out to be one problem.
|
|
8
|
+
|
|
9
|
+
**1. The bench is invisible.** `mcp/lib/markdown.mjs` contains zero occurrences of
|
|
10
|
+
`master`. Grepping a completed run for a master's own words returns nothing outside
|
|
11
|
+
`master_<id>.json`. Ten lenses ran, ten were gated for completeness, ten were weighted in
|
|
12
|
+
synthesis, and the reader saw none of them.
|
|
13
|
+
|
|
14
|
+
**2. The report is whatever the manager retypes.** `finalReportMarkdown()` is
|
|
15
|
+
`return manager.report_markdown`. Eight evidence packets exist on disk and none of them
|
|
16
|
+
reach the final report except by the manager writing them out again by hand. The quality
|
|
17
|
+
gate checks that the string `market_data` appears somewhere — which the literal five
|
|
18
|
+
characters satisfy.
|
|
19
|
+
|
|
20
|
+
**3. The seats are not independent, and the report implies they are.** A tally of
|
|
21
|
+
`6 avoid / 2 neutral / 2 long` invites arithmetic that the underlying samples do not
|
|
22
|
+
support. Same base model, same evidence brief, same context. Agreement is the expected
|
|
23
|
+
outcome, not a finding.
|
|
24
|
+
|
|
25
|
+
These are one problem because the third is invisible while the first two hold. You cannot
|
|
26
|
+
see that ten masters said the same thing in ten voices if you cannot see what they said.
|
|
27
|
+
|
|
28
|
+
## Design
|
|
29
|
+
|
|
30
|
+
### Persona frontmatter gains four fields
|
|
31
|
+
|
|
32
|
+
The existing format (`personas/masters/<roster>/<id>.md`, JSON frontmatter, validated in
|
|
33
|
+
`mcp/lib/personas/registry.mjs`) already carries `philosophy_tags`, `disqualifiers`,
|
|
34
|
+
`default_weight`, `model_tier`. Four additions, all optional so unmigrated personas keep
|
|
35
|
+
working:
|
|
36
|
+
|
|
37
|
+
```jsonc
|
|
38
|
+
{
|
|
39
|
+
"evidence_grade": "A", // A|B|C — how much verifiable public methodology exists
|
|
40
|
+
"eligibility": { // deterministic gate, evaluated before any model call
|
|
41
|
+
"requires": ["screen.rules_computed >= 4", "filer.structured_financials"],
|
|
42
|
+
"on_fail": "out_of_scope"
|
|
43
|
+
},
|
|
44
|
+
"scoring": { // deterministic rules; every threshold cites a source
|
|
45
|
+
"max_score": 20,
|
|
46
|
+
"rules": [
|
|
47
|
+
{
|
|
48
|
+
"id": "roe_10y",
|
|
49
|
+
"metric": "screen.metrics.roe_10y",
|
|
50
|
+
"op": ">=", "value": 0.15, "points": 3,
|
|
51
|
+
"provenance": "1987 shareholder letter; 'above-average return on equity'"
|
|
52
|
+
}
|
|
53
|
+
]
|
|
54
|
+
},
|
|
55
|
+
"evidence_slice": ["earnings_deep_dive", "insider_sec", "ib_event_analysis"]
|
|
56
|
+
}
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
`evidence_grade` is the honesty valve. Grade A means the thresholds are quotable. Grade C
|
|
60
|
+
means the public record is thin, the rule set is deliberately short, and the report says
|
|
61
|
+
so instead of padding it to look uniform.
|
|
62
|
+
|
|
63
|
+
### Four layers, model confined to the last
|
|
64
|
+
|
|
65
|
+
| Layer | Where it runs | Can it set `stance`? |
|
|
66
|
+
|---|---|---|
|
|
67
|
+
| 1. Eligibility gate | `masters/eligibility.mjs`, pure JS | Yes — `out_of_scope`, no model call |
|
|
68
|
+
| 2. Scoring function | `masters/scoring.mjs`, pure JS | Yes — stance derives from score bands |
|
|
69
|
+
| 3. Evidence slice | `masters/slice.mjs`, pure JS | No — selects inputs |
|
|
70
|
+
| 4. Narrative | subagent prompt | **No** — explains a fixed verdict |
|
|
71
|
+
|
|
72
|
+
Layer 1 is the one that matters most for correctness. A master whose method cannot reach a
|
|
73
|
+
security should say so and stop. In the NOK run every master received the same brief
|
|
74
|
+
including "mechanical screen 0/7 computable" and every master wrote an essay anyway. A
|
|
75
|
+
deterministic Buffett returns `out_of_scope` there, costs nothing, and is more informative
|
|
76
|
+
than the essay.
|
|
77
|
+
|
|
78
|
+
### Information asymmetry
|
|
79
|
+
|
|
80
|
+
Layer 3 is the only lever that produces disagreement from a cause other than tone. Default
|
|
81
|
+
slices:
|
|
82
|
+
|
|
83
|
+
| Roster | Sees | Does not see |
|
|
84
|
+
|---|---|---|
|
|
85
|
+
| value, value-classic | multi-year financials, filings, governance | price action, options |
|
|
86
|
+
| adversarial | price, positioning, macro, narrative | long-run ROE series |
|
|
87
|
+
| quant | factor and price series | management commentary |
|
|
88
|
+
| options | volatility surface, positioning | long-run financials |
|
|
89
|
+
|
|
90
|
+
A master that never sees the price cannot anchor on the drawdown. That is the point.
|
|
91
|
+
|
|
92
|
+
### Reporting changes
|
|
93
|
+
|
|
94
|
+
- **The tally is removed.** Replaced by a deterministic score table: master, eligibility,
|
|
95
|
+
score/max, stance, evidence grade.
|
|
96
|
+
- **Correlation is disclosed as a run property**, naming the shared base model and shared
|
|
97
|
+
evidence, and stating that agreement between seats is not independent confirmation.
|
|
98
|
+
- **Minority report is promoted** to its own section above the concurring seats, with the
|
|
99
|
+
cause of divergence attributed (information slice vs. method vs. unexplained).
|
|
100
|
+
|
|
101
|
+
### `council_diagnostics`
|
|
102
|
+
|
|
103
|
+
A tool that can prove the bench decorative:
|
|
104
|
+
|
|
105
|
+
- **self-consistency** — one master, repeated runs, same inputs
|
|
106
|
+
- **pairwise agreement** — different masters, same inputs
|
|
107
|
+
- **slice sensitivity** — one master, different evidence slices
|
|
108
|
+
|
|
109
|
+
If pairwise agreement ≈ self-consistency, personas produced no differentiation. The verdict
|
|
110
|
+
lands in `report_quality.json` as `master_differentiation: none|weak|effective` and is
|
|
111
|
+
printed in the report. A run that cannot distinguish its own masters must not present them
|
|
112
|
+
as a bench.
|
|
113
|
+
|
|
114
|
+
## Work order
|
|
115
|
+
|
|
116
|
+
Each step ends green on `npm run check`.
|
|
117
|
+
|
|
118
|
+
1. **Visibility** (folded-in 0.7.0) — `renderMasterMarkdown`, `master_<id>.md`,
|
|
119
|
+
`all_agents.md` section, `artifact_index.md` entries.
|
|
120
|
+
2. **Report contract** — `master_bench` section in `REPORT_SECTIONS`, required only when
|
|
121
|
+
`run.masters` is non-empty. Analyst work log generated from packets. Gate checks
|
|
122
|
+
substance and a scoped `<task>:S*` citation, not a bare task name.
|
|
123
|
+
3. **Response slimming** — `record_*` returns a compact ack. Full state stays in
|
|
124
|
+
`status.json`.
|
|
125
|
+
4. **Schema** — four frontmatter fields, registry validation, all existing personas still
|
|
126
|
+
load.
|
|
127
|
+
5. **Deterministic core** — `eligibility.mjs`, `scoring.mjs`, `slice.mjs`, wired into
|
|
128
|
+
`plan_visible_run` and `record_master_opinion`.
|
|
129
|
+
6. **Migrate masters by grade** — Buffett, Munger, Graham, Taleb, Simons, Thorp, Asness
|
|
130
|
+
first (grade A/B). Thin ones stay grade C with short rule sets.
|
|
131
|
+
7. **Reporting** — score table, correlation disclosure, minority report.
|
|
132
|
+
8. **Diagnostics** — `council_diagnostics` tool, `master_differentiation` in quality JSON.
|
|
133
|
+
9. **Release** — CHANGELOG, version 0.8.0, npm publish, GitHub release.
|
|
134
|
+
|
|
135
|
+
## Tests
|
|
136
|
+
|
|
137
|
+
- master opinions render into all three artifacts
|
|
138
|
+
- a run selecting a bench whose report omits `master_bench` fails the gate
|
|
139
|
+
- an analyst work log with the task name and no substance fails the gate
|
|
140
|
+
- eligibility gate returns `out_of_scope` without a model call when inputs are missing
|
|
141
|
+
- scoring is pure: same inputs, same score, no network
|
|
142
|
+
- evidence slices exclude what they claim to exclude
|
|
143
|
+
- pairwise agreement ≈ self-consistency ⇒ `master_differentiation: none`
|
|
144
|
+
- every persona with a `scoring` block has provenance on every threshold
|
|
145
|
+
|
|
146
|
+
## What this does not fix
|
|
147
|
+
|
|
148
|
+
Stated in the report, not just here.
|
|
149
|
+
|
|
150
|
+
- **Shared base model.** Per-master vendor routing is supported but not required; without
|
|
151
|
+
it the seats remain correlated and the report says so.
|
|
152
|
+
- **Thresholds are human choices.** Determinism relocates the uncertainty into constants.
|
|
153
|
+
Provenance is the mitigation; it is not a guarantee of correctness.
|
|
154
|
+
- **Thin public methodology for some masters.** Grade C is a label, not a defect to be
|
|
155
|
+
papered over. Twelve real methods beat twenty-one accents.
|