ViskaStrat · Bragi · internal

DAILY-CONTENT-v1 — what the fund gets each day, and the process that produces it

Step 2 of the seat's work. READ-ORDER-v1.md defines what is read; this defines what is written, how the volume is reduced, and how each stage is tested. PROPOSED — not ratified, not built.* The reduction is not this seat's problem — it is already solved and shipped. The four-quadrant signal engine (viska.signal-graph/1.0) cuts 1,025 raw narratives to 70 nodes in 4 quadrants, renders in every daily report, and is live on Forsíða. This seat's content is the expansion of those quadrants and must reflect them exactly. What still reaches the author's desk, measured 2026-08-07: `` THE PICTURE (shipped, ViskaRes) THE DETAIL (per document, this seat) 70 nodes · 48 clusters 267 red flags · 223 narratives 166 edges · 21 from history 128 eurekas · 118 narratives 4 quadrants 386 tracked events 17 nodes contested (split) 254 document rows · 16 grid cells `` The job is to say what those 70 nodes mean for this book — which the graph cannot know, because the research floor is book-blind by design. A daily report carries perhaps fifteen items.


Part 1 — THE DELIVERABLE

The shape

One document per day, seven blocks, in this order. The order is the argument: weight, then findings, then position, then what is forming, then what is coming.

#BlockCarriesLength ceiling
1THE FOUR SIGNALSone strength-scored signal per major, 7-day sparkline, direction4 tiles
2THE GRAPHthe shipped quadrant render — not authored, drawn as shippedthe plate
3THE LEADthe day's single most decision-relevant finding, in prose1 paragraph
4RISKSbearish quadrants + book-exposed nodes: publishers, conviction, book impact, trace3 to 6 items
5OPPORTUNITIESthe isolated-bullish quadrant — early and unpriced, rarity-first2 to 4 items
6WHERE THE FUND SITSbook against the graph: which quadrants the fund is positioned in, which it is absent from3 to 5 lines
7CONTESTEDsplit: true nodes — live disagreements, bull and bear counts named2 to 4 items
8NEXT 14 DAYSdated events from the corpus, ranked by book impact3 to 8 rows

Blocks 4 to 7 are the four quadrants, expanded. The reader sees the picture in block 2, then reads what each region of it means for the book. A block naming a node the graph does not carry, or a figure disagreeing with it, is a defect — the content and the plate beside it are one artifact, and the fund is looking at both.

Plus a fixed appendix: census, gates, gaps, basis labels. Appendix style — short, flat, one place. Never narrated through the body.

What every item in blocks 3, 4, 6, 7 must carry

Not negotiable — an item without these is not publishable:

What the deliverable must NEVER contain

Governed by .claude/rules/08-analysis-is-about-the-fund.md, restated because this is where it gets violated:

Last check on every sentence: could this change a decision? If not, delete it however true.


Part 2 — THE REDUCTION IS ALREADY BUILT. THIS SEAT EXPANDS IT.

The four-quadrant signal engine is shipped, live on Forsíða, and rendered in every daily report (viska.signal-graph/1.0, ViskaRes; FE PR #304, www.viska.gg stamp-verified). It already performs the entire reduction, on a published recipe, with a fail-closed consumer gate and a content digest.

This contract does not rebuild any of it. The content is the expansion of what the quadrants already show, and it must reflect the graph exactly — same nodes, same readings, same figures.

What the engine already does, measured on 08-07

`` 1,025 raw narratives -8 prose narratives skipped 706 groups before cut -269 dropped neutral ← operator directive: neutral is omitted -367 dropped uncorroborated ────── 70 nodes · 48 clusters · 166 edges (21 from history) ``

The reduction is 1,025 → 70, on a stated recipe, with every drop counted in counts. My earlier draft proposed rebuilding this as three stages of clustering and cutting. That was wrong on the premise, and the correction is the whole point of this part.

The two axes are the ranking, and they are continuous

AxisFormulaMeaning
x — Convictionmean(signal) × log2(documents + 1)signed and continuous; breadth amplifies unanimous signals
y — Breadthlog2(documents + 1)how much of the desk argued it; split at 4 documents

Quote conviction, never xx carries collision displacement from the layout spiral. The node cards on the live render already obey this and so must every sentence this seat writes.

The four quadrants are the content's spine

QuadrantMeaningWhat the seat owes it
Broad conviction, bullishargued across the desk, one directionis the fund positioned for it, or missing it
Broad conviction, bearishargued across the desk, one directionthe fund's exposure to a risk the whole desk sees
Isolated, bullishone or two desks making the callthe eureka quadrant — early, unpriced, and where a position is still available
Isolated, bearishone or two desks making the callan early warning nobody else is pricing

Stratify by quadrant, never rank globally ([[spokes-are-stratified-by-quadrant-2026-08-05]], operator-verified). Measured: ranked globally on 08-03, BOOK RISK drew zero slots while holding 19% of the day's marks. A method that silently drops the quadrant the fund most needs to read is not a method. The daily content therefore draws from every quadrant, on a per-quadrant allocation, even on a lopsided day. On 08-07 the corpus was heavily bullish — 49 bull nodes against 19 bear — which is exactly the shape that produces the zero.

What the seat reads off the graph, per node

Every node already carries what an expansion needs:

id · label · conviction · reading (strong-bull / bull / contested / bear / strong-bear) · breadth (document count) · mean · bull_count / bear_count / split · docs[] · arguments[] — the per-document claim in prose · opportunities[] · is_cluster / members[] · degree.

arguments[] is the finding this changes everything. The graph already carries each document's claim as written prose, attributed to its doc. The expansion stage does not need to re-read documents to state what a desk argued — it needs to join those claims to the book and decide which matter.

split is the contested-theme mechanism, and it already exists

17 of 70 nodes carry split: true — bull and bear arguments on the same subject, same day. AI CAPEX Buildout (11 bull / 2 bear, breadth 16) · Inflation (11/4, breadth 18) · Factor Volatility (6/1) · Consumer Spending Resilience (7/2) · Yen Intervention (4/1).

I filed a research note calling contested themes invisible downstream because neither primitive carries majors. At the ledger tier that is true; at the graph tier it was already solvedsplit, bull_count and bear_count are shipped fields. The note stands as a ledger-tier finding and is superseded as a graph-tier one.

The edges carry the transmission channel

166 edges, min weight 2, each with source, target, weight and the docs[] that co-mention them. fed-rate-policy → inflation at weight 9 is nine documents arguing the two together.

This is the "relates two series the fund reads separately" test, precomputed. An edge from a node the fund is exposed to, to one it is not, is a transmission channel the book does not see — and per rule 08 that is exactly the shape that earns space on the page.

So the stages collapse to two

`` 70 nodes / 166 edges / 4 quadrants ← ALREADY BUILT, shipped, digest-gated │ ├─ STAGE D join to the book + expand per-quadrant allocation [pi seat, parallel] │ └─ STAGE E author the blocks ~15 → the deliverable [the seat, alone] ``

Stages A, B and C are deleted from this contract. They are ViskaRes' engine, they are shipped, and re-implementing them at this seat would produce a second set of numbers that disagrees with the render the fund is looking at.

The selection rule that replaces them — applied per quadrant, never globally:

Test C (retained, rewritten): the seat's item count per quadrant, plus what it declined, must reconcile against the graph's node count per quadrant. And every figure the seat publishes for a node must equal the shipped payload's figure for that node — the content and the picture beside it cannot disagree.

STAGE D — expand the shortlist, in parallel ON A PI SEAT

In: the selected nodes, per quadrant. Out: each one joined to the book, with its evidence.

The graph already carries arguments[] — each document's claim, in prose, attributed to its doc. So this stage rarely needs a document at all: it needs to join what the desk argued to what the fund owns, which is the one thing the book-blind research floor cannot do. When a document must be opened, it opens the page cites[] names, never the whole document.

⚠️ THIS SEAT MAY NOT SPAWN THESE WORKERS. FLEET-LAW §13, scoped by operator directive 2026-08-09: "SUB AGENTS WERE BANNED IN CLAUDE SEATS DUE TO EXCESSIVE SPEND. THIS OBVIOUSLY DOESN'T APPLY TO A PI SEAT WITH THE SINGLE SPECIFIC TASK OF SPAWNING SUB AGENT REVIEWERS."

ViskaStrat is a Claude seat. Stage D is a dispatch to a pi seat, which spawns the expansion workers on whatever model fits, exactly as D-RES already does for the Hrafn readers. The seat sends the shortlist and the return schema; it does not run the fan-out. Any version of this contract where ViskaStrat spawns forty workers is in breach on the first run.

One worker per cluster, run in parallel by the pi seat, each with a fixed return schema:

`` node_id · quadrant · conviction · breadth · reading · split{bull_count, bear_count} · claim (fund language, from arguments[]) · publishers[] · book_impact {sleeve, positions[], weight_pct, or none} · edges_to_held[] {target, weight} ← the transmission channel evidence[] {parcel_id, page, quote} · confidence_in_expansion ``

conviction, breadth and reading are copied from the shipped payload, never recomputed. A worker that derives its own conviction figure produces a number that disagrees with the plate.

Every worker is book-blind on the claim and book-sighted on the impact — it states what the document argues without softening it, then separately states what it means for the book. Conflating those is how a position quietly becomes a lens.

Test D: a worker handed a cluster whose documents do not support the claim must return confidence_in_expansion: low and say so, not manufacture support. Seeded with a deliberately unsupported cluster on every run — the positive-twin discipline: a negative case with a passing sibling.

STAGE E — author, and this stage does not delegate

In: ~40 expanded clusters. Out: the seven blocks.

The seat writes this alone. Not because a subagent could not produce prose, but because this is the stage where judgment is the product — which fifteen of forty, in what order, joined to what. Everything upstream exists to make this decision small enough to make well.

The author may not introduce a figure that is not in an expanded cluster. Every number traces to a field; every claim traces to a page.

Test E: re-verify every figure in the authored prose against the payload before publish. On the first reading (08-07) that was 34 checks and it caught two of my own errors. Non-negotiable, and it runs on every issue.


Part 2½ — WHAT MAKES A SIGNAL WORTH THE FUND'S ATTENTION

Structure and process do not answer the actual question: of 70 nodes, which 15 does the fund need, and why those. This part answers it, and it is what the deliverable lives or dies on.

The concentration problem, stated exactly

Measured on 08-07, running the join live:

THE MECHANICAL BOOK JOIN IS A FALSE-POSITIVE MACHINE — measured, not suspected

The obvious rank key is "do this node's documents mention a name we hold." It does not work, and today's corpus proves it:

Critical Minerals and AI CAPEX and Data Center Infrastructure returned an identical held-name set — FCX · GEV · MU · VMI. Both rest on a Deutsche Bank note compiling "management commentary from Q2 2026 earnings calls across 300+ companies globally," whose ticker list runs AAL · AAPL · ACI · ADTN · ALK · ALLE · AMP · AMZN · AOS …. A document naming half the market names the fund's holdings by coincidence. The join fires at document level; the claim is about neither FCX nor MU.

This is the same defect class as [[the-ranker-sorts-on-document-adjacency-2026-08-11]], caught this morning one tier down: document adjacency dressed up as relevance. It recurs because the join is cheap and looks like evidence.

Binding consequence: a node is book-relevant only when the claim bears on the book — never when a document carrying the claim also happens to name a holding. Ticker overlap is a candidate generator, never evidence. Any ranking that treats it as evidence puts a 300-company survey at the top of the fund's page every day.

This is why Stage D exists and cannot be replaced by arithmetic: establishing that a claim bears on the book is a judgment, made against arguments[], one node at a time.

The five tests a signal must pass, in order

1. Is it about something the fund is exposed to — or deliberately not? Exposure is read from the claim, not the ticker list. Both directions qualify: a broad-conviction theme the fund holds nothing in is a signal, because it says the desk sees something the book does not express. Minerals is 67.2% of invested capital, so a node arguing minerals outweighs one arguing Korean equities, and the weight is the stated reason.

2. Does it disagree with something? A signal is a relation, never a level. Four shapes qualify, and nothing else does:

ShapeSourceWhy it earns space
the desk against the booknode conviction vs the fund's stance in that sleevethe fund is positioned against a broadly-held view, or absent from one
the desk against itselfsplit: true — 17 nodes todaya live disagreement is where a position is still available
today against the recordmovement vs prior issuesa theme that was contested and no longer is has resolved, and the date is information
one series against anotheredges[] weight — fed-rate-policy → inflation at 9a transmission channel the fund reads as two separate things

3. Is the evidence real, or one desk repeated? breadth counts documents; a house publishing daily recurs by habit. Publisher breadth is the honest denominator — the y-axis split at 4 documents is the graph's built expression of exactly this.

4. Could it change a decision? The rule-08 test, applied last because it is the most expensive to judge and cheapest once the field is cut. "Inflation is broadly bullish across 18 documents" is the world's weather. "Both desks arguing semiconductor degrossing name positions you hold, and nobody is arguing the other side" changes something.

5. Can the fund reach the page in one hop? parcel_id + cites[]. A claim the fund cannot check is a claim taken on trust, and this seat's entire proposition is that it does not ask for trust.

The daily allocation — 70 to ~15, with floors instead of quotas

Not a top-N and not an equal split. Each lane has a floor and a ceiling; the floors are what stop the fund being shown a one-sided day:

LaneFloorCeilingSource
Book-exposed, adverse1, always4any quadrant; claim bears on a sleeve and argues against it
Book-exposed, supportive03confirmation is worth less than challenge, so it gets less room
Contested1 whenever a split node exists3split: true, highest breadth first
Unexpressed broad conviction1, always3high breadth, fund holds nothing — what the book is missing
Early and isolated03isolated quadrants, low breadth, claim-level relevance
Transmission02high-weight edge from an exposed node to an unexposed one

The two mandatory floors are the discipline. Adverse and unexpressed are precisely the lanes a bull-skewed corpus empties silently, and precisely the ones the fund needs — the same failure the quadrant-stratification ruling exists to prevent, one layer up. If a floor cannot be filled, the report says so by name"no adverse signal reached the bar today" — which is a finding, never silence.

Ceilings sum to 18, floors to 3. A normal day lands at 12 to 15.

What is published about what was dropped

Every dropped node is counted and the counts ship in the appendix: how many failed at each of the five tests, how many were dropped as priced. A fund told only what survived cannot judge the filter. A fund told "70 nodes, 14 published, 39 no claim-level book relevance, 11 single-desk, 6 no relation" can.


Part 3 — THE TEST PROCESS

Per-stage tests, run every day

The five above (A–E) run as a harness on every issue, mutation-controlled: each test paired with a corpus mutation that must flip it. A test that does not move when its control is applied is INCONCLUSIVE, never PASS. This is the discipline already proven on primitive 1.

The end-to-end test, which is the one that matters

Side-by-side against the incumbent Mímir brief's same-day issue, plus hindsight scoring.

This is the ratified proof method and it has never been run. Every test above proves the instrument is honest — that the reduction is faithful, the ranks are auditable, the figures trace. None of them proves the analysis is any good. Only this one does:

  1. Take the same day both systems covered.
  2. Score both on: items the fund could act on · items that proved out over the following 5 and 20 days · items that were noise · figures that were wrong.
  3. Publish the loss. Where the incumbent was better, say so, in the artifact.

Until this runs, the deliverable is unproven regardless of how many green tests sit above it.

The replication test

One good day is an anecdote. Run the full chain across five consecutive days and hold the shortlist rule constant. What must be measured: does the shortlist size stay in a workable band, or does it swing from 6 to 90? Does the same subject recur, and does contestedness resolve? A rule tuned on one day is fitted to that day.


Part 4 — WHAT IS OWED, BY WHOM

OwedOwnerBlocks
red_flags[] · eureka[] · tracked_events[] at the summary tierViskaResblocks 4/5/8 read 110 ledgers instead of one payload
the graph node ↔ red-flag/eureka joinViskaResa node cannot be expanded into a risk without its flags
majors[] on both primitives (optional, guidance)reviewers, landedcontested themes are invisible without it — 0 of 267, 0 of 128 today
cites[] at population ratesreviewers, landed as guidanceStage D expands documents instead of pages — 9 of 267 today
instrument class on tickersViskaRestwo ticker lanes stay null
the four-signal payload stripthis seatblock 1 does not exist
chat cuesViskaFrontthe Mímir hand-off
a pi seat to run Stage D's fan-outoperator to name itStage D runs serially at this seat, or not at all

Nothing above blocks starting. Stages A–E run today against the ledgers directly; the owed fields make them cheaper and sharper, not possible.


The one line to keep

The reduction is mechanical and published; the judgment is human and small. A process that asks a model to read 1,643 items and pick fifteen has not reduced anything — it has hidden the reduction inside a model where nobody can audit it, and the fund cannot see what it was not told.


Proposed 2026-08-11 by ViskaStrat. Depends on READ-ORDER-v1.md (what is read) and REPORT-v0.md (the emitted payload). Governed by .claude/rules/08 (what may be written) and .claude/rules/09 (basis labels). Figures measured against ViskaRes/research/analysis/2026-08-07/, 110 canonical ledgers, variants excluded.

Internal engineering document. Not a client surface — the client gate on this seat's analysis remains closed. Rendered from docs/CHARTER.md.