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.
@@ -6,14 +6,14 @@
6
6
  },
7
7
  "metadata": {
8
8
  "description": "AlphaCouncil plugins for public-equity research.",
9
- "version": "0.6.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.6.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.6.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"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "alphacouncil-agent",
3
- "version": "0.6.0",
3
+ "version": "0.8.0",
4
4
  "description": "Host-visible or background public-equity research workflow with shared evidence packets.",
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.