verification report · closed 31 July 2026out/e3/process_stats.jsonthe date the program closed, carried by both bundles
Verification of a ten-year backtest built from public fund filings
The strategy under test reads the holdings that large investment managers must
report every quarter, ranks the managers on past results, and buys the single
largest position of each of the best-ranked managers. Run over ten years, it
reported a return of 30.07%out/e3/e3_verdict.jsonfield melt_walk_cagr.published of the verdict bundle a year.
It was rebuilt from the same public filings. Four defects were found in the data
and corrected. The rebuilt portfolio returns 20.36%out/e3/e3_verdict.jsonfield canonical_cell.cagr_0bps of the verdict bundle a year
before trading costs and 18.39%out/e3/e3_verdict.jsonfield canonical_cell.cagr_25bps of the verdict bundle after them, which is what
an index fund returned over the same months for the same risk.
This page is the record of the work, not the result. It reports how the work was
organised, what was read before it started, what the source data contained, which
checks ran before any experiment, what each correction cost, what three
unsupervised research loops produced, how the four pre-registered tests came out,
and what the program got wrong. Every figure carries the file it was read from.
annual return over the same ten years
reported by the backtest30.07%out/e3/e3_verdict.jsonfield melt_walk_cagr.published of the verdict bundle
rebuilt, before trading costs20.36%out/e3/e3_verdict.jsonfield canonical_cell.cagr_0bps of the verdict bundle
rebuilt, after trading costs18.39%out/e3/e3_verdict.jsonfield canonical_cell.cagr_25bps of the verdict bundle
the S&P 500, same ten years15.16%out/e3/e3_verdict.jsonfield benchmarks_same_window.SPY.cagr of the verdict bundle
After trading costs the rebuilt portfolio returns
0.9910out/e3/e3_verdict.jsonfield canonical_cell.sharpe_25bps of the verdict bundle for each unit of risk it took. The S&P 500
returned 0.9923out/e3/e3_verdict.jsonfield benchmarks_same_window.SPY.sharpe of the verdict bundle for each unit of risk over the
same months.
30,022researchline counts of research/R*/FINDINGS_R*.md — {'R1': 5383, 'R2': 21681, 'R3': 1447, 'R4': 1511}lines of literature read
1,917research/distill'### [R*-P*-nn]' headers across the twelve inventoriesclaims extracted from it
397,833research/e3/PHASE0_FINDINGS.md:215**Spec.** `audit.filing_dates` over 397,833 scanned filings, 286,321 of whichfilings scanned
24,367,617data/cache/holdings_panel_wide_10b.parquetparquet row count of the duplicate-summed wide panelthe plan's memory said ~30.2 million; that figure is the duplicate extras, below.position rows priced
4,353research/e3/LEDGER.md:325| **final N** | **4,353** |every configuration ever screened, counted whether or not anyone wanted it counted.attempts counted against the result
14research/e3/PHASE0_FINDINGS.md'## <id> <title> — <verdict>' section headings in the findings fileaudits before any experiment
539.auto/log.jsonlrecords carrying a run number in the loop's own metric logunsupervised loop runs
1,989out/e3/harvest_L2_verdict.jsonfield claims of the acceptance check's verdictloop claims examined
01
Organisation of the work
The work ran on two desks. One model set the questions and the conditions a result had to meet. A second model wrote the code and ran the experiments. Neither did the other's job.
A larger reviewing model wrote the plans, the acceptance condition for each result,
and the condition under which a claim would be abandoned. It wrote no pipeline code.
An implementing agent wrote all the code, ran every experiment and set none of its
own acceptance conditions.
The split exists for one reason. A researcher who can move the acceptance condition
after seeing the result is not running an experiment. The separation makes that
move impossible rather than discouraged.
It was tested twice in the direction that costs something, when the implementing
side refused the reviewing side.
The implementing agent refused an instruction
It was told to seal the forward register on a build that had just been shown to
be wrong. It refused, because a standing rule outranks an instruction. The
register gained a fourth opening condition instead: no unrepaired defect that
changes which stocks are held. That condition found the fourth correction.
The implementing agent found an error in the reviewing model's own headline
The figure the program had been quoting joined the return of one portfolio to
the risk-adjusted return of a different one. The rule it broke was the reviewing
model's own: no result is quoted without stating which portfolio, which
weighting, which dating and which trading cost produced it.
02
Literature review, completed before the experiments
Four briefs went out to find published work on the design under test. The answers were read by machine, split into single claims, and sorted. The claims that contradicted the design were collected first.
Four briefs returned 30,022researchline counts of research/R*/FINDINGS_R*.md — {'R1': 5383, 'R2': 21681, 'R3': 1447, 'R4': 1511} lines of findings, or
2.3researchsummed byte size of the four findings files megabytes. Behind them are 253research/R1/FINDINGS_R1.md:3969**Proxy voting records (Form N-PX) do not appear anywhere in this corpus.** Across 253 fetched PDFs
papers that machines could fetch and quote-check, and 186research/R1/FINDINGS_R1.md:3970and 186 human-obtained sources, no R1 note tests voting disclosure as a return signal and there is no more
sources that had to be obtained by hand because a publisher refused automated
access.
12research/distillR1_part*.md and R2_part*.md inventories extraction passes read that material back under one fixed
schema and produced 1,917research/distill'### [R*-P*-nn]' headers across the twelve inventories separate claims. Each claim went into one of six
bins.
1,917research/distill'### [R*-P*-nn]' headers across the twelve inventories claims, sorted
adopt as practice503research/distill'- bin: D' lines across the twelve inventories
worth an experiment376research/distill'- bin: B' lines across the twelve inventories
outside the brief372research/distill'- bin: F' lines across the twelve inventories
confirms the design307research/distill'- bin: A' lines across the twelve inventories
contradicts the design227research/distill'- bin: C' lines across the twelve inventories
out of reach132research/distill'- bin: E' lines across the twelve inventories
The 227research/distill'- bin: C' lines across the twelve inventories contradicting claims reduced to
28research/distill/MERGED_C.mdnumbered theme headings in the contradiction dossier distinct reasons the design should not work. Nine
published funds copied this approach and returned less than the market. The
best-ideas effect was measured as absent in hedge funds. A ten-year window is too
short to support a search of the size this program was about to run. All
28research/distill/MERGED_C.mdnumbered theme headings in the contradiction dossier were written down before the first experiment ran.
The rest of the sort produced 38research/distill/MERGED_B.mdlettered family headings in the experiment dossierthe plan's memory said 37; the dossier holds A1-A11, B1-B9, C1-C7, D1-D6, E1-E5. families of experiment
worth running, 118research/distill/MERGED_D.md'### D<group>.<item>' headings in the adoption dossier practices adopted without a test, and
13research/distill/MERGED_AEF.mdclusters in the out-of-reach register, keyed by the resource that is missing kinds of question that cannot be answered without data the program
could not obtain.
03
Source data and its defects
The strategy reads one public source: the holdings that large investment managers must report every quarter. The source has defects of its own, and they were measured before anything was built on top of it.
The panel of record covers 53data/edgar13fForm 13F structured Data Set zips on disk quarterly archives and
397,833research/e3/PHASE0_FINDINGS.md:215**Spec.** `audit.filing_dates` over 397,833 scanned filings, 286,321 of which filings, and holds 24,367,617data/cache/holdings_panel_wide_10b.parquetparquet row count of the duplicate-summed wide panelthe plan's memory said ~30.2 million; that figure is the duplicate extras, below. priced position
rows. Those filings come from 12,984research/e3/PHASE0_FINDINGS.md:695filers (distinct CIK): 12,984 registered filing entities, which
resolve to 12,432research/e3/PHASE0_FINDINGS.md:696name_families: 12,432 actual managers once the same firm filing under
several registrations is joined up.
Four properties of the source change the answer, and none of them is documented on
the form itself.
The published file repeats rows
30,621,515out/e3/phase0_verdicts.jsonaudit 0.10 guard (b) rows carry a key that already appears elsewhere in the
file, which is 28.61%out/e3/phase0_verdicts.jsonaudit 0.10 guard (b)a pipeline that reads the tape without summing is wrong by about this much. of
it. A program that reads the file without adding the repeats together is wrong
before it starts, and the direction of the error depends on whether it drops
them or counts them twice.
One position is often reported by several filers
47.4%research/e3/PHASE0_FINDINGS.md:702othermanager_row_share: 47.43%undeduplicated, the same position can be handed to several 'independent' managers. of position rows are reported by more
than one filer, because the form asks who holds the discretion rather than who
owns the security. 3,942research/e3/PHASE0_FINDINGS.md:700notice_filers (13F-NT, excluded): 3,942 filers report no holdings at all.
Options are reported in the same column as stock
4,778,703research/e3/PHASE0_FINDINGS.md:369rather than kept — and now is: 4,778,703 option positions aggregated to rows describe options rather than shares. They were
parsed and set aside. Counting them as ordinary holdings would credit a manager
with a position they may not hold.
Securities leave the list and stop being priceable
The regulator's own quarterly list of reportable securities was read out of
50research/e3/PHASE0_FINDINGS.md:743rows parsed: 1,010,311 across 50 quarters, 2014q1-2026q2 PDF documents, giving 1,010,311research/e3/PHASE0_FINDINGS.md:743rows parsed: 1,010,311 across 50 quarters, 2014q1-2026q2the free replacement for the paid identifier database the audit was told it needed.
rows and 28,233research/e3/PHASE0_FINDINGS.md:745share-line CUSIPs: 28,233 share classes.
15,494research/e3/PHASE0_FINDINGS.md:746of which exit the list: 15,494 (54.9%) of those share classes
were gone before the window closed. Measured across 288,435research/e3/PHASE0_FINDINGS.md:782| **all** | **288,435** | **11.49%** | **14.28%** |
filings, 11.5%research/e3/PHASE0_FINDINGS.md:782| **all** | **288,435** | **11.49%** | **14.28%** | of the positions this strategy buys
are in a security that later left the list.
60out/e3/audit_0_6_provenance.csvrows of the artifact register, each carrying a sha256PHASE0_FINDINGS states 59; the register has since gained one and it wins. inputs were pinned by hash, so a later re-run can prove it
read the same bytes. A rewrite of the core matrix was accepted only after it
rebuilt 148 × 10,207research/e3/PHASE0_FINDINGS.md:883the published panel — 148 × 10,207 matrices, zero mismatching cells, NaN cells identically to the version it replaced.
04
Data audits completed before any experiment
A standing rule held that no experiment could run on data that had not been checked. Fourteen audits ran first. Two passed.
Each audit asked one question about the data or the method, and each was written
with the answer that would count as a failure before it was run.
14research/e3/PHASE0_FINDINGS.md'## <id> <title> — <verdict>' section headings in the findings file were closed before the first experiment.
2research/e3/PHASE0_FINDINGS.mdsection headings whose verdict reads passthe plan remembered 13 audits at 3 pass / 6 fail / 4 partial. The findings file's own headings say 14 at 2 / 7 / 5 — audit 0.15 was opened by a repair, after the count the plan was written from. passed,
7research/e3/PHASE0_FINDINGS.mdsection headings whose verdict reads fail failed, and
5research/e3/PHASE0_FINDINGS.mdsection headings whose verdict reads partial failed in part and are recorded that way rather than rounded
up to a pass.
A failed audit did not stop the program. It produced a repair, and the repair was
then measured against the result it changed. Four of the repairs changed which
stocks the strategy held, and those four are the subject of the next section.
The audits are listed as they were closed. Each entry links to the line of the
findings document that states its result.
14research/e3/PHASE0_FINDINGS.md'## <id> <title> — <verdict>' section headings in the findings file audits, and how each came out
0.1 Wardlaw identity, generalisedresearch/e3/PHASE0_FINDINGS.mdaudit 0.1, from its own heading in the findings document
failed
0.2 Filing-date integrityresearch/e3/PHASE0_FINDINGS.mdaudit 0.2, from its own heading in the findings document
failed in part
0.3 Crosswalkresearch/e3/PHASE0_FINDINGS.mdaudit 0.3, from its own heading in the findings document
failed
0.4 Option / PRN rowsresearch/e3/PHASE0_FINDINGS.mdaudit 0.4, from its own heading in the findings document
passed
0.5 Units and amendmentsresearch/e3/PHASE0_FINDINGS.mdaudit 0.5, from its own heading in the findings document
failed in part
0.6 Provenanceresearch/e3/PHASE0_FINDINGS.mdaudit 0.6, from its own heading in the findings document
failed
0.7 Unmatched namesresearch/e3/PHASE0_FINDINGS.mdaudit 0.7, from its own heading in the findings document
failed
0.8 Delistingsresearch/e3/PHASE0_FINDINGS.mdaudit 0.8, from its own heading in the findings document
failed
0.9 Grid persistenceresearch/e3/PHASE0_FINDINGS.mdaudit 0.9, from its own heading in the findings document
failed in part
0.10 The four 13F correctness guardsresearch/e3/PHASE0_FINDINGS.mdaudit 0.10, from its own heading in the findings document
failed in part
0.11 Day-45 truncationresearch/e3/PHASE0_FINDINGS.mdaudit 0.11, from its own heading in the findings document
passed
0.12 Missing-characteristics contaminationresearch/e3/PHASE0_FINDINGS.mdaudit 0.12, from its own heading in the findings document
failed in part
0.13 Manager identityresearch/e3/PHASE0_FINDINGS.mdaudit 0.13, from its own heading in the findings document
failed
0.15 Filing stalenessresearch/e3/PHASE0_FINDINGS.mdaudit 0.15, from its own heading in the findings document
failed
05
Corrections applied, and their effect on the annual return
Four defects were corrected. None of them changed the rule the strategy follows. All four changed which stocks it held, which is why each one is reported with the share of monthly portfolios it left unchanged.
30.07%out/e3/e3_verdict.jsonfield melt_walk_cagr.published of the verdict bundleas published25.11%out/e3/e3_verdict.jsonfield melt_walk_cagr.audited of the verdict bundlepricing and missing holdings24.93%out/e3/e3_verdict.jsonfield melt_walk_cagr.audited_measured_units of the verdict bundlereporting units measured20.36%out/e3/e3_verdict.jsonfield canonical_cell.cagr_0bps of the verdict bundlemanagers who stopped filing
shaded: what the S&P 500 returned over the same ten years, 15.16%out/e3/e3_verdict.jsonfield benchmarks_same_window.SPY.cagr of the verdict bundle a year
correction 01
Both sides of the division were priced on the wrong day
The largest position of a manager was found by reading the dollar value reported
for each holding. A dollar value is a share count multiplied by a price, and the
price is the one at the end of the quarter, after the stock has already moved. The
measure of what a manager holds most therefore contained what went up last
quarter.
The reason this survived is worth stating. Averaged over all positions the effect
is invisible: the reported weight explains almost none of the return, and any
check that pools every position reports the pipeline as clean. The rule reads only
the single largest position, and that is where the contamination sits.
−4.77 pointsout/e3/phase0_verdicts.jsonaudit 0.1, repaired minus base CAGRa pooled diagnostic read clean at R-squared 0.0002 while the tail was contaminated.
30.07%out/e3/e3_verdict.jsonfield melt_walk_cagr.published of the verdict bundle→25.30%out/e3/phase0_verdicts.jsonaudit 0.1, repaired CAGR
0.0%out/e3/phase0_verdicts.jsonaudit 0.1, share of rebalances with an identical bookit changed which stocks were held, not merely how they scored. of monthly portfolios came
out unchanged. On average 4.40out/e3/phase0_verdicts.jsonaudit 0.1, mean names changed per rebalance names a month
were different stocks.
correction 02
Holdings that could not be priced were treated as though they did not exist
Some positions cannot be matched to a price series, because the company was taken
over, went private, went bankrupt or simply left the list. Dropping them builds
the portfolio only from securities that were still available to look up later,
which is a decision about the past made with knowledge of the future.
Carrying them at a flat zero return costs −4.48 pointsout/e3/audit_0_7_unmatched_deltas.csvarm 0.7-0pct, repaired minus base CAGR a
year. Writing them off entirely costs more. The honest answer is an interval
10.4out/e3/audit_0_7_unmatched_deltas.csv0pct arm minus minus99pct arm points wide, and the figure quoted here is
the end of that interval least favourable to the argument this page is making.
−4.48 pointsout/e3/audit_0_7_unmatched_deltas.csvarm 0.7-0pct, repaired minus base CAGR
30.07%out/e3/e3_verdict.jsonfield melt_walk_cagr.published of the verdict bundle→25.59%out/e3/audit_0_7_unmatched_deltas.csvarm 0.7-0pct, repaired CAGR
Taken separately the first two corrections cost
9.3out/e3audit 0.1 delta plus audit 0.7-0pct delta points. Applied together they cost
−4.96 pointsout/e3/gate_A_units_deltas.csvthe combined-repair build (the units audit's base column) minus the published cellthe repairs overlap: they were largely finding the same broken positions. and leave 25.11%out/e3/gate_A_units_deltas.csvthe units audit's base column — the build with both repairs applied,
because they were largely finding the same broken positions.
correction 03
The reporting units were guessed instead of measured
Filers report value in dollars or in thousands of dollars, and the form does not
always say which. The pipeline picked a threshold and applied it. The correction
is to stop picking: divide the reported value by the share count, compare the
result to the closing price on the day, and the answer is either about one or
about one-thousandth, never in between.
This is the smallest correction on the page and it is here for a reason. The
choice of threshold moves the answer by less than a third of a point, which means
it could have been chosen to flatter the result without anyone noticing.
−0.18 pointsout/e3/gate_A_units_deltas.csvarm 0.5R-measured, repaired minus base CAGR
25.11%out/e3/e3_verdict.jsonfield melt_walk_cagr.audited of the verdict bundle→24.93%out/e3/e3_verdict.jsonfield melt_walk_cagr.audited_measured_units of the verdict bundle
Measured across 288,435research/e3/PHASE0_FINDINGS.md:782| **all** | **288,435** | **11.49%** | **14.28%** | filings against 16,729out/e3/price_vintage.csvrows of the price vintage register, one per series with its sha256pinning the vintage is the only defence against a data source quietly revising history.
price series, each pinned by hash so a later revision cannot change an earlier
result.
correction 04
Managers who had stopped filing years earlier were still being selected
Nothing removed a manager from consideration when they stopped reporting. The last
filing stayed visible for the rest of the window. A manager who has stopped
trading has a portfolio that never disagrees with the score, so the score came to
prefer them.
17.1%out/e3/audit_0_15R_selection_lift.csvmean of pool_stale_over_24m_pct across all 124 rebalances of visible managers had not filed in over two
years, but 30.2%out/e3/audit_0_15R_selection_lift.csvmean of top25_stale_over_24m_pct across all 124 rebalances of the managers the score
selected had not: a preference of 1.76×out/e3/audit_0_15R_selection_lift.csvselected share divided by pool sharea manager who stops filing stops trading, so their book stops disagreeing with the score.. By the final months
66.0%out/e3/audit_0_15R_selection_lift.csvmean of top25_stale_over_24m_pct over rebalances from 2026-01-01 of the
managers being bought from were in that state. The median one was
33.2 monthsout/e3/audit_0_15R_selection_lift.csvmean of top25_median_age_months over rebalances from 2026-01-01 out of date, against
2.0 monthsout/e3/audit_0_15R_selection_lift.csvmean of pool_median_age_months over rebalances from 2026-01-01 for the median manager in the source.
The correction is not a tuned cut-off. A manager must file within forty-five days
of the quarter being described, so a manager stays visible for one filing cycle
plus that period, measured from the quarter described. Measuring from the day the
filing arrived would let a late filer buy extra visibility by being late.
−4.57 pointsout/e3/audit_0_15R_staleness_deltas.csvarm 0.15R-regime, repaired minus base CAGR
24.93%out/e3/e3_verdict.jsonfield melt_walk_cagr.audited_measured_units of the verdict bundle→20.36%out/e3/e3_verdict.jsonfield canonical_cell.cagr_0bps of the verdict bundle
7.51out/e3/audit_0_15R_staleness_deltas.csvarm 0.15R-regime, mean names changed per rebalance names changed in the average month's
portfolio. The defect was found by a repair looking for something else, on the
morning the forward register opened. The register closed the same day.
Two sensitivity results belong with the last correction, because the cut-off is a
choice and choices get shopped. A one-year cut-off returns 21.65%out/e3/audit_0_15R_staleness_deltas.csvarm 0.15R-1y, repaired CAGRboth are prettier than the rule adopted, which is why the rule was picked first.
a year and a two-year cut-off returns 21.60%out/e3/audit_0_15R_staleness_deltas.csvarm 0.15R-2y, repaired CAGRboth are prettier than the rule adopted, which is why the rule was picked first.. Both are higher
than the rule that was adopted. The rule was fixed on principle before the table was
computed, so that the table could not select it.
06
Unsupervised research loops, and the check that read their output
An unsupervised research loop is given a written brief, a score to raise and a condition to stop at. It then works without supervision and files a report. Three were run on the dullest and largest part of the job.
The job was to find out what happened to 15,494research/e3/PHASE0_FINDINGS.md:746of which exit the list: 15,494 (54.9%) securities that left
the reportable list, and what a holder received when they did. That is a large
number of small identical questions, which is the shape of work a loop should be
good at.
The three loops ran 539.auto/log.jsonlrecords carrying a run number in the loop's own metric log iterations and made 345.auto/log.jsonldistinct seven-character commit hashes across those records
commits to their own working files. Their reported results rose steadily. The
classifying loop reached 1,982.auto/log.jsonlmetrics.classified_count at the loop's best run (run 191) exits labelled, covering
95.5%.auto/log.jsonlthe loop's own metric at run 191 of the departing value. The valuing
loop finished at 100.0%.auto/log.jsonlmetrics.terminal_coverage_pct at run 440:
695.auto/log.jsonlmetrics.terminal_documented_count at run 440 of 747.auto/log.jsonlmetrics.terminal_eligible_count at run 440 entries, and
$4.77 trillion.auto/log.jsonlmetrics.documented_value at run 440 of value documented.
The score was then changed to require the identifier of the filing that proved each
answer. Nothing was deleted and nothing was re-run. The same body of work, measured
again the same afternoon, scored
1.auto/log.jsonlmetrics.accession_documented_count at the strict metric's baseline (run 451)the same body of work, remeasured. Nothing was deleted; the question changed. out of
735.auto/log.jsonlmetrics.accession_eligible_count at run 451.
the same work, measured three ways
is there an answer?
695.auto/log.jsonlmetrics.terminal_documented_count at run 440 / 747.auto/log.jsonlmetrics.terminal_eligible_count at run 440
is there an answer, with the filing that proves it?
1.auto/log.jsonlmetrics.accession_documented_count at the strict metric's baseline (run 451)the same body of work, remeasured. Nothing was deleted; the question changed. / 735.auto/log.jsonlmetrics.accession_eligible_count at run 451
the same question, after the loop was told to raise that score
139.auto/log.jsonlmetrics.accession_documented_count at the strict metric's last run (484) / 735.auto/log.jsonlmetrics.accession_eligible_count at run 451
The third measurement covers 71.3%.auto/log.jsonlthe strict metric at run 484 of the departing
value, with a reference for each entry.
The acceptance check
The rule for taking loop output into the pipeline was written before the loops
started: sample the output, check the sample, and if the sample fails, take none of
it. The second loop handed over a table of 1,989out/e3/harvest_L2_verdict.jsonfield claims of the acceptance check's verdict claims about what
happened to each security.
It was not sampled. The table was small enough to check completely, so every row was
checked. 59out/e3/harvest_L2_verdict.jsonfield claims_meeting_the_standard of the acceptance check's verdict rows carried a
reference to a filing, which is 2.97%out/e3/harvest_L2_verdict.jsonfield share_meeting_the_standard of the acceptance check's verdict of the table.
1,110out/e3/harvest_L2_verdict.jsonfield continuity_claims of the acceptance check's verdict rows asserted that nothing terminal had happened, which is the
cheapest assertion available and covers 71.7%out/e3/harvest_L2_verdict.jsonfield continuity_share_of_roster_value of the acceptance check's verdict of
the departing value. Between them those rows carried
2out/e3/harvest_L2_evidence_census.csvwith_accession on the CONTINUITY row of the census references. 113out/e3/harvest_L2_verdict.jsonfield continuity_self_contradicting of the acceptance check's verdict of them,
or 10.2%out/e3/harvest_L2_verdict.jsonfield continuity_self_contradicting_share of the acceptance check's verdict, describe a takeover or a bankruptcy
in their own text while asserting that nothing had happened.
continuity2 of 1,110out/e3/harvest_L2_evidence_census.csvthe CONTINUITY row of the per-label census
merger cash23 of 313out/e3/harvest_L2_evidence_census.csvthe MERGER_CASH row of the per-label census
merger stock13 of 195out/e3/harvest_L2_evidence_census.csvthe MERGER_STOCK row of the per-label census
going private12 of 177out/e3/harvest_L2_evidence_census.csvthe GOING_PRIVATE row of the per-label census
fund closure0 of 141out/e3/harvest_L2_evidence_census.csvthe FUND_CLOSURE row of the per-label census
bankruptcy9 of 50out/e3/harvest_L2_evidence_census.csvthe BANKRUPTCY row of the per-label census
delisting deficiency0 of 3out/e3/harvest_L2_evidence_census.csvthe DELISTING_DEFICIENCY row of the per-label census
carries a reference
refuted by its own text
asserted, with no reference
one cell is one row of the table that was handed over
The 59out/e3/harvest_L2_verdict.jsonfield accessions_checked of the acceptance check's verdict references that did exist were then retrieved from the
public filing archive and read. 12out/e3/harvest_L2_accession_checks.csvrows of the live EDGAR check whose verdict reads resolved are on the company they
name. 27out/e3/harvest_L2_accession_checks.csvrows of the live EDGAR check whose verdict reads wrong filer are not on that company's index at all, and
20out/e3/harvest_L2_accession_checks.csvrows of the live EDGAR check whose verdict reads unreachable could not be resolved.
Of the 12out/e3/harvest_L2_accession_checks.csvrows of the live EDGAR check whose verdict reads resolved that do resolve,
4out/e3/harvest_L2_accession_checks.csvresolved rows whose form is an 8-K, a delisting notice or a merger document; the rest are employee-stock and passive-ownership filings are on a form that can record an exit: a delisting
notice, a going-private statement, a material-event report. The others are employee
stock plan amendments and passive ownership notices. They are real filings by the
right company, and they say nothing about the event being claimed.
ACTIVISION BLIZZARD INC — cited form
SC 13G/A
VMWARE INC — cited form
S-8 POS
STERICYCLE INC — cited form
POS AM
No part of the output was taken in, and the pipeline did
not change. The repair it was collected for needed prices for
294out/e3/harvest_L2_verdict.jsonfield substituted_positions_0_7R_prices of the acceptance check's verdict positions, and the output could supply
22out/e3/harvest_L2_verdict.jsonfield positions_L2_gives_a_terminal_value of the acceptance check's verdict of them. The conservative assumption it was meant to
replace stayed in place, so every figure after this point is unaffected.
The loops were not careless. On the parts of the job that had a measurable direction
they were faster and more persistent than a person. The result is a fact about
metrics: a score that does not require evidence will be raised without evidence, so
the evidence requirement has to sit inside the score, and an acceptance check has to
stand behind it, declared in advance by a party that is not raising the score.
The third loop was given the wrong kind of work. Tracking down 25research/loops/acquisitions/FINDINGS.mdrows of the register table
specific documents is a series of separate judgements, not a score to raise, and it
should not have gone to a loop. It closed 16research/loops/acquisitions/FINDINGS.mdrows with status ACQUIREDthe file's own totals line says 17/7/3/1, which sums to 28 against 25 rows. The table wins. of them with a
documented source, took 6research/loops/acquisitions/FINDINGS.mdrows with status USER_ACTION_READY more as far as a request that someone still
has to send, and recorded 2research/loops/acquisitions/FINDINGS.mdrows with status WALL dead ends. Its own summary line claims more
than its own table contains, and the table is what is reported here.
07
The four pre-registered tests
Each test was written down before it ran, together with the result that would count as a failure. Two passed, one of them narrowly. One failed. One returned nothing.
Writing the failure condition first is the whole mechanism. Once it is written, the
result cannot be reinterpreted into a pass. Each card below shows the question and
that condition; the result is on the other side.
08
Performance of the rebuilt portfolio
The ranking of managers carries information. Buying their single largest position does not. After the cost of trading, the portfolio returns what an index fund returned for the same risk.
Ranking managers by past results carries real information. Destroy only the
ranking and the return falls from 20.36%out/e3/e3_verdict.jsonfield canonical_cell.cagr_0bps of the verdict bundle to
10.60%out/e3/e3_verdict.jsonfield attribution_cagr.construction_only_permutation_median of the verdict bundle a year.
Buying each of those managers' single largest position does not. Hold the same
managers' whole portfolios instead — about
606out/e3/e3_verdict.jsonfield actionable_finding.argmax_is_not.blend_names_held of the verdict bundle
names — and the return is 22.21%out/e3/e3_verdict.jsonfield actionable_finding.argmax_is_not.blend_cagr of the verdict bundle a year
at 1.1537out/e3/e3_verdict.jsonfield actionable_finding.argmax_is_not.blend_sharpe of the verdict bundle per unit of risk,
against 20.36%out/e3/e3_verdict.jsonfield canonical_cell.cagr_0bps of the verdict bundle and
1.0984out/e3/e3_verdict.jsonfield canonical_cell.sharpe_0bps of the verdict bundle for the concentrated portfolio. Measured
against that alternative, concentration adds
1.17 pointsout/e3/e3_verdict.jsonfield actionable_finding.argmax_is_not.book_alpha_against_blend_pp_yr of the verdict bundle
a year with a t-statistic of
0.46out/e3/e3_verdict.jsonfield actionable_finding.argmax_is_not.book_alpha_against_blend_t of the verdict bundle.
The ranking held information. Concentration is where
the result was lost. Concentration is also where every defect in section
05 entered: the largest position is what read the contaminated weight,
what disappeared when a company was taken over, and what the managers who had
stopped filing were selected into.
Three qualifications travel with that paragraph. The alternative portfolio takes
more market risk, at a beta of
1.06out/e3/e3_verdict.jsonfield actionable_finding.argmax_is_not.blend_beta of the verdict bundle against
0.89out/e3/e3_verdict.jsonfield canonical_cell.beta_vs_iwv of the verdict bundle. It had a worse worst stretch, at
-32.08%out/e3/e3_verdict.jsonfield actionable_finding.argmax_is_not.blend_max_drawdown of the verdict bundle against
-29.68%out/e3/e3_verdict.jsonfield canonical_cell.max_drawdown of the verdict bundle. And it was built as a control rather than
registered as a candidate, so it carries none of the pre-registration this page
insists on everywhere else.
Against what could have been bought instead
a year
swing
per unit risk
the rebuilt portfolio, before costs
20.36%out/e3/e3_verdict.jsonfield canonical_cell.cagr_0bps of the verdict bundle
18.53%out/e3/e3_verdict.jsonfield canonical_cell.vol of the verdict bundle
1.0984out/e3/e3_verdict.jsonfield canonical_cell.sharpe_0bps of the verdict bundle
the rebuilt portfolio, after costs
18.39%out/e3/e3_verdict.jsonfield canonical_cell.cagr_25bps of the verdict bundle
18.53%out/e3/e3_verdict.jsonfield canonical_cell.vol of the verdict bundle
0.9910out/e3/e3_verdict.jsonfield canonical_cell.sharpe_25bps of the verdict bundle
the S&P 500
15.16%out/e3/e3_verdict.jsonfield benchmarks_same_window.SPY.cagr of the verdict bundle
15.28%out/e3/e3_verdict.jsonfield benchmarks_same_window.SPY.vol of the verdict bundle
0.9923out/e3/e3_verdict.jsonfield benchmarks_same_window.SPY.sharpe of the verdict bundle
the whole US market
14.60%out/e3/e3_verdict.jsonfield benchmarks_same_window.IWV.cagr of the verdict bundle
15.71%out/e3/e3_verdict.jsonfield benchmarks_same_window.IWV.vol of the verdict bundle
0.9290out/e3/e3_verdict.jsonfield benchmarks_same_window.IWV.sharpe of the verdict bundle
the Nasdaq 100
21.01%out/e3/e3_verdict.jsonfield benchmarks_same_window.QQQ.cagr of the verdict bundle
18.85%out/e3/e3_verdict.jsonfield benchmarks_same_window.QQQ.vol of the verdict bundle
1.1148out/e3/e3_verdict.jsonfield benchmarks_same_window.QQQ.sharpe of the verdict bundle
return per unit of risk, drawn to scale
the rebuilt portfolio, before costs1.0984out/e3/e3_verdict.jsonfield canonical_cell.sharpe_0bps of the verdict bundle
the rebuilt portfolio, after costs0.9910out/e3/e3_verdict.jsonfield canonical_cell.sharpe_25bps of the verdict bundle
the S&P 5000.9923out/e3/e3_verdict.jsonfield benchmarks_same_window.SPY.sharpe of the verdict bundle
the whole US market0.9290out/e3/e3_verdict.jsonfield benchmarks_same_window.IWV.sharpe of the verdict bundle
the Nasdaq 1001.1148out/e3/e3_verdict.jsonfield benchmarks_same_window.QQQ.sharpe of the verdict bundle
The Nasdaq index beat the rebuilt portfolio on both measures before costs. It is
listed for completeness and it is not a fair comparison: it was selected after the
fact by knowing which index won this particular decade, which is the error this
whole program exists to detect.
09
Post-mortem
Six decisions that shaped the program: why each was made, what it produced, and what would be done differently.
01
Audit the data before attributing any result to the method.
why it was decided
An experiment run on faulty inputs attributes a portfolio that never honestly existed, and it looks exactly as rigorous as one that did.
what happened
Four corrections each changed which stocks were held. 0%out/e3/phase0_verdicts.jsonaudit 0.1, share of rebalances with an identical bookit changed which stocks were held, not merely how they scored. of monthly portfolios survived the first correction unchanged. Any experiment run before them would have had to be discarded.
what would change
Nothing. This is the decision the program rests on and it paid for itself four times.
02
Count every attempt, including the ones from earlier work.
why it was decided
The test for luck is only worth running if the number of attempts is honest, and it is honest only if it was fixed before anyone saw which way it cut.
what happened
The final count is 4,353research/e3/LEDGER.md:325| **final N** | **4,353** |every configuration ever screened, counted whether or not anyone wanted it counted., including 4,283research/e3/LEDGER.md:47| **historical total** | **4,283** | configurations from work that predates this program and had every excuse to be left out. That count is what failed the headline result.
what would change
Nothing, except to state that this is the number most likely to be quietly dropped by anyone repeating this work.
03
Separate the model that sets the conditions from the model that runs the work.
why it was decided
Choosing the most favourable specification is not dishonesty. It is the default outcome when the party that wants the answer also picks the specification.
what happened
It caught errors in both directions. Two more favourable specifications were refused on principle: a staleness cut-off worth two and a half points more a year, and a carry assumption worth a fifth of a point of return per unit of risk. The implementing side found the error in the reviewing side’s own headline figure.
what would change
Let the reviewing side see the space of specifications without seeing the results in it. Refusing a favourable specification is easier before you know how favourable it is.
04
Let the rules grow out of the failures.
why it was decided
A rulebook written entirely in advance encodes only the failures its author has already had.
what happened
11research/e3/LEDGER.mdhighest 'standing rule N' referenced across LEDGER.md, PLAN_E3.md and E3_VERDICT.md; rules seen: [1, 3, 5, 6, 7, 9, 10, 11]six were written before Phase 0; the rest were forced by failures. rules: six written in advance and five added afterwards. A test with no control cannot separate "no effect" from "the mechanism was never connected". A result that changes sign between rebuilds means an opinion expires with its data. A check that pools every position misses a rule that reads only the largest one.
what would change
Write the rule on the day the failure happens. All five were obvious afterwards and none was obvious in advance.
05
Give the dense, repetitive work to unsupervised loops.
why it was decided
15,494research/e3/PHASE0_FINDINGS.md:746of which exit the list: 15,494 (54.9%) securities had to be traced through public filings. That is more than a person will do carefully, and it is the shape of work a tireless agent should handle well.
what happened
One loop reported 100%.auto/log.jsonlmetrics.terminal_coverage_pct at run 440 coverage. Asked for the filing behind each answer, the same work scored 1.auto/log.jsonlmetrics.accession_documented_count at the strict metric's baseline (run 451)the same body of work, remeasured. Nothing was deleted; the question changed. of 735.auto/log.jsonlmetrics.accession_eligible_count at run 451. The acceptance check, declared before the loops started, rejected the output, and none of it entered the pipeline.
what would change
Two things. Put the evidence requirement inside the score, so that the only way to raise the score is to cite a source. And route work by shape: loops take dense, uniform work with a measurable direction, and anything needing separate judgements goes to a researcher. The third loop was given a list of specific documents to find and should not have been.
06
State what the result is worth, in the terms the reader cares about.
why it was decided
The alternative is to publish one more impressive backtest, which is the thing this program was built to detect.
what happened
Modest after risk. More modest after the cost of trading. More modest again after tax. With a real chance of being worse than the index rather than equal to it, because the portfolio carries risk the index does not.
what would change
Nothing. This paragraph is the deliverable and everything above it is the working.
10
Open specification and statistical power
One document was written before the results existed and has not been edited since. Anyone can run it forward against public archives.
On the morning the audits closed, the exact specification was frozen: the inputs,
the scoring rule, the number of positions, the weighting, the dating and the trading
cost. It was hashed and dated. Everything else on this page is a backtest, including
the parts that passed their own tests. That specification is the only thing here
that can ever be genuinely out of sample.
It has never been used. The program closed on the day it was frozen, so it holds no
entries, and the results that followed retired most of what it describes. It has not
been revised to match them and must not be. A pre-registration that is edited once
its contents are refuted is not a pre-registration.
Anyone can take it up. Rebuild the trades from the specification alone against
public archives, evaluate the whole stretch from the freeze date to the date of
reading as a single window, and judge it against the same tests, re-run on the new
months.
The single-window rule is not pedantry. It is the only thing separating a sealed
pre-registration from one more attempt: selecting an interior window rejoins the
4,353research/e3/LEDGER.md:325| **final N** | **4,353** |every configuration ever screened, counted whether or not anyone wanted it counted. attempts this ledger closed with.
The manager ranking carried information. The return per unit of risk did not survive
the size of the search that found it. What is worth keeping is the procedure that
could tell those two apart.