What ARGUS beats, and what beats it

This page is the evidence behind every “ARGUS beats X” claim we make: for each one, we picked a real, named competitor, ran both on the exact same question, and checked who actually won — rather than just asserting it. OWNED means ARGUS beat that competitor on the same input and we checked the win thirteen separate ways. TIED means the two came out about even. LOST means the competitor won, and we say so rather than leaving it off the page. Right now that is 6 OWNED, 37 tied, 8 lost, and 0 built but not yet checked this way — so for you, a claim on this page is never just our word for it.

Words used on this page
Same-input test
ARGUS and the rival run on exactly the same data, so the difference is the method, not the input.
Out-of-sample
Checked on data the method was not tuned on, so a result is not just a good fit to the past.
Ablation
Switching one part off to see whether the result depended on it.
Adversarial test
Inputs built to make the method fail, to find where it breaks.
SUE
Standardised unexpected earnings: how far a company's earnings moved against its own usual swing.
Euler risk decomposition
Splitting a portfolio's risk into each holding's share, so the shares add up to the whole.
Funding z-score
How unusual a perpetual's funding rate is against its own recent history, in standard deviations.
Sharpe ratio
Return divided by how much it swung; higher is steadier for the same return.

51 capabilities measured against a named rival: 6 OWNED, 37 TIED, 0 IMPLEMENTED, 8 LOST

OWNED means all thirteen conditions hold: the rival's best implementation read, its method reproduced, both run on the same input, a statistically valid evaluation with costs, out-of-sample, ablation, an adversarial test, failure cases, reproducibility, and no specialist capability left superior without a stated reason. The register refuses to load an OWNED claim that is missing one. Everything below is read from that register when this page loads. Back to the console

24 of 51 run live from a question in the console; the rest are named as gaps below. Losses and withdrawn claims are on what we got wrong.

Track 3

AI Trading Desk: a research workbench for a human trader, judged on feature depth, research quality, LUI fluency and a personalised thesis.

Information Extraction & Signal Generation

TIED11 of 13 conditions

Structured filing extraction vs. FinanceBench's real, published LLM measurement

RivalFinanceBench's own real, published metrics-generated results (Patronus AI, arXiv 2311.11944, 16 real model/retrieval-condition combinations graded Correct/Incorrect/Refusal by human review)

Same-input testboth real systems scored on the identical task class — a single numeric line item pulled from a real SEC filing — with ARGUS run on a freshly designed, real, live case set rather than FinanceBench's own unlicensed question set

Why not OWNEDRE-GRADED 2026-09-28 from IMPLEMENTED to TIED (Activity/27_CAPABILITY_CLOSE_PLAN.md §7): on FinanceBench's 50 metrics-generated questions ARGUS answers 50/50 with none wrong and the best published configuration 46/50; with ARGUS at 50/50 the paired test cannot fall below p = 0.125 (four discordant questions), so the set cannot separate them. On all 150 questions ARGUS LOSES on coverage — 55 correct, 0 wrong, 92 abstained, against 134 correct and 14 wrong for GPT-4-Turbo oracle-reverse and 75 correct for the deployable singleStore — while winning on precision. Winning outright needs a held-out question set graded from the filings by hand and the LLM arms re-run on it.

python -m argus.eval.infoextract_comparison
Every condition and its evidence
  • best implementation studied — FinanceBench's real evaluation_playground.ipynb read in full: the six-mode retrieval taxonomy (closedBook/oracle/inContext/singleStore/sharedStore + reverse variants), the real PyMuPDFLoader/RecursiveCharacterTextSplitter/Chroma RAG pipeline, and the documented finding that no automated scorer ships with the repo — grading was human, out of band
  • best method studied — two real methods on the identical task class: FinanceBench's real LLM+RAG pipeline reading filing prose vs. ARGUS's real, keyless SEC XBRL structured API fetch (data.sec.gov/api/xbrl/companyconcept) — already existing, reused here rather than reimplemented
  • baseline reproduced — FinanceBench's own real result transcripts (results/*.jsonl, commit cc39aeb4afdf33909ee1412188bf89035950c2eb) independently recomputed for the 50-question metrics-generated subset: oracle 46/50 correct, singleStore 22/50, sharedStore 6/50 (39 refusal), inContext 6/50 correct but 20/50 confidently WRONG, closedBook 0/50 — no LICENSE file on the repo, so the dataset/results are cited and recomputed from, never vendored
  • implementation complete — FundamentalsSource.facts/parse_concept/latest_per_period already existed and were already exercised by this project's own t3-infoextract probe before this comparison; this capability adds the rival measurement, not a stub
  • same input comparison — both real systems scored on the identical task class — a single numeric line item pulled from a real SEC filing — with ARGUS run on a freshly designed, real, live case set rather than FinanceBench's own unlicensed question set
  • statistically valid evaluation — FinanceBench's own side already a real 50-question subset across 16 model/ retrieval configurations; ARGUS's side swept across 6 real (ticker, concept) cases spanning all 5 supported concepts and 5 different real companies, not one hand-picked case, resolving 5 of 6 (the sixth reports why rather than guessing)
  • costs included — real wall-clock cost measured for a real, live SEC XBRL API round trip
  • out of sample test — the designed cases use real, live, current-day XBRL data never used to design the comparison's mechanism — NVDA/AAPL/MSFT/GOOGL/AMZN's most recent real filings as of the day this ran, not a fixed historical snapshot
  • ablation — isolates the exact mechanism on a real, live case: NVDA's real Q2 FY2009 net income carries two real rows under the identical fiscal end-date, a true quarterly duration and a sign-flipped cumulative one — a naive fetch with no quarterly filter is genuinely ambiguous between them, ARGUS's real quarterly_only path resolves to exactly the correct quarterly value
  • adversarial test — the real fetcher's edge-case behaviour tested directly: an unknown ticker reports 'no CIK on EDGAR' rather than raising or guessing, and a point-in-time cutoff correctly withholds every real fact filed after it
  • failure cases documented — two real, measured behaviours of the real fetcher found by running it: an unknown ticker returns zero facts with a named reason, and a point-in-time as_of cutoff withholds every real fact filed after it rather than leaking look-ahead
  • reproducibility proven — the same real ticker/concept fetched twice returns the same real value
  • no specialist capability superior — scoped explicitly — SCOPE_STATEMENT in eval/infoextract_comparison.py. Claimed: on a real numeric line item from a real filing, ARGUS's structured fetch cannot fabricate a fluent wrong answer, a failure mode FinanceBench's own data proves is common even for GPT-4. NOT claimed ARGUS answered FinanceBench's own 50 questions. NOT claimed ARGUS solves FinanceBench's harder DERIVED-ratio questions — it supports five raw line-item concepts, not multi-fact arithmetic over them

Review & Self-Evolution

TIED11 of 13 conditions

Self-evolving review rules

RivalTauricResearch/TradingAgents reflection memory

Same-input testa decision with a demonstrably WRONG outcome (a real -15% realised return) stored via the real vendored TradingMemoryLog and read back later: the reflection describing the wrong call is re-injected identically to one about a right call, confirmed by running the real code twice, once each way

Why not OWNEDRE-GRADED 2026-09-28 from IMPLEMENTED to TIED (Activity/27_CAPABILITY_CLOSE_PLAN.md §5). eval/review_rivals.py now records every real decision with each gate's flag, and the excess-catch lead over QuantDinger's low-win-rate diagnostic has a day-block interval: overall [+0.0004, +0.0154] per decision, above zero, but carried by one defect kind — conflict [+0.020, +0.057]; grounding [-0.013, +0.009] and lean [-0.024, +0.007] favour QuantDinger slightly and not significantly. The retention loss through a falling base rate (S3: 32% of real rules kept) was attacked with a pre-registered fix — retire on lift against a local rolling base rate — which kept 33.75% at 40 seeds, short of its pre-registered bar (double), so it was reverted and kept as a tested negative result in desk/rule_lifecycle.py. Winning needs the lead outside one kind and S3 fixed.

python -m argus.eval.review_comparison
Every condition and its evidence
  • implementation complete — rules are replayed over real decisions and must earn a place by performance
  • failure cases documented — replayed over 40 real decisions, none of the five standing rules earned one
  • statistically valid evaluation — a rule is promoted on measured precision, never on having been written down
  • best implementation studied — the four systems already read for the sibling episodic-memory audit (TradingAgents, RD-Agent, FinMem, LangGraph) checked specifically for a process-rule/checklist-learning mechanism, not just symbol memory - grepped directly for checklist/process_rule/precision/earned concepts in RD-Agent and FinMem's own source: no match in either. Only TradingAgents has any lessons-reuse mechanism at all (the reflection log), and it has no precision-gated promotion of any kind - confirmed by reading it in full for the sibling capability, not re-guessed here
  • best method studied — TradingAgents' real memory/reflection code read in full (same read as the sibling Episodic memory capability): graph/reflection.py and agents/utils/memory.py's TradingMemoryLog - store, update, and unconditional read-back, with no precision, fire-rate, or track-record concept anywhere
  • baseline reproduced — the same vendored, byte-verified TradingMemoryLog already run for Episodic memory (commit be952b8eccb49720509af544c6675233bc1f10d0) - no new vendoring needed, reused directly: real writes, real outcome updates, real unconditional reads
  • same input comparison — a decision with a demonstrably WRONG outcome (a real -15% realised return) stored via the real vendored TradingMemoryLog and read back later: the reflection describing the wrong call is re-injected identically to one about a right call, confirmed by running the real code twice, once each way
  • ablation — all four of ARGUS's lifecycle thresholds (MIN_PRECISION, ALWAYS_FIRES, NEVER_FIRES, MIN_FIRINGS) shown independently load-bearing by patching each to a value that flips an otherwise-identical fixture's verdict (ACTIVE->MISLEADING, ACTIVE->NO_DISCRIMINATION, ACTIVE->DEAD_WEIGHT, ACTIVE->EARNING), verified programmatically, not derived — the last two were added 2026-09-21; this line correctly said two before that, and is updated now that the code genuinely tests all four
  • adversarial test — six designed fixtures, each targeting exactly one of the seven named lifecycle states (PROPOSED, DEAD_WEIGHT, NO_DISCRIMINATION, MISLEADING, EARNING, ACTIVE), run through the real evaluate() and confirmed to land on the intended status every time - including EARNING, which this module's own docstring records as a real self-found bug (unreachable until a specific fix), re-verified reachable here on fresh fixtures rather than assumed fixed
  • costs included — TradingAgents' real write path costs one LLM call per graded episode (Reflector.reflect_on_final_decision) to produce the prose it stores unconditionally; ARGUS's evaluate() is pure arithmetic over independently observed defects - zero tokens, zero model calls, every single replay
  • out of sample test — 433 real decisions split 216/217 by ledger sequence; every standing rule graded on both halves at the production MIN_DECISIONS. 3 of 5 are gradeable on the held-out half and all 3 keep the same verdict; the other 2 fire too rarely to judge and are counted as not-gradeable rather than as failures, because the absence of a test is not a bad result
  • reproducibility proven — evaluate() is a pure function of its inputs - no model, no seed, no simulation. Every fixture in this comparison is hand-constructed and fixed
  • no specialist capability superior — scoped explicitly - SCOPE_STATEMENT in eval/review_comparison.py. Claimed: the MACHINERY that refuses a bad rule by name (DEAD_WEIGHT, NO_DISCRIMINATION, MISLEADING) exists, runs correctly across six real lifecycle transitions, and has no equivalent anywhere in TradingAgents' real code (grepped directly, zero matches). NOT claimed: that TradingAgents' unconditional reuse is a design mistake on its own premise (a model re-reads the prose and can itself discount it, unlike ARGUS's constitution-gated loop where a model's live judgment is deliberately not the backstop). Also NOT claimed: that ARGUS's checklist currently contains any earned rules - it does not, disclosed as a standing blocker below, unchanged by this push

Decision Stress Testing

LOST11 of 13 conditions

Path-shape matching with a calibrated null

RivalTDAmeritrade/stumpy real matrix-profile distance and matrix-profile self-join

Same-input testboth real distance functions fed the identical five scalar inputs (computed the ordinary way from the same z-normalised windows) on a general case and both constant-window edge cases; both real search functions run on the identical causally-truncated series for every swept query point

Why not OWNEDRE-GRADED 2026-09-29 from IMPLEMENTED to LOST (Activity/28_CAPABILITY_CLOSE_PLAN_2.md §23). On AnalogDesk's own grid of 2,698 held-out queries at five sessions (eval/analogstress_comparison.py, rival reproduced exactly), the path-shape arm now has its Diebold-Mariano tests, clustered over 38 dates: its Winkler score of 16.40% is significantly worse than the name's own unconditional band (15.14%, p = 0.001), AnalogDesk's conformal analogues (15.25%, p = 0.002) and the volatility-scaled harness (15.17%, p = 0.001); only the pooled band is worse. Path shape adds no information over the name's own record at this horizon. The causality point over STUMPY does not stand either: STUMPY's own left matrix profile is causal, so on look-ahead the two are level by construction. The console's path-match line now says what it is worth, reading this artefact.

python -m argus.eval.shapematch_comparison
Every condition and its evidence
  • best implementation studied — STUMPY's real _calculate_squared_distance (core.py) and stump() self-join read and, for the scalar distance function, vendored whole, byte-hash-pinned; ARGUS's own desk/shapematch.py already cited STUMPY by file:line and derived its distance formula algebraically before this comparison ran anything, including a self-caught bug (a wrong '2.0' threshold guess, corrected to the derived '1.0' after reading the real source)
  • best method studied — both real methods compared: STUMPY's general-purpose matrix profile (naive self-join, m/4 exclusion default, no significance testing, not built for a point-in-time trading question) vs. ARGUS's real find() (causal-by-construction candidate generation, full-window exclusion, shuffled-return null calibration before a precedent is ever claimed)
  • baseline reproduced — STUMPY's real _calculate_squared_distance run genuinely JIT-compiled (numba CPUDispatcher, not a stub), byte-hash-pinned against the vendored source (commit e4caf8a7ba519d1ba04796cd06aa78d91e9ca6ee); the real, published stumpy PyPI package's own stump() run directly, unmodified, not vendored (same posture as the finBERT baseline)
  • implementation complete — distance/znormalise/find/shuffled_closes all evaluate real bars end to end
  • same input comparison — both real distance functions fed the identical five scalar inputs (computed the ordinary way from the same z-normalised windows) on a general case and both constant-window edge cases; both real search functions run on the identical causally-truncated series for every swept query point
  • statistically valid evaluation — the exclusion-zone divergence is a measured rate across many real, swept query points (not one convenient case), and the look-ahead check counts every interior query point in a real self-join, not a hand-picked one
  • costs included — both real costs measured directly and reported without forcing a winner — STUMPY's real numba-JIT'd scalar function is faster per call than ARGUS's pure-Python one once warm, reported honestly rather than omitted because it favours the baseline
  • out of sample test — the exclusion-zone sweep and look-ahead check run on a series constructed specifically to isolate the property under test, distinct from the general and edge-case distance-agreement inputs — the finding is not read off the same data point that motivated it
  • ablation — a scan-genuinely-searched-files test (test_the_scan_actually_searched_real_files) caught a real path bug in this comparison's own first draft — the significance scan was silently reporting 'zero matches' against a directory that did not exist, which would have shipped a vacuous negative finding — fixed and re-verified before being trusted
  • adversarial test — STUMPY's real, default stump() self-join is shown to return a look-ahead neighbour (index after the query) for real interior query points on a real series, run not inferred from its docs
  • failure cases documented — the exclusion-zone sweep's own worked example names both systems' real picks (STUMPY's temporally-adjacent one vs. ARGUS's correctly-excluded one) side by side, not just a pass/fail count
  • reproducibility proven — both real systems reproduce identical output on identical input, twice
  • no specialist capability superior — scoped explicitly — SCOPE_STATEMENT in eval/shapematch_comparison.py. Claimed: on the two properties that decide whether a retrieved precedent can be trusted for a point-in-time trading decision — causality and distinguishability from chance — ARGUS's real find() has both by construction and STUMPY's real default stump() call has neither. NOT claimed that STUMPY is a defective library — general-purpose matrix-profile search computing neighbours in both directions is its documented, intended behaviour, and avoiding look-ahead when applying it to a trading question is the caller's burden, which is exactly the gap ARGUS's own specialised find() closes. NOT claimed that STUMPY should have built-in significance testing — outside its stated scope, not an omission.
TIED4 of 13 conditions

Regime-boundary detection, measured against stumpy FLUSS and ruptures

RivalTDAmeritrade/stumpy (stump+fluss, real public API); deepcharles/ruptures (Pelt/KernelCPD/Dynp); the incumbent two-line volatility rule in strategies/track1_suite.py's own rotation_regime_switch

Same-input testARGUS's offline FLUSS, real stumpy, real ruptures and the real incumbent rule all run on the SAME 60-day hourly Bitget market series for all 12 rTokens, plus all FOUR budgeted methods (FLUSS, stumpy, ruptures, and ARGUS's second segmenter exact_partition added 2026-09-22) run on the SAME 100 synthetic trials…

Why not OWNEDno_specialist_capability_superior is a genuine TIE, not a PASS: FLUSS, ARGUS's ORIGINAL tool for this job, still loses to ruptures decisively and this is not softened by anything below — mean F1 0.443 vs 0.975 (1 win/89 losses/10 ties, sign-test p=1.5e-25), mean Hausdorff 111.9 bars vs 5.4, an order of magnitude worse localisation. What moved the capability's OVERALL verdict from LOST to TIED is a SECOND, different ARGUS tool (exact_partition, desk/regime.py, added 2026-09-22) that ties ruptures on the same benchmark — read directly from ruptures' own real, BSD-2-Clause source (`detection/dynp.py`, `costs/costl2.py`) after Finding 8 showed the gap was a method-family mismatch (a shape-based nearest-neighbour heuristic vs an exact cost-minimising partition) rather than a tunable parameter. This mirrors the portfolio-allocation capability's own LOST-to-TIED story exactly: the original…

Every condition and its evidence
  • same input comparison — ARGUS's offline FLUSS, real stumpy, real ruptures and the real incumbent rule all run on the SAME 60-day hourly Bitget market series for all 12 rTokens, plus all FOUR budgeted methods (FLUSS, stumpy, ruptures, and ARGUS's second segmenter exact_partition added 2026-09-22) run on the SAME 100 synthetic trials (ruptures.pw_constant, 25 seeds x 4 noise levels) with KNOWN injected changepoints — Finding 8, extended the same day it first ran
  • statistically valid evaluation — one-sided binomial test of novelty rate against the incumbent's own coverage as the null (66.9%): FLUSS's own-run novelty rate scores non-significant against that null on every run to date. Paired sign test of per-trial F1 against KNOWN synthetic changepoints (ruptures.metrics.precision_recall at margin=WINDOW) across 100 trials: FLUSS loses to ruptures decisively (mean F1 0.443 vs 0.975, 1 win/89 losses/10 ties, p=1.5e-25) and beats stumpy significantly (mean F1 0.443 vs 0.330, 55 wins/0 losses/45 ties, p=5.6e-17). ARGUS's second segmenter, exact_partition, TIES ruptures on the identical 100 trials (mean F1 0.98 vs 0.975, 1 win/0 losses/99 ties, sign-test p=1.0 — literally cannot reject 'no difference' with one discordant trial, so reported as a tie, not rounded up from a nominally higher mean)
  • costs included — argus_seconds=5.25 vs stumpy_seconds_warm=0.017 vs ruptures_pelt_seconds=0.43 on the same 1,439-bar symbol; FLUSS measured ~306x slower than warm stumpy for a bit-identical matrix profile (16,992 windows, zero disagreements). exact_partition measured separately at ~24ms per 400-bar synthetic trial (pure-Python bottom-up DP with O(1) prefix-sum cost lookups) — faster than FLUSS despite being the exact, not approximate, tool
  • adversarial test — a flat curve: stumpy fabricates a boundary and repeats the same index on it, ARGUS's FLUSS refuses to report one at all — the one adversarial input in this comparison where ARGUS is the more conservative system, published beside the loss rather than let it soften the headline
  • out of sample test — first-half/second-half split of the 60-day window, novelty and agreement rates recomputed independently on each half against the same incumbent-flip null rather than carried over from the full-window number. Separately, the exact_partition tie is checked by noise level rather than only in aggregate: F1=1.000 both sides at noise 0.5/1.0, and ARGUS nominally ahead at the hardest level tested (noise=4.0: F1 0.920 vs 0.900, Hausdorff 13.04 vs 17.68) — not one lucky aggregate trial
  • reproducibility proven — reproducibility.identical=true; timing fields are excluded from the identity check by name rather than the check being loosened silently. Separately, exact_partition itself is a deterministic dynamic program with no internal randomness — unlike the LUI classifier head rebuilt the same week, no seeding was needed for reproducibility here

Published because `data/regime_comparison.json`'s own who_wins field already read 'baseline — ruptures is more coherent... stumpy is bit-identical and faster... FLUSS shows no measurable edge over the two-line incumbent', and nothing read that field into this register until now. The artefact carried a stale 337x / 5.61s timing figure from before a code fix that already read 310x / 5.25s; regenerated on 2026-09-21, it now reads ~306x / 4.72s. The small further drift between 310x and 306x across the two regenerations is ordinary wall-clock variance in a timing measurement, not a second stale figure. Updated 2026-09-22 (same day, second update): Finding 8 first sharpened the loss (FLUSS decisively loses to ruptures on real ground truth, p=1.5e-25, while genuinely beating stumpy, p=5.6e-17) — then, rather than stopping at a sharpened loss, `ruptures/detection/dynp.py` and `ruptures/costs/costl2.py` were read in full (BSD-2-Clause, permissive) to understand WHY FLUSS loses, and a second ARGUS segmenter (exact_partition — an exact L2 dynamic program, the textbook-correct tool for pw_constant's piecewise-constant-mean generative process) was built, verified to reproduce ruptures' own real Dynp exactly (120/120 trials) and to match KernelCPD's rbf-kernel result on the same data (10/10 trials), then wired into the SAME Finding-8 benchmark that measured the loss. Result: a genuine tie on the same 100 trials (mean F1 0.98 vs 0.975, 1 win/0 losses/99 ties). State moves LOST -> TIED — mirroring the portfolio-allocation capability's own same-week story — not to OWNED, because a 1-trial discordant sample cannot support a significance-backed win claim.

TIED6 of 13 conditions

Analogue stress bands vs. AnalogDesk (S2) on its own pre-registered test

Rivallixinde586-afk/analogdesk

Same-input testARGUS answers their exported queries from the same adjusted closes, truncated and embargoed at each query session

Why not OWNEDTIED on the primary score: ARGUS's analogue band scores 15.52 Winkler against AnalogDesk's 15.25 (AnalogDesk numerically ahead, Diebold-Mariano p = 0.18), and both lose to the naive same-name band (15.14). ARGUS wins two secondary measures: its raw analogue distribution is far better calibrated (PIT chi-square 92 against 208.6) and the path matcher's matched-coverage width is narrower (10.03% against 10.20%). A regime-scaled same-name band, chosen among three variants on 2019-2022 only (the idea itself prompted by the test result), scores 14.86 — ahead of AnalogDesk (15.25) and the naive band (15.14), but not significantly (p = 0.16 and 0.24); it does beat the volatility harness significantly (p = 0.04). Path-breach Brier is not scored: ARGUS's engines do not return intraday excursions

python -m argus.eval.analogstress_comparison
Every condition and its evidence
  • best implementation studied — AnalogDesk's engine read at source (analog.mjs, distribution.mjs, validation.mjs) and chosen by the rival review of 2026-09-24 as the entry to beat in Decision Stress Testing
  • baseline reproduced — our scorer, written from their protocol, reproduces their own published multipliers, coverage, width, matched width and PIT chi-square exactly (max difference 0.0)
  • same input comparison — ARGUS answers their exported queries from the same adjusted closes, truncated and embargoed at each query session
  • statistically valid evaluation — Winkler scores compared per query with a Diebold-Mariano test on differences clustered by query date; coverage standard errors clustered by date
  • out of sample test — multipliers frozen on 2019-2022, scored on 2023-2026, as their protocol fixes
  • failure cases documented — every predictor fails PIT; the naive band beats every retrieval method
  • reproducibility proven — deterministic: their engine, their grid, a fixed ARGUS configuration
  • implementation complete — both ARGUS engines ran on every query
TIED5 of 13 conditions

A trader's claims about the tape checked against it, measured against MirrorLine

RivalPinnacleCryptNG/MirrorLine (Season 2, no licence file): its own challenge engine, getInterpretationChallenge, run from its clone on the same sentences

Same-input testthe same 38 sentences through both desks the same morning, the tape captured before and after; near-zero days reported apart rather than graded

Measured

  • level vs MirrorLine getInterpretationChallenge on a trader's claims about the tape: which hold: 1.0 against 1.0 (share of gradable claims judged correctly (a causal claim also needs its stated cause held back)), 30 claims, p = 1.0; level in every group

Why not OWNEDTIED, and the verdict is the harness's own comparison report (shown under measured, read from data/claimcheck_comparison.json rather than restated here). What the report does not carry: the first run was a clear LOSS - ARGUS gave no verdict on any past-tense causal claim or either session claim - and it is kept in data/h2h_mirrorline/argus_raw_first_run.json

python -m argus.eval.claimcheck_comparison
Every condition and its evidence
  • best implementation studied — MirrorLine's claim rules read in source (lib/challenge/rules.ts, engine.ts): direction, causation, session, reference tape, liquidity, depth, freshness, trade action; rebuilt from behaviour, no code taken
  • baseline reproduced — MirrorLine's engine run live on 38 claims across nine rTokens, raw output kept
  • same input comparison — the same 38 sentences through both desks the same morning, the tape captured before and after; near-zero days reported apart rather than graded
  • implementation complete — direction, past-tense cause and session claims, tested
  • failure cases documented — the first run was a loss (ARGUS read 18 of 38, MirrorLine 38) and is kept; the claim kinds only one desk reads are named
TIED5 of 13 conditions

A leveraged hold across the weekend, measured against baserate

RivalJayanng/baserate (Season 2, proprietary): its own trade parser and dossier builder on its pinned replay fixtures, 1,227 NVDA weekends

Same-input test'long rNVDA over the weekend at 3x with 5,000 USDT' through both desks

Why not OWNEDTIED: the first run was a LOSS (ARGUS answered a hedge question); rebuilt, ARGUS prices liquidation at Bitget's live maintenance tier and live funding, reads 1,443 NVDA weekends since 1999 and the perpetual's own path through 57 weekends. Re-run 2026-09-27 (audit finding 27): baserate's trend-and-momentum match, which ARGUS also reads, was scored walk-forward against five other forecasts over 17,044 weekends of 13 stocks; it was barely better than the plain record (pooled pinball 27.84bp against 27.99bp) and worse than the band ARGUS now prints, EWMA-scaled with adaptive conformal coverage (26.37bp, both halves better for all 13 stocks, 79.4% of weekends inside a 10-90 band; data/weekend_quantiles.json). ARGUS keeps its own ledger of those bands from the same day (data/weekend_calls.jsonl), none graded yet. Still TIED: baserate's own forecasts have not been scored on the same weekends,…

Every condition and its evidence
  • best implementation studied — baserate's parser, dossier builder, base-rate engine and fixtures read; its weekend move found to run Friday close to Monday CLOSE
  • baseline reproduced — baserate's buildDossier run from its clone on the same sentence
  • same input comparison — 'long rNVDA over the weekend at 3x with 5,000 USDT' through both desks
  • implementation complete — split-adjusted stock weekends, closures only, read from the position's side
  • failure cases documented — the first run answered a different question; no regime-conditioned record
TIED9 of 13 conditions

Where a stop sits in the noise, measured against Rook's invalidation price

Rivaliamsuperfly/Rook (Season 2, MIT): runDebate (bull/bear + judge) on the hackathon Qwen, long side, 24h, six names, from its clone

Same-input testboth stops scored on the same held-out 40% of each name's Bitget daily bars

Why not OWNEDRE-GRADED 2026-09-29 from IMPLEMENTED to TIED (Activity/28_CAPABILITY_CLOSE_PLAN_2.md §43) with the general-purpose volatility stop. Hit rate alone rewards width, so ARGUS's lead over Rook's 0.1-1.7% stops is true by construction and is kept as context only. Every arm now trades the same long on the same 958 held-out windows (bought at the prior close, sold at the stop or the close, 12bps round trip; data/stopquality_comparison.json arms and windows): ARGUS -2.28 bps a window with its stop hit 10.9% of the time, Wilder's 1x ATR(14) stop -1.56 at 11.9%, 2x ATR -1.52, LeBeau's chandelier -1.37 where defined, Rook -9.18, no stop -4.39. ARGUS minus the 1x ATR stop is -0.73 bps a window, interval [-3.18, +2.04] over 162 dates, and it flips between chronological halves: no difference. ARGUS's stop does what it says: hit on 104 of 958 windows against its 10% target, Kupiec p = 0.38. The…

python -m argus.eval.stopquality_comparison
Every condition and its evidence
  • best implementation studied — Rook's invalidation logic read (lib/desk/invalidation.ts: model proposal, overridden by the 24h low, SMA20 or 1% when on the wrong side)
  • baseline reproduced — Rook's own runDebate executed on six names, outputs kept in data/h2h_rook/
  • same input comparison — both stops scored on the same held-out 40% of each name's Bitget daily bars
  • out of sample test — ARGUS's distance fitted on the first 60% of history, scored on the last 40%
  • implementation complete — the adverse-excursion measure, tested
  • failure cases documented — six names, one run; Rook's line is a thesis invalidation, not a noise stop
  • statistically valid evaluation — per-window net return, ARGUS against the 1x ATR stop, with a stationary bootstrap over dates in the groupwise audit; the interval includes zero, which is the TIED
  • costs included — every arm's return is net of the 12bps Bitget taker round trip
  • ablation — ARGUS's stop quantile at 0.80, 0.90 and 0.95 on the same windows, hit rate and net return for each
  • adversarial test — the most volatile fifth of held-out windows (ATR at least 5.4% of price) scored on its own, every arm
  • reproducibility proven — the arms are recomputed from the saved bars and must equal the published figures
TIED7 of 13 conditions

The chance a position breaks its loss limit, searched over observed moves and recorded order books, vs. a normal-shock Monte Carlo

Rivalhistorical simulation, the general method (the breach frequency skfolio's and riskfolio's historical VaR are read from); and, as context, the normal-shock method of Open-Finance-Lab/AgenticTrading's…

Same-input testboth estimate from the same fitted windows and the same recorded books, scored on the same test windows

Why not OWNEDRE-GRADED 2026-09-29 from IMPLEMENTED to TIED (Activity/28_CAPABILITY_CLOSE_PLAN_2.md §46) with historical simulation, the general method, after two defects in the comparison and one in the product were fixed. The product: a book whose 50 stored levels ended before a $50k exit was filled counted as a certain breach on every move, favourable ones included, which made META's and COIN's breach chances at a 10% tolerance simply their share of truncated books (17.9% and 7.6%); such books now leave the calculation and are counted and named (desk/stress_search.UNKNOWN_DEPTH). The comparison: the realised chance was ARGUS's own search on the second half, so the book rule sat in both estimate and truth; it is now the share of non-overlapping held-out windows whose move, with the median exit cost, broke the limit. Scored that way (data/stress_search_comparison.json), ARGUS and historical…

python -m argus.eval.stress_search_comparison
Every condition and its evidence
  • best implementation studied — sisl/AdaptiveStressTestingToolbox (MIT) ast_reward.py, example_av_reward.py:40-117 and its MCTS solvers read at source (research/harvest/16-adaptive-stress-testing.md)
  • same input comparison — both estimate from the same fitted windows and the same recorded books, scored on the same test windows
  • reproducibility proven — the snapshot digest is recorded; the search is exhaustive and deterministic
  • implementation complete — desk/stress_search.py, shown in the research task's stress step
  • costs included — every arm and the realised truth carry the median exit slippage and the 6bps taker fee
  • out of sample test — estimates on the first half of each name's windows, truth on non-overlapping windows of the second half
  • failure cases documented — the books too shallow to price the exit are counted per name, and the tolerance where ARGUS is closer on fewest names is published
  • adversarial test — the most volatile quarter of names scored on its own
TIED3 of 13 conditions

The desk's directional lean, vs. NIGHTWATCH AI's signal, on the same instants

Rivaldrained69/nightwatchai LocalNightwatchEngine.research (five skill readers and synthesizeSignal), run unmodified from its clone on Bitget R-pair hourly candles closed before each instant and a Yahoo daily macro snapshot,…

Same-input testthe same symbol-instants, graded on the same realised moves at the desk's mark and at 8h

Why not OWNEDAhead on the shared calls, not ahead of the tape. On the 133 instants where both called a direction, graded at NIGHTWATCH's own eight hours on its own R-pair: the desk 53.4% right, NIGHTWATCH 42.9%; where they disagreed the desk was right 21 times and NIGHTWATCH 7 (exact sign test p = 0.0125, which treats the 28 as independent; instants in one decision cycle share one market move, so it overstates the evidence). Calling "up" every time scored 51.1% on the same instants, and neither side's interval excludes it.

python -m argus.eval.nightwatch_comparison
Every condition and its evidence
  • best implementation studied — NIGHTWATCH read at source: src/domain.js runSkillPack, synthesizeSignal, LocalNightwatchEngine.research; server/providers/bitget.mjs computeIndicators and mergeMarketRow; server/signal-history.mjs grading (8h, 20 bps flat band); server/live-enhance.mjs overlay
  • baseline reproduced — its signal function imported from the clone by baselines/nightwatch_signal.mjs, unmodified
  • same input comparison — the same symbol-instants, graded on the same realised moves at the desk's mark and at 8h

Personalized Research Workbench

OWNED13 of 13 conditions

Per-profile mandate that changes the verdict

Rivalhkuds/vibe-trading agent/src/live/enforcement.py:458-609, the only one of 16 systems with a per-user mandate that changes a verdict on identical state and is tested

Same-input testtwo profiles, one market frame, different verdicts (intra-ARGUS).

python -m argus.eval.mandate_comparison
Every condition and its evidence
  • best implementation studied — 16 systems read; only vibe-trading diverges on identical state with tests
  • implementation complete — the mandate is rendered before reasoning, not applied as a resize afterwards (agents/desk.py's mandate_block, read inside MarketFrame.to_prompt_block()). Extended 2026-09-15: order_evidence() existed, was tested, and was never called by anything outside its own test — found by grepping the whole src tree for its two callers and getting zero hits, wired into agents/desk.py the same day so the PM's evidence list is genuinely ordered by what this trader prefers, not just the mandate line alone
  • same input comparison — two profiles, one market frame, different verdicts (intra-ARGUS). Extended 2026-09-15 with a cross-system same-input comparison: 11 designed + 19,440 swept scenarios run through both ARGUS's real Mandate.out_of_mandate() and vibe-trading's real, vendored check_mandate() on identical inputs — eval/mandate_comparison.py
  • failure cases documented — the desk reports when personalisation did NOT bind, which vibe-trading omits. Four more, specific to this capability's own build, 2026-09-15: two fabricated citations in this project's own prior work caught and corrected (a mandate-injection mechanism attributed to a real vibe-trading file that does not contain it; an evidence-ordering function attributed to a vibe-trading path that does not exist), dead code found and fixed (order_evidence()/frame_for() built, tested, never wired — see implementation_complete), and a self-caught measurement bug (an early sweep held three of vibe-trading's own limits at non-triggering values, understating its coverage — see costs_included)
  • statistically valid evaluation — measured over every distinct (symbol, horizon) the desk actually faced - 195 frames from 231 recorded decisions - and decomposed, because the pooled headline was an artefact: the first run read 83.3% and every rung came back at exactly 0% or 100%, so the real frames moved nothing. Reported as 84.6% headline against 1.3% attributable to a real dimension, with 1 of 6 declared rungs discriminating
  • adversarial test — two structural-invariant edge cases, not a happy path: `book=None` (no book supplied) must never be read as zero positions open, and a profile with max_concurrent_positions=0 (aggressive — unlimited) must never be stopped by any book size, however large — a naive implementation could conflate either
  • reproducibility proven — judge()/diverge()/audit() are pure Decimal arithmetic over the profile's own limits — no model, no seed, no simulation; the module's own docstring states this is deliberate (a model grading its own decisions is a failure documented elsewhere in this project). The cross-system comparison shares the same property and adds another: mandate_comparison.py's 19,440-scenario grid is itertools.product over fixed value tuples, not RNG-seeded — a seed's meaning can shift across Python versions, and every combination is generated the same way whether or not it breaches anything, which a hand-picked seed value could not promise. Runs in ~1 second, no network, same output every run
  • best method studied — vibe-trading's check_mandate() read whole (enforcement.py, all 797 lines, not the 458-609 slice alone) plus sdk_order_gate.py (185 lines), advisory/__init__.py, propose_mandate_tool.py and mandate/model.py in full. This corrected two FABRICATED citations a prior pass of this project had carried since 2026-09-13 — a mandate-injection mechanism attributed to sdk_order_gate.py:62-182 that the real file (re-read in full) does not contain, and an order_evidence() function attributed to agent/src/agent/mandate.py, a path confirmed not to exist by listing agent/src/agent/ directly. Also checked directly (not assumed): agno-agi/investment-team's teams/coordinate_team.py, fetched verbatim via `gh api`, 63 lines total, no context/ directory, no per-agent mandate; and TauricResearch/TradingAgents' risk-analysis layer (fixed debate personas, not a real trader's own constraints, per the existing research/architecture/tradingagents.md:729 teardown). See research/architecture/personalisation-audit.md's correction notice
  • baseline reproduced — vibe-trading's real check_mandate(), OrderIntent, Mandate/HardCaps/UniverseConstraint/ConsentMeta vendored verbatim (byte-verified against commit 8452a8448f947dfa1d5fe55b582f1944d4d9b696 with diff, pinned by SHA256 hash so the check survives without the external clone present) and actually executed — not paraphrased — via a sys.modules import shim that edits zero lines of their source. Confirmed correct on two hand-checked calls: a clean order returns ALLOW, an over-levered order returns the exact real breach (kind=quantitative, limit=max_leverage, attempted_value=5.0)
  • costs included — the real, measurable cost of each system's structural blind spot, not asserted: across a 19,440-scenario grid stressing every dimension both systems check, vibe-trading silently allows 10.4% ARGUS would refuse (horizon/hedge/confidence/concurrent-position — dimensions it has no field for at all) and ARGUS allows none that vibe-trading refuses. Until 2026-09-27 ARGUS allowed 8.7% (vibe-trading's total-exposure, gross-leverage and daily-count limits, which this register had called ConstitutionPolicy's job although the Constitution carries none of them per trader); those three limits were added to the mandate and the grid re-run (audit 98). A first version of this grid held three of vibe-trading's limits at non-triggering values by construction and measured a misleading 0% for one side — caught by running it and reading its own output, fixed, documented in swept_scenarios()'s own docstring
  • out of sample test — nothing here is a fitted parameter, so there is no train/test split in the sense the execution-scheduling capability's OOS test uses — the analogous honest split for a rule-based gate is between scenarios hand-built to sit exactly on a boundary (11 designed scenarios, one per checked dimension, each verified to match this module's own stated intent before being trusted) and a 19,440-scenario deterministic grid that was never tuned to hit any specific limit. The pattern found on the 11 held on the grid too: every overlapping dimension (exclude-list, notional) agrees on both; every ARGUS-only and vibe-trading-only dimension shows up as a real, sized blind spot rather than a hand-picked example
  • ablation — 10 checks (6 ARGUS: horizon, position-notional-pct, excluded-symbol, hedge-required, confidence-floor, concurrent-positions; 4 vibe-trading: leverage, daily-trade-count, total-exposure, exclude-list), each as a tripped/cleared pair on an otherwise-identical scenario — every single one independently flips its own system's verdict and only its own system's, confirmed programmatically (check_is_load_bearing == True for all 10), not eyeballed
  • no specialist capability superior — scoped explicitly, not claimed whole — SCOPE_STATEMENT in eval/mandate_comparison.py. Claimed: within what Mandate actually covers (horizon, position-size-pct, exclusion, hedge, confidence, concurrent-cap) AND reaching the reasoning layer before a thesis is written, no studied specialist is superior — verified vibe-trading has no reasoning-injection mechanism anywhere in its repository (see best_method_studied), and its check_mandate() structurally cannot represent 5 of ARGUS's 6 dimensions. NOT claimed: that Mandate is a complete risk gate — vibe-trading's leverage/exposure/daily-count checks have no Mandate equivalent BY DESIGN (risk.constitution.ConstitutionPolicy's job — class in risk/constitution.py, its rule() gate logic in the same file, both confirmed before this claim was written — a separate already-registered capability), not an unaddressed gap. Also excluded from this claim: the CFA IPS standard, which the register's own baseline field already scopes this comparison away from ('systems... that changed a verdict on identical state and is tested') — a professional checklist with no executable implementation to run is not a specialist SYSTEM this capability competes against operationally, and saying so here is the same disclosure this condition asks for elsewhere, not a silent omission
OWNED13 of 13 conditions

Point-in-time correctness vs. OpenBB's real, ungated live-API agent

RivalOpenBB ODP (openbb_core, the platform openbb-mcp-server wraps and Agent Rita reads), with edgartools FactQuery.as_of as the best general-purpose tool and microsoft/qlib's PIT store as the category's source; OpenBB's…

Same-input testthe identical scenario put to every real system: a research query anchored to a historical point in time.

python -m argus.eval.workbench_comparison
Every condition and its evidence
  • best implementation studied — OpenBB's real openbb_agents/agent.py, tools.py, chains.py, prompts.py read in full: a subquestion-decomposition + FAISS tool-search + function-calling loop, three real LLM calls per query, tool access filtered by which API credentials are set — and OpenBB Platform's real 32-provider directory listing (openbb_platform/providers/*) re-counted from source, not trusted from an earlier note
  • best method studied — two real methods on the identical task class: OpenBB's real agent reads whatever a live API returns at call time, no temporal concept anywhere; ARGUS's real as_of-gated fetchers (market/evidence.py, market/fundamentals.py) — already existing, exercised elsewhere, reused here — refuse anything whose own real timestamp is after a stated cutoff
  • baseline reproduced — OpenBB Agents' real source (commit 1cfee33dc8443a9507698fc13c2c4eba88a03211, no LICENSE file so grepped not vendored) exhaustively searched for as_of/point-in-time/look-ahead/historical_date/backtest/cutoff: zero matches across every real .py file, re-run fresh the day this ran rather than trusted from an earlier read
  • implementation complete — as_of gating already existed on every real ARGUS source — SEC filings, RSS, Twitter/Reddit, XBRL facts — before this comparison; this capability adds the rival measurement, not a stub
  • same input comparison — the identical scenario put to every real system: a research query anchored to a historical point in time. ARGUS's real fetcher accepts it and returns only what was knowable then, verified on real live SEC data; OpenBB's real agent source (openbb-agents) has no code path that could even accept such a query, confirmed by exhaustive grep of its own real files rather than assumed. Six other real, cloned rivals were instead asked the identical 619 questions on the identical frozen snapshot and scored from their own real output — the stronger form of the same claim, now the primary evidence
  • statistically valid evaluation — 619 questions (ten tickers' 10-Q/10-K filings since 2017, one hour before and after each acceptance), every rival paired with ARGUS question by question: exact McNemar p below 1e-65 against each of the eight rival arms (six below 1e-80), no question any rival answered that ARGUS missed; ARGUS right-rate Wilson 95% interval 0.994-1.0; groupwise by ticker and side, and by before/after for the two day-granular arms (day_granular_fairness)
  • costs included — OpenBB's real agent needs three real LLM calls per query (documented from its own real source, not run — no OpenAI key on this machine); ARGUS's real as_of-gated fetch is measured wall-clock on a real, live, keyless API call
  • out of sample test — the gate was built on one filing (NVDA's 10-Q accepted 2026-08-26 20:36 UTC); held out, the nine tickers never looked at while building it: 553/553 right, 0 leaks, and every rival arm still loses paired (held_out in data/pit_rivals.json)
  • ablation — isolates the exact mechanism: ARGUS's resolver re-run with each rival's gate and supersede rule on the same 619 questions (mechanism_ablation in data/pit_rivals.json) — the filed-date gate alone leaks on 199 and hides 51 filings dated the next business day; keep-first alone serves the stale value on restated quarters. The acceptance second is the load-bearing boundary: NVDA's 10-Q dated 2026-08-26, accepted 20:36 UTC, is withheld at midnight and at 19:36 and visible at 21:36
  • adversarial test — the gate tested at the sharpest boundary there is: one hour either side of the second EDGAR accepted a real filing, plus midnight of its filed day — the cutoff a filed-date gate gets wrong; and 29 restated quarters asked an hour after the restatement, where a keep-first rival serves the old number
  • failure cases documented — found by running it, 2026-09-26: the gate this row first shipped compared filed dates, so it showed an evening 10-Q from midnight of its filed day — the test asserted that leak as correct. Replaced with the acceptance-second gate (market/pit.py); rows EDGAR's index cannot date are bounded to 22:00 New York on their filed day, erring late, and say so in the status
  • reproducibility proven — the same real ticker/concept/as_of fetched twice returns the same real value
  • no specialist capability superior — scoped explicitly — SCOPE_STATEMENT in eval/workbench_comparison.py. Claimed: ARGUS's structural point-in-time gating has no OpenBB equivalent. NOT claimed OpenBB's agent is broken for its own stated purpose — point-in-time gating is not a feature it claims. NOT claimed ARGUS's data-source breadth is competitive with OpenBB's — it genuinely is not (32 real providers vs 12), reported honestly rather than omitted
TIED5 of 13 conditions

A trader's thesis tested on the same input as optic-bitget's desk

Rivalneromtoobad/optic-bitget (Season 2, MIT): evidence table, Bull/Bear debate twice, Judge sampled three times, probability capped to 10-90%, run end to end

Same-input testthe same three sentences ('Long MSTR/NVDA/TSLA perp into earnings — funding looks cheap') through both desks the same morning

Why not OWNEDTIED: optic abstained on two of three theses because its earnings and positioning rows errored, and ARGUS answered exactly those rows (report date, targets, surprise, 13F, Form 4) plus a premise verdict measured against the contract's own settlements, with no model spend against about 97,500 Qwen tokens. optic still gives one synthesised call with a probability, which ARGUS does not

Every condition and its evidence
  • best implementation studied — optic-bitget's desk read in source (src/desk/index.ts, evidence.ts, judge.ts, src/lenses/prediction.ts) and its Polymarket selection rules taken for market/prediction.py
  • baseline reproduced — optic's own runDesk executed on three theses, outputs kept verbatim; its code unchanged except an environment-gated LLM endpoint so it could run on the hackathon Qwen
  • same input comparison — the same three sentences ('Long MSTR/NVDA/TSLA perp into earnings — funding looks cheap') through both desks the same morning
  • implementation complete — the premise check found by this comparison, and tested
  • failure cases documented — optic still leads on a single synthesised call; two ARGUS defects the run exposed; two gaps closed afterwards and not re-measured
TIED3 of 13 conditions

Trader memory across sessions (what the trader says about themselves) vs. mem0

Rivalmem0 (mem0ai, Apache-2.0), the most used open-source memory layer for LLM agents, run unmodified in its own environment with its default extraction prompt, Qwen as its model, a local sentence-transformers embedder and a…

Same-input testboth sides read the same frozen statements, not-about-me sentences and effect tasks in each round; mem0 run as released, in its own venv

Why not OWNEDLOST on recall, WON on false memories, on the only blind round that decides the grade (held_out_4, data/memory_comparison.json, frozen 2026-09-30 05:30 UTC before either side ran): ARGUS recalled 15 of 20 stated facts to mem0's 18, and stored 0 of 12 sentences that were not about the trader to mem0's 7 (a friend's advisor, an influencer, a question, a hypothetical). Precision 100% against 72%, F1 0.86 against 0.80 — neither side dominates, so the row is TIED. ARGUS's misses are facts typed with no subject ("keeping it under 7% per trade", "done with UST, never again").

python -m argus.eval.memory_comparison
Every condition and its evidence
  • best implementation studied — mem0/memory/main.py (add, search, the ADDITIVE_EXTRACTION_PROMPT) and its storage history, read at source (research/harvest/04-mem0.md)
  • same input comparison — both sides read the same frozen statements, not-about-me sentences and effect tasks in each round; mem0 run as released, in its own venv
  • out of sample test — four rounds; the two used for tuning are labelled so, and held_out_4 was frozen before either side ran and never used to change the reader
  • implementation complete — lui/memory_model.combined, called for every question by the console's server

Execution Assistance

LOST13 of 13 conditions — against a rival that does not lead the sub-theme

Session-aware execution that refuses to solve through a boundary

Rivalnkaz001/hftbacktest queue model; Bitget's own instrument rules; Almgren & Chriss (2000) closed-form optimum vs nautechsystems/nautilus_trader's real TwapAlgorithm as the field's stated default

Same-input testtrajectory() called twice on the IDENTICAL real ImpactParameters — once at the caller's risk_aversion, once at 0 — after finding that calling twap() directly scores the straight line under a fictional zero-impact market

Why not OWNEDRE-GRADED 2026-09-28 from IMPLEMENTED to LOST (Activity/27_CAPABILITY_CLOSE_PLAN.md §6). eval/session_arena.py ran for the first time on real Bitget order books replayed from Tardis (19,440 parents over 11 perpetual and 4 spot first-of-month days; 384 cross a session boundary; three 2025-09-01 days are empty files at the source and are named, not replaced). On the pre-registered primary, the boundary-crossing parents on test days, Bitget's own TWAP with one-minute children costs 0.62 bps less than ARGUS's session-aware schedule (symbol-day block bootstrap [0.01, 1.53]): LOSS. Against zz-0816 the cost gap is inside the interval but ARGUS's shortfall is more dispersed (ratio 1.015, [1.006, 1.031]): LOSS. ARGUS is cheaper than immediate execution (-8.2 bps, [-11.6, -3.2]), an eight-slice TWAP (-2.4, [-4.1, -0.3]) and Egress (-3.5, [-6.0, -0.03]) but with wider shortfall: trade-offs. Its…

python -m argus.eval.schedule_comparison
Every condition and its evidence
  • best implementation studied — hftbacktest and Nautilus execution paths read for fill realism
  • best method studied — Almgren & Chriss (2000) read and transcribed in the module's own notation (permanent/temporary impact, kappa, the closed-form sinh trajectory); nautechsystems/nautilus_trader's real TwapAlgorithm (crates/trading/src/algorithm/twap.rs) read to confirm TWAP is genuine field practice, not a strawman
  • baseline reproduced — execution.schedule.twap() reproduces TWAP's even-division schedule; verified it is the exact risk_aversion=0 special case of the same closed-form trajectory() function, not a separately-coded approximation
  • implementation complete — 787 live instruments loaded; precision, notional, band, balance and rate
  • same input comparison — trajectory() called twice on the IDENTICAL real ImpactParameters — once at the caller's risk_aversion, once at 0 — after finding that calling twap() directly scores the straight line under a fictional zero-impact market
  • statistically valid evaluation — 162 real (quantity, horizon, impact regime, risk_aversion) points swept, not a handful of convenient values
  • costs included — the venue's own published fee confirms the 12bps round-trip model
  • ablation — ablating Almgren-Chriss's own risk-aversion term (lambda -> 0) IS the TWAP comparison itself, stated as such rather than run as a padded second experiment — verified exactly (risk_aversion=0 reproduces is_twap=True on every swept point) and by convergence (risk_aversion=1e-6 front-loads within 0.00001 of TWAP's exact 0.5)
  • adversarial test — quantities quantise down, never up, so rounding can never enlarge an order
  • failure cases documented — three real cases found by reading and then by testing, not assumed away: (1) Nautilus's real TWAP floors each child order and schedules the shortfall as an extra slice (twap.rs:220-309) — ARGUS's Trajectory did not, closed by execution.schedule.quantise_trajectory; (2) Nautilus never schedules a slice below the venue's tradeable minimum, merging it forward instead (twap.rs's own '..._below_size_increment'/'..._below_min_quantity' tests) — also closed, with a `min_order_qty` parameter; (3) the FIRST version of the fix for (1) had its own real bug, caught by these tests rather than by inspection — flooring each slice independently before carrying anything forward silently discarded each slice's own fractional remainder, so an extreme schedule emitted 18 zero-quantity 'slices' that still summed correctly but were not real orders. Fixed by tracking the running RAW cumulative total instead of pre-truncated per-slice values
  • reproducibility proven — pure closed-form Decimal arithmetic, no seed, no simulation — the identical inputs produce the identical trajectory by construction
  • no specialist capability superior — scoped precisely: this compares the SCHEDULING decision (which quantity trades when) against Nautilus's real TwapAlgorithm on the same question, not against its full 1,494-line order-execution/timer/cache infrastructure (a different concern, living in ARGUS's own execution/orders.py and paper/runner.py). On that scoped question, both real gaps found by reading Nautilus's source are now closed and verified: quantise_trajectory preserved every total across 324 real schedules from the same sweep (data/schedule_comparison.json, 0 failures, 14 that genuinely needed the sub-minimum merge — not a grid too easy to exercise it), and the closed-form optimum itself never lost to the field's own stated default across the identical 162-point sweep
  • out of sample test — an earlier version of this register entry called this condition a template-fit that does not apply to a closed-form optimum — wrong, and corrected rather than left standing: sigma is a REAL, market-observed quantity, not a free theoretical choice, and out_of_sample_test/out_of_sample_sweep estimate it from a chronologically split (never random) real window, hold gamma/eta/epsilon fixed by design, and check AC's advantage over TWAP holds against BOTH real, genuinely different volatility regimes. Run against all 12 real rTokens: held on 12 of 12, real in-sample/out-of-sample volatility ratios ranging 0.55 to 1.12 across symbols — not a near-1.0 split that would have proven nothing
TIED4 of 13 conditions

Order splitting on realised cost vs. Bitget's own TWAP, on a full-depth replay

RivalBitget's native TWAP (equal market slices at a 60-second interval, its published spec), the even eight-slice TWAP every execution tool ships, and trading at once

Same-input testevery arm walks the same rebuilt book at the same instants; 80 parents per size, buy and sell, $5k to $250k

Why not OWNEDLOST first, then TIED. The schedule the console printed — Almgren-Chriss in hourly children — cost 12.2bps with fees on a $100k parent against 6.9bps for Bitget's own 60-second TWAP, dearer on all 80 parents: on this book the cadence, not the shape, decides the cost. The same trajectory cut into one-minute children costs 6.9bps, a hundredth of a point from Bitget's TWAP (dearer on 54 of 80 parents), while its shortfall spreads 6% less (9.0 against 9.6bps standard deviation) — the trade-off Almgren-Chriss exists to make. The console now tells the trader to send one-minute children. One Saturday of one perpetual, taker children only, no impact beyond the visible book: the forward tape (market/ws_tape.py) and passive arms come next

Every condition and its evidence
  • same input comparison — every arm walks the same rebuilt book at the same instants; 80 parents per size, buy and sell, $5k to $250k
  • costs included — Bitget's 0.06% taker fee on every child
  • reproducibility proven — deterministic replay of a hash-recorded event file
  • failure cases documented — the console's hourly schedule lost to Bitget's TWAP on every parent
OWNED13 of 13 conditions

Where a shut stock should open: the perpetual-implied open, against gloaming and nocturne

Rivalangelraph/gloaming (Season 2, MIT): overnight fair value from index futures, BTC/ETH and the dollar, its own model functions run from its clone; egbujor-emmanuel/nocturne (Season 2, MIT): the weekend reference price,…

Same-input testevery candidate read at 09:00 New York from the same saved hourly bars and scored on the same Yahoo opens; nocturne's own rows with an ARGUS column

Measured

  • ARGUS better vs gloaming (gloaming_ols), its best variant on the stock's overnight gap: 30.36 against 81.28 (mean absolute error of the predicted close-to-open gap, bps), 113 nights, 95% interval of the difference [-60.72, -42.77]; better in every group
  • ARGUS better vs no gap (the last close) on the stock's overnight gap: the floor: 30.36 against 90.32 (mean absolute error of the predicted close-to-open gap, bps), 113 nights, 95% interval of the difference [-70.82, -50.61]
  • ARGUS better vs the stock's own pre-market price at 09:00 (the general tool) on the stock's overnight gap, read at 09:00 New York: 30.36 against 36.26 (mean absolute error of the predicted close-to-open gap, bps), 113 nights, 95% interval of the difference [-8.43, -3.8]
  • ARGUS better vs no gap (the last close), before pre-market on the stock's overnight gap, read at 03:30 New York: 62.59 against 90.32 (mean absolute error of the predicted close-to-open gap, bps), 113 nights, 95% interval of the difference [-36.24, -20.34]
  • ARGUS better vs nocturne's claim: the last regular close on the Monday open from Sunday 20:00 New York: 70.12 against 86.18 (mean absolute error of the predicted Friday-close-to-Monday-open gap, bps), 20 weekends, 95% interval of the difference [-32.74, -1.07]
  • not_separable vs nocturne's full fade (its best model) on the rToken's Monday 10:00 ET price from Sunday 19:00: 2.07 against 1.922 (mean absolute error of the Sunday-to-Monday return, pct), 7 weekends, 95% interval of the difference [-0.115, 0.548]
  • not_separable vs the Sunday rToken price (no change) on the rToken's Monday 10:00 ET price from Sunday 19:00: 2.07 against 2.117 (mean absolute error of the Sunday-to-Monday return, pct), 7 weekends, 95% interval of the difference [-0.174, 0.091]
python -m argus.eval.overnight_comparison
Every condition and its evidence
  • best implementation studied — the two S2 desks built for this question read in full: gloaming's engine/fairvalue and agent_loop (its futures input is a five-day change), nocturne's core.observations, study_v2 and fairvalue_v2
  • baseline reproduced — nocturne's published walk-forward reproduced exactly from its clone (large caps: current price 2.117%, full fade 1.922%)
  • same input comparison — every candidate read at 09:00 New York from the same saved hourly bars and scored on the same Yahoo opens; nocturne's own rows with an ARGUS column
  • statistically valid evaluation — paired error differences bootstrapped over nights, the shared unit
  • out of sample test — gloaming's OLS and ARGUS's fitted slope refit before each night on earlier nights only; rows before a stock's 11th night excluded for every candidate
  • ablation — the perpetual alone, against the close (basis left in), with a fitted slope; perpetual plus gloaming's futures was no better (31.0 vs 30.4bps, not separable) and is not shipped
  • failure cases documented — QQQ the narrowest lead (1.84bps, where gloaming's Nasdaq futures are nearly the same instrument); nocturne's own frame not separable; early closes read as 16:00
  • implementation complete — the console line, its record per stock, and the Yahoo close fallback
  • adversarial test — scored separately on the nights an estimator is most likely to fail: the largest tenth of gaps (91 stock-nights of at least 194 bps), where the lead over the stock's own pre-market widens; nights the perpetual's price did not move in the two hours before the read (2 rows, a price-identity proxy since the saved candles carry no volume, reported and too few to score); and earnings nights, an 8-K item 2.02 accepted by SEC EDGAR between the prior close and the read (14 rows, 8 nights, overnight_comparison.collect_earnings), not separable from the stock's own pre-market, -8.81bps [-26.14, 12.55] -- reported as the honest miss it is
  • costs included — scored as a trade, not a costless estimate (owner decision, Activity/28_CAPABILITY_CLOSE_PLAN_2.md §44), entered on the perpetual at the read: long when the estimate sits more than 12bps (Bitget's round-trip taker, cost.model.CostModel.bitget_perp().round_trip_bps()) above the perpetual's price, short when more than 12bps below, else stand aside; exit at the stock's regular open, net of the round trip. ARGUS +1.64bps a night (314/904 traded, 55.1% hit) against gloaming's best variant -12.84bps and a fade to the last close -9.97bps; ARGUS minus gloaming +14.48bps [10.57, 18.62] and minus the fade +11.61bps [8.12, 15.30] over 113 nights (data/overnight_comparison.json, costs_net)
  • reproducibility proven — the published general-tool block, including the earnings-night and stale-perpetual adversarial rows, and the published trade-arm block (costs_net) are each recomputed from the saved inputs and must equal the published artefact
  • best method studied — the after-hours price-discovery literature (Barclay & Hendershott 2003, "Price Discovery and Trading After Hours", Review of Financial Studies: after-hours quotes carry genuine price discovery rather than noise, the premise a continuously-traded proxy needs to be informative about the next regular open) and gloaming's own published method, its index-futures/crypto/FX blend, read at research/repos-rivals/gloaming/engine/fairvalue/config.py:41-45 (FAIRVALUE_WEIGHTS) and engine/fairvalue/model.py:20-39 (blended_fair_value_return), :65-98 (calibrate_weights's walk-forward OLS), both before this row's comparison was designed
  • no specialist capability superior — scoped to gloaming, nocturne and the stock's own free pre-market quote. Blue Ocean ATS, the paid 24-hour venue that quotes the stock itself while NYSE is shut, is named and not run -- outside this row's scope. What was run: the pre-market general tool at 09:00 New York (ARGUS 30.36bps against pre-market's 36.26bps, -5.90 [-8.43, -3.80] over 113 nights) and the perpetual alone at 03:30, before any pre-market (ARGUS 62.59bps against 90.32bps for the last close, -27.73 [-36.24, -20.34]); QQQ is named as the one stock where the lead over gloaming is narrow and, on the trade arm, not statistically separable, because gloaming's Nasdaq futures proxy is nearly the same instrument
TIED4 of 13 conditions

Exit cost from the displayed book, vs. EGRESS's walk

RivalRitapossible/Egress egress/exitcost.py quote, run from its clone on the same 1,104 recorded Bitget order books (data/book_tape.jsonl) at $10,000 and $100,000

Same-input testboth on the same 1,104 books, the same two sizes, a sell of each

Why not OWNEDTIED by construction, and measured: the same method. Slippage differs by a median 0.002 bps at $10,000 and 0.005 bps at $100,000 (largest 0.15 bps, from EGRESS walking a quantity fixed at the mid where ARGUS walks the notional), and both find the book too thin on the same 92 of 1,104 snapshots at $100,000.

Every condition and its evidence
  • best implementation studied — egress/exitcost.py read at source: walk, quote (mid reference, exhausted book reported, no extrapolation), sliced (full and no replenishment as bounds)
  • baseline reproduced — EGRESS's quote imported from its clone and run unmodified on every recorded book
  • same input comparison — both on the same 1,104 books, the same two sizes, a sell of each
  • reproducibility proven — python -m argus.eval.exitcost_parity regenerates the artefact from the tape

Judged: data sources and Skill integration

LOST11 of 13 conditions

Perception layer: what the desk can see

RivalOpenBB-finance/OpenBB provider set; TauricResearch/TradingAgents feed list

ScopeNot the same claim as the OWNED workbench row below: this one counts what the trading desk's model reads each cycle (6.2 data categories a symbol against OpenBB's 12.4), and it is LOST. The workbench a person asks questions of reads more, and is measured on its own row.

Same-input testboth real systems run on the identical failure shape — a core-equivalent source with every path broken, and an optional-equivalent source with its one path broken — TradingAgents raises on the former, ARGUS returns cleanly on both

Why not OWNEDRE-GRADED 2026-09-29 from IMPLEMENTED to LOST (Activity/28_CAPABILITY_CLOSE_PLAN_2.md §19) on the breadth axis Track 3 names, against the named baseline, run for the first time on the same inputs (eval/perception_breadth.py, data/perception_breadth.json). Every keyless OpenBB provider (cboe, finra, finviz, sec, tmx, yfinance answering; stockgrid, seeking_alpha and wsj installed but not answering per symbol) was called through OpenBB's own interface for the same underlyings on 2026-09-28, beside ARGUS's last live cycle that day. Counted as data categories that returned data, OpenBB answered 12.4 per symbol and ARGUS's desk received 6.2, and OpenBB is ahead on 10 of 10 symbols. OpenBB has options chains, dark-pool volume, analyst price targets, ownership, dividends and company profiles that the desk never receives; ARGUS has social text (X and Reddit) that OpenBB's keyless set does not.…

python -m argus.eval.feedlist_comparison
Every condition and its evidence
  • best implementation studied — every free source OpenBB and TradingAgents use, counted and probed live
  • best method studied — both real dispatch designs read side by side: TradingAgents' route_to_vendor() (vendor-chain fallback, raise-vs-degrade split by named category) and ARGUS's gather() (per-source try/except, always a status line, never a raise) — the actual mechanism each uses when a live source fails
  • baseline reproduced — TradingAgents' real route_to_vendor() executed via the vendored file through a sys.modules shim, zero source edits, commit be952b8eccb49720509af544c6675233bc1f10d0
  • implementation complete — 13 distinct sources reached the panel on a live cycle; Treasury curve at credibility 1.0, CBOE VIX at 0.9, crypto risk appetite at 0.35
  • same input comparison — both real systems run on the identical failure shape — a core-equivalent source with every path broken, and an optional-equivalent source with its one path broken — TradingAgents raises on the former, ARGUS returns cleanly on both
  • statistically valid evaluation — every one of TradingAgents' own real category/method pairs swept, not just the two hand-picked cases: every core category raises when fully broken, every optional category never does — both confirmed by running the real route_to_vendor() on all of them, not a sample
  • costs included — dispatch overhead measured, not estimated: TradingAgents' route_to_vendor() 22.9us/call, ARGUS's gather() 2.9us/call — both exclude the network leg itself by design, so this is pure dispatch cost. First persisted to an artefact 2026-09-21; previously cited the module's own source only
  • out of sample test — checked against the REAL, live-growing desk-notes log this project's actual decision cycles wrote — 194 real cycles, 5 distinct sources seen, confirming the synthetic-fixture status-line shape this comparison exercises is the same shape real production cycles produce
  • ablation — two ablations: (1) the deterministic panel components replayed over 11 live frames — analyst selection changes the panel on every one, the as-of gate on none; (2) gather()'s caught-exception tuple shown load-bearing by running an UNcaught type (ValueError) through it and confirming it propagates rather than being silently swallowed like the real OSError/TimeoutError cases are
  • adversarial test — the SEC agent string is pinned by test after breaking twice: www.sec.gov 403s a bare agent while data.sec.gov accepts it, so the CIK lookup failed while the submissions feed kept answering; separately, a genuine structural finding from running both real systems: TradingAgents' route_to_vendor() raises — can abort the whole perception cycle — when every configured vendor for a core category fails with a real error; ARGUS's gather() never raises for any source's failure, core or opt-in, confirmed by running a source that fails on every call
  • failure cases documented — every tool that does not answer is named, with the service's own error text attached: 13 of 19 are recorded down across three separated attempts, carrying envelopes like `Error executing tool cross_asset` and an explicit upstream ConnectTimeout. Repointed from the single-sweep artefact on 2026-09-21: that file recorded 6 ok / 10 empty / 3 tool_error one day and 6 ok / 13 timeout the next, from the same code against the same endpoint, so it could not distinguish a dead tool from an unlucky call. Repeating the measurement produced a failure set that is stable rather than whichever error happened to occur: 6 of 19 answer three for three, all of them technical analysis. (An earlier run read 9, counting three tools that return only an upstream error envelope as answers; the classifier was corrected 2026-09-26.) The feed-list comparison's SCOPE_STATEMENT still states what is NOT claimed: not that TradingAgents' raise-on-core-failure design is a defect, only that ARGUS's own design cannot be aborted by one live source the same way
  • reproducibility proven — the same synthetic failure scenario run twice, both real systems, produces an identical result each time — confirmed by direct equality check, not assumed from either design being stateless
  • no specialist capability superior — scoped precisely to what was tested: on the property of whether a single live source's failure can abort a full perception cycle, ARGUS's real code cannot and TradingAgents' real code can (for a core category with zero working vendors) — not claimed as a blanket superiority; the source-count comparison stays with best_implementation_studied's own artefact
OWNED13 of 13 conditions

Research workbench data breadth vs. OpenBB's keyless providers

RivalOpenBB-finance/OpenBB (commit 3e071fcc) with every keyless provider installed (cboe, finra, finviz, sec, tmx, yfinance, stockgrid, seeking_alpha, wsj), called through OpenBB's own obb interface by…

ScopeNot the same claim as the LOST perception row: this one counts what the research workbench cites per stock (about 16 categories against OpenBB's keyless 12.4); the trading desk's own feed is narrower, and that loss stands on its row.

Same-input testthe same underlyings, the same day, the same category mapping, for OpenBB, the desk and the workbench, on both days

python -m argus.eval.perception_breadth
Every condition and its evidence
  • best implementation studied — OpenBB's provider packages read for their credential requirements and per-symbol endpoints, and every keyless one installed from the clone and run through its own interface
  • best method studied — breadth counted as categories answered with data per symbol, one taxonomy applied to both sides with every mapping in the artefact; a count of endpoints or calls was rejected because it rewards redundant endpoints (OpenBB serves price history from four), and a count of categories attempted because it credits calls that returned nothing
  • baseline reproduced — OpenBB's keyless providers run live on the same twelve tickers on two days, each call with its row count, latency and error; the providers that answered and those that stayed silent are summarised in the comparison's baseline block
  • implementation complete — every category the workbench is credited with is read live by a research answer a person can ask in the console: options, dark pools and short volume (positioning.py), holders, profile, dividends, fund holdings and filings (fundamentals.py), crowd posts, the venue's perpetuals and prediction markets
  • same input comparison — the same underlyings, the same day, the same category mapping, for OpenBB, the desk and the workbench, on both days
  • statistically valid evaluation — bootstrap intervals over the per-symbol differences, pooled over both days and broken down by symbol and day by the groupwise audit: every category +3.6 [3.1, 4.1], rival-reachable categories only [0.7, 1.5], neither flipping between the days
  • costs included — both sides keyless, no model called by either; wall-clock seconds per symbol as each side's runner timed them: OpenBB 116 and 128 summed over its calls, the workbench 13 and 13 over its six answers
  • out of sample test — a second day read after the comparison was built, twelve underlyings, nothing refitted: +3.7 on every category and +1.2 on rival-reachable ones (held_out)
  • ablation — the lead recomputed without each workbench source in turn (ablation.without): Bitget's data service carries 4.7 categories, FINRA 2.0 and Yahoo 1.9, no other source more than one
  • adversarial test — the comparison rescored with every category OpenBB has no keyless endpoint for removed, so the lead cannot rest on what the rival never attempts (adversarial)
  • failure cases documented — the categories OpenBB answers and the workbench does not are listed per symbol (only_openbb_vs_workbench, only_openbb), and the keyed providers excluded from the baseline are named
  • reproducibility proven — the report is recomputed from the saved raw runs of both days and must equal the published one
  • no specialist capability superior — scoped to keyless providers; OpenBB with paid keys is wider and its twelve keyed providers are named; the two categories OpenBB alone answered on the held-out day (QQQ's consensus from TMX, SQQQ's ETF composition) are listed as failure cases

Judged: LUI fluency

TIED5 of 13 conditions

LUI intent routing, measured against Rasa's real DIET classifier

RivalRasaHQ/rasa 3.6.21 (Apache-2.0), DIET classifier, default pipeline config

Same-input testboth systems scored on the identical 293-row sealed split and the identical 14 out-of-scope probes;

Why not OWNEDno_specialist_capability_superior is a genuine TIE on the headline metric, not a PASS: Rasa's DIET classifier still scores higher on raw sealed accuracy (81.91% vs ARGUS's 79.52%, 240/293 vs 233/293) — the gap did not close to zero, it closed from clearly-significant (p=0.0014) to comfortably-not-significant (p=0.2649, well clear of this project's p<0.05 bar, not sitting near it). That is 'not proven to be a loss', which is a weaker and more honest claim than 'proven equal' — but unlike the SVM-only rebuild's p=0.0576 (close enough to 0.05 that a handful of different discordant predictions could have flipped the call), this margin is no longer fragile in that specific sense.

Every condition and its evidence
  • best implementation studied — RasaHQ/rasa chosen because bounded-domain conversational intent understanding is its primary purpose, not a framework with chat bolted on; it is the OSS NLU engine the benchmarking literature treats as a baseline, and DIET has a published paper (Bunk et al., arXiv 2004.09936). ConvLab-3 rejected for granularity (a full TOD pipeline, NLU is one swappable module); snips-nlu rejected as unmaintained since Jan 2020 despite correct granularity, per the standing rule to take the harder candidate. No finance-specific permissively-licensed conversational NLU system was found to exist — only datasets (BANKING77, CLINC150).
  • baseline reproduced — Rasa trained once, 2026-09-21, on ARGUS's own training_rows() as it stood that day (334 rows, all 9 labels incl. out_of_scope) and scored on the identical sealed split; reproduced independently from the vendored predictions before this module existed (217/251/293 argus, 240/291/293 rasa, matching to 4 decimal places). Rasa's side is a fixed, dated snapshot (`rasa_diet_sealed_predictions.json`'s own `trained_and_scored` field) and is not retrained when ARGUS's training data changes — by design, per same_input_comparison below; the 314-row count after the 2026-09-22 OOS-rebalancing rebuild describes ARGUS's live side only, not this baseline.
  • same input comparison — both systems scored on the identical 293-row sealed split and the identical 14 out-of-scope probes; ARGUS's side runs live through the exact console function (classify_with_fallback), never vendored — so the 2026-09-22 classifier-head rebuild changed this comparison's result automatically, on the next run, with no change to the comparison module itself
  • statistically valid evaluation — McNemar's exact test (Dietterich 1998) on paired predictions, re-run after the 2026-09-22 OOS-rebalancing rebuild: sealed accuracy p=0.2649 (11 argus-only vs 18 rasa-only correct) — comfortably not significant, down from the SVM-only rebuild's already-not-significant p=0.0576, and from p=0.0014 before either rebuild. Out-of-scope p=0.0156 (7 argus-only vs 0 rasa-only declined) — unchanged and still significant.
  • ablation — ARGUS's abstention threshold removed entirely (raw top-1 from probabilities(), no suppression): accuracy rises to 82.25% (241/293) — fractionally ABOVE Rasa's 81.91% (240/293). Not claimed as a win: this is a different, unsafe configuration (no refusal at all), not the deployed one, and is reported to show the remaining gap is now caution rather than capability, not to launder it into a headline number.
  • failure cases documented — Rasa's 8 out-of-scope leaks named with routed intent and confidence (e.g. 'who won the world cup' -> performance at confidence 1.0, saturated — no threshold would rescue it); ARGUS's 1 remaining leak ('sing me a song') is a strict subset of Rasa's 8, unchanged by the OOS-rebalancing rebuild — that rebuild targets in-scope questions wrongly refused, a different failure direction from genuinely-OOS questions wrongly answered, and the two do not move together

**2026-09-22, two rebuilds this date.** First, the classifier head: dev-half 5-fold CV (10 fold-split seeds) found `LinearSVC(C=5.0, class_weight='balanced')` beats the multinomial logistic head this shipped with on every seed (mean 76.71% vs 72.28%); a calibrated variant (`CalibratedClassifierCV`) also won but less (75.36%) and needs k-fold machinery the plain margin does not. `lui/ngram.py`'s pure-Python scorer needed zero code changes — it was already generic linear-scores-then-softmax. The abstention threshold was re-derived by the same rule that set the old 0.20 (lowest threshold beating the pattern layer on both axes in out-of-fold CV), landing at 0.15. Word-level TF-IDF features stacked onto the character n-grams were tried and hurt (73.35% to 66.77%/66.16% on dev CV) — a real, tested, negative finding, not silently dropped. Second, same date, the RIVAL LENS pass: out-of-scope training-set language balance (see the blockers entry above for the full evidence) — the first rebuild's own root-cause note had named this lever and left it untried; this pass tried it, on dev-CV evidence only, then spent the one legitimate sealed-read to confirm 77.82% to 79.52% for real. Latency and deployability were measured once, before either rebuild (ARGUS ~66x faster median response, ~375x faster cold start, a stdlib-only bundle vs Rasa's 1.9GB TensorFlow venv needing Python<=3.10), reported as an unreproduced finding from the agent that ran the original comparison rather than re-measured inside eval/lui_comparison.py, so no Proof above cites them.

Open Theme: portfolio tools

TIED6 of 13 conditions

Portfolio allocation, measured against Riskfolio-Lib's NCO

Rivaldcajasn/Riskfolio-Lib 7.3.0 (BSD-3), NCO (Nested Clustered Optimization); cvxportfolio 1.5.1 (GPL-3.0) checked separately for the convex-rebalance path

Same-input testall twelve allocators (including ARGUS's own NCO, added 2026-09-22) run on the SAME 60-day hourly Bitget candle history for the SAME 12-symbol rToken universe and the SAME sample covariance

Why not OWNEDBake-off, 2026-09-26 (eval/nco_bakeoff.py, data/nco_bakeoff.json; every stage ran, López de Prado's own optPort_nco unmodified in an environment pinned to pandas 2.2.3, which his code needs). Each family — ARGUS, Riskfolio, skfolio — picked its configuration on the selection half. On the 20 held-out windows ARGUS's pick (sample minimum variance) beats Riskfolio's single-linkage NCO and ties Riskfolio's minimum variance and both skfolio NCO variants: overall TIE. Monte Carlo, 120 draws each: on de Prado's block-diagonal process every NCO has lower true-variance excess than minimum variance (ARGUS's pick worse in 110 of 120 against ARGUS's own NCO), and his snippet 7.9 reproduces (NCO lowers weight RMSE against Markowitz in 100 of 120); on a process calibrated to the real book, Gaussian and Student-t(4), the order reverses — minimum variance beats every NCO in 88 to 120 of 120 draws, and…

Every condition and its evidence
  • best implementation studied — fixed 2026-09-22, two real gaps closed in sequence. First: desk/allocation.py:optimal_leaf_order implements the Bar-Joseph/Gifford/Jaakkola (2001) DP, the same algorithm scipy's real optimal_leaf_ordering implements and Riskfolio calls by default (verified against real live scipy, 200 random trees plus the real 12-symbol book); hrp_weights now reproduces Riskfolio's shipped-default HRP to floating-point identity (~2.9e-16) — but this closed only the ARGUS-vs-Riskfolio-HRP gap, not the walk-forward loss to NCO, which was the actual open question. Second: read Riskfolio's real NCO source in full (HCPortfolio.py's _intra_weights/_inter_weights/_opt_w) and built ARGUS's own desk/allocation.py:nco_weights — real Ward linkage (scipy's Lance-Williams recurrence, verified against real live scipy, 200 random trees), a real active-set long-only minimum-variance QP (verified against Riskfolio's real cvxpy solver, 100 random trials), and the real two-difference gap statistic for cluster count. Reproduces Riskfolio's real NCO to within 1.3e-05 max weight difference on the real book
  • same input comparison — all twelve allocators (including ARGUS's own NCO, added 2026-09-22) run on the SAME 60-day hourly Bitget candle history for the SAME 12-symbol rToken universe and the SAME sample covariance
  • statistically valid evaluation — paired sign test per allocator vs ARGUS's own HRP, Holm correction across every comparison; ARGUS's own NCO is compared against Riskfolio's real NCO as a null control (parity, like the HRP parity-twin check), not scored with a significance test against it, because the claim is a tie, and a sign test has nothing to say about one. Since 2026-09-26 also the bake-off's per-window held-out volatilities for every pick: exact sign test, Wilcoxon signed-rank, stationary-bootstrap 95% interval, Holm across the family
  • costs included — argus_hrp_seconds≈0.000706 vs riskfolio_hrp_seconds≈0.0423 vs cvxportfolio_mpo_seconds_one_solve≈2.589 — ARGUS's HRP still ~60x faster than Riskfolio's own; ARGUS's own nco_weights is pure Python against Riskfolio's real cvxpy-backed solver, timed but not yet the decisive number here, since the walk-forward result is a tie on quality, not a cost trade
  • adversarial test — added 2026-09-22: 20 near-singular covariance matrices (a real asset cloned at noise levels from exact duplication to merely ill-conditioned), run against ARGUS's real nco_weights and Riskfolio's real NCO. Riskfolio's real NCO refuses/crashes 0/20 times — it proceeds on every input, including exact duplicates — while flagging internally ('you must convert self.cov to a positive definite matrix' / a LinAlgWarning on a singular matrix) on all 20/20 trials it still answers. ARGUS's own nco_weights refuses cleanly (AllocationError) on 16/20 — the genuinely singular ones. On the 4/20 where both succeeded, weights diverge meaningfully (mean 8.5pp, worst 16.9pp max difference) — expected on an ill-posed problem with two different solvers, not a correctness defect on either side. NOT claimed as an accuracy win: there is no ground truth for a near-singular minimum-variance problem, only a measured, reproducible difference in whether each side proceeds and whether proceeding is honest about the covariance being untrustworthy
  • out of sample test — the bake-off's held-out half: each family picked its configuration on the selection windows, then all picks were scored on 20 held-out windows none of them saw (ARGUS's pick beats Riskfolio's single-linkage NCO, ties the rest). The earlier live walk-forward (data/allocation_comparison.json: ARGUS's NCO and Riskfolio's both 8.203bps, ratio 1.0000) kept only per-allocator means, so it is not the evidence cited here
  • failure cases documented — two_assets_below_min, duplicated_column and zero_variance_column all handled and reported rather than raising; Riskfolio's HERC/HERC2 raise TypeError on every call in this harness, run via a documented shim, disclosed rather than silently patched over
  • reproducibility proven — reproducibility.identical=true across repeated runs on the same fetch

Published because `data/allocation_comparison.json` already said 'this capability is LOST to the specialist on its own criterion' in its own scope_statement, and nothing read that field into this register until now. Updated twice on 2026-09-22: first, optimal leaf ordering closed the HRP-vs-HRP gap to floating-point identity but left the NCO loss essentially unchanged — a real, tested, negative answer to an explicitly open question. Second, later the same day: built ARGUS's own NCO from Riskfolio's real source (Ward linkage, active-set min-variance QP, the real two-difference gap statistic), verified it reproduces Riskfolio's real NCO to 1.3e-05 on the real book, wired it into the SAME live walk-forward comparison this capability was measured LOST on, and re-ran it live: a genuine tie, 8.203bps both, ratio 1.0000. LOST -> TIED, on a freshly-run comparison, not a reinterpretation of the old one. Third update, also 2026-09-22, after the regime-boundary-detection and LUI capabilities were each closed the same day: this capability's own adversarial_test condition was still unproven, and `run_failure_cases` — the existing degenerate-input harness — only ever exercised HRP, which cannot fail this way (recursive bisection never inverts a matrix). Built `run_adversarial_covariance` (20 near-singular covariance matrices, real assets cloned at noise levels from exact duplication to merely ill-conditioned), run against ARGUS's real nco_weights and Riskfolio's real NCO for the first time. Closes the condition honestly: real, systematic, reproducible evidence of a genuine failure-mode difference (Riskfolio never refuses and flags trouble every time it proceeds anyway; ARGUS refuses cleanly on the genuinely singular cases) — reported as exactly that, not inflated into a claim that ARGUS's weights are more correct, since there is no ground truth for a near-singular allocation problem to check either side against.

TIED6 of 13 conditions

Portfolio copilot: post-trade beta and co-movement vs. weekend-copilot (S2)

RivalPhiBao/weekend-copilot @461ad820 (MIT)

Same-input testboth answer the same 1,800 books and proposed adds at the same origins; both are scored on Bitget daily, native daily and open-session hourly targets

Why not OWNEDTIED on the pre-registered primary: ARGUS's post-trade beta misses the realised Bitget daily beta by 0.241 on average against 0.360 for weekend-copilot's method on the same benchmark, better on 7 of 9 origins, but p = 0.098 — not significant. Against weekend-copilot as it ships (beta against SPY) ARGUS wins significantly (0.241 against 0.554, 8 of 9 origins, p = 0.012), and it names the holding the new position will move with most 42% of the time against 35% (chance 26%). Two losses are published with it: ARGUS does not beat calling every beta 1.0 significantly (0.241 against 0.298, p = 0.20), and its open-session beta forecasts no better than its blended one. Factor attribution and the conversational copilot are not yet compared (rival review of 2026-09-24: skfolio with toraniko factors, Wealthfolio); stress and hedge are the two rows below

Every condition and its evidence
  • best implementation studied — weekend-copilot's delta.ts, stats.ts, stress.ts, hedge.ts and critic.ts read at source; chosen by the rival review of 2026-09-24 as the S2 entry to beat on this sub-theme
  • baseline reproduced — the port reproduces the beta before, beta after and max correlation its own engine printed for all three of its preset books (max difference 7e-18)
  • same input comparison — both answer the same 1,800 books and proposed adds at the same origins; both are scored on Bitget daily, native daily and open-session hourly targets
  • statistically valid evaluation — exact Wilcoxon signed-rank over per-origin mean errors; books inside one origin share a market path and are averaged before testing
  • out of sample test — every prediction uses data before its origin; every target is the 28 days after it
  • failure cases documented — not significantly better than beta = 1.0; open-session beta no better than blended at forecasting
  • reproducibility proven — hash-pinned Bitget snapshot, hash-recorded rival data, fixed seed and pre-registered spec hash
  • implementation complete — the console's own copilot() produced every ARGUS figure
TIED6 of 13 conditions

Portfolio stress: the book's move when QQQ falls, vs. skfolio's vine copula and Entropy Pooling

Rivalskfolio/skfolio 1.3.1 (BSD-3) VineCopula conditional sampling and EntropyPooling, run unmodified in their own interpreter on the same Bitget daily history

Same-input testevery arm gets the same realised QQQUSDT move and the same traded-day history on 39 days with QQQUSDT down 1% or more, 200 books each

Why not OWNEDTIED on the pre-registered primary: ARGUS's beta stress misses the book's realised move by 0.92 percentage points on average against 1.00 for skfolio's vine and 0.98 for Entropy Pooling, better on 25 of 39 days, p = 0.095 — not significant. LOST on the tail: ARGUS states a point and no downside, so skfolio's vine wins the 10% quantile (pinball 0.23 against 0.43 for ARGUS's point). A residual band added after that run (not pre-registered) scores 0.24, still behind the vine, and breaches 15.5% of the time against a 10% target. Entropy Pooling could not answer the one shock larger than anything in its history (2026-06-05). Absorbed from skfolio the same day: each position's share of the book's CVaR (historical, 95%), now in every add-to-book answer beside its share of variance, matching skfolio's own contribution(CVaR) to 3e-13 on 20 books (data/tail_contribution_oracle.json)

Every condition and its evidence
  • best implementation studied — skfolio's _vine_copula.py:518-595 and _entropy_pooling.py:436-590 read at source; named by the rival review of 2026-09-24 as the method rival for conditional stress
  • best method studied — regular-vine conditional sampling (Dissmann et al. 2013) and Entropy Pooling (Meucci 2008), the two conditional-scenario methods skfolio ships
  • same input comparison — every arm gets the same realised QQQUSDT move and the same traded-day history on 39 days with QQQUSDT down 1% or more, 200 books each
  • statistically valid evaluation — Wilcoxon signed-rank over per-day mean errors; a day a system cannot answer is dropped from that pair only
  • out of sample test — every fit uses only days before the scored day
  • failure cases documented — stale weekend closes broke the first run and are removed for every arm; Entropy Pooling cannot answer a shock beyond its history
  • reproducibility proven — hash-pinned Bitget snapshot, seeded vine, pre-registered spec hash
  • implementation complete — the console's own stress_by_beta produced every ARGUS figure
TIED6 of 13 conditions

Overnight hedge for an rToken holder vs. Ballast (S2)

RivalRitapossible/Ballast @5cf6759 (MIT)

Same-input testboth scored on Ballast's own per-night series, 11 names, its 70/30 split

Why not OWNEDTIED, and parity is the ceiling: ARGUS's console and Ballast fit the same slope, so on Ballast's held-out nights both remove 99.7% of an rToken holder's overnight variance (median of 11 names, largest per-name gap 0.0). The first run of this comparison, the same day, was a clean LOSS and is kept on the record: ARGUS modelled Bitget's stock perpetuals and not the spot rTokens, so the best hedge it could offer an RTSLAUSDT holder was its QQQUSDT index leg, which removed 10.1% and lost on all 11 names (p = 0.001). market/rtoken_spot.py (Ballast's pairing rule, calendar and overnight return, MIT, reproducing its nights to 0.0) and desk/rtoken_hedge.py were built from that loss

Every condition and its evidence
  • best implementation studied — Ballast's universe.py, overnight.py, stats.py, costs.py, research/hedge_study.py and oos.py read at source
  • baseline reproduced — hedge_study.py and oos.py run unmodified; every README figure checked matched
  • same input comparison — both scored on Ballast's own per-night series, 11 names, its 70/30 split
  • out of sample test — ratios fitted on the first 70% of nights, never refitted
  • failure cases documented — the first run was a clean loss (index hedge 10.1% against 99.7%), published before the rebuild
  • implementation complete — the console's own overnight_hedge produced ARGUS's figures
TIED4 of 13 conditions

A book under a trader's own limits (caps, groups, number of names) vs. skfolio MeanRisk

Rivalskfolio 1.3.1 (BSD-3) MeanRisk, minimum variance, with its linear_constraints, cardinality and group_cardinalities, solved by CLARABEL and, for the count limits, by SCIP as its own docstring recommends; same covariance…

Same-input testboth solve the same six limit sets on one covariance built from the same 4,280 hourly returns; each result is graded by recomputing every limit from its weights

Why not OWNEDTIED on five of six scenarios (no limits, a 15% cap, group limits, a relative limit, at most four names): annual volatility equal within 1e-6. Lower on the sixth (one name per group, at most five): 14.784% against 14.795%, and 0.07 s against 0.27 s. With its default solver skfolio raises on both count-limited scenarios. The per-name risk-share cap has no skfolio equivalent and is recorded as not run. No out-of-sample test: this compares how well each solves one stated problem, not how the books then perform.

python -m argus.eval.constrained_comparison
Every condition and its evidence
  • best implementation studied — skfolio optimization/convex/_base.py:340-379, 597-598, 971-1020, 1042-1088 and utils/equations.py:48-130, 557-771 read at source (research/harvest/46-cvxpy-allocation.md)
  • same input comparison — both solve the same six limit sets on one covariance built from the same 4,280 hourly returns; each result is graded by recomputing every limit from its weights
  • reproducibility proven — the input snapshot's digest is recorded, and the library versions each run used
  • implementation complete — desk/constrained.py, reached from the console's portfolio-building answer

Track 2

Not entered with ARGUS: these are the desk's own engines — the decision-maker, the risk layer, the explanations — measured against Track 2's sub-themes because the workbench stands on them.

Event-Driven Agent

TIED13 of 13 conditions — against a rival that does not lead the sub-theme

Clustering-corrected, base-rate-honest event significance vs. a fixed-null test

Rivalwhale-signals real fixed-null hit-rate test (compute_hit_rates/compute_base_rate)

Same-input testboth real systems scored on the same real, live Bitget ETHUSDT/BTCUSDT hourly candle history, with placebo whale-event timestamps drawn from the same real series, carrying zero true informational edge by construction — the real 24h base rate (measured live, whale-signals' own real function) departs from 50%, and the…

Why not OWNEDRE-GRADED 2026-09-28 from IMPLEMENTED to TIED (Activity/27_CAPABILITY_CLOSE_PLAN.md §1), after fixing a defect the comparison had hidden: ARGUS's Corrado rank test ranked tied returns by position, so on tokenised equities' flat off-hours bars it rejected 63.5% of placebo draws at 5% (tracker 242). Ties now share their average rank; re-run on the same panel (data/eventdriven_rivals.json) its size is 0.5-6.5% across the seven null shapes. The trade-off that remains is real and both sides are published: under clustered nulls ARGUS's four-test verdict rejects 0-3% where Vibe-Trading's Cowan sign test rejects 11-18%, but on size-adjusted power Vibe's test detects more (clustered_9, 50bps: 0.81 against 0.58; 100bps: 1.00 against 0.67). On the real event stream both abstain. Neither dominates; winning needs a verdict that keeps ARGUS's size and reaches Vibe's power.

python -m argus.eval.eventdriven_comparison
Every condition and its evidence
  • best implementation studied — whale-signals' real src/analysis/event_study.py read in full — compute_event_returns/compute_hit_rates/compute_conditioned_hit_rates/compute_base_rate/walk_forward_by_year — confirming compute_hit_rates is the real significance layer (a scipy.stats.binomtest against a fixed 50% null) and that compute_base_rate, defined in the SAME real file, is never passed into it; ARGUS's own existing research/eventstudy.py (Patell/BMP/Corrado-rank/generalised-sign, Kolari-Pynnonen clustering correction, already teardown-compared against research/architecture/eventedge.md) read again specifically for this comparison
  • best method studied — two real methods compared: whale-signals' real raw forward-return hit rate tested against a FIXED 50% null, no market-model adjustment, no clustering correction anywhere in the file (confirmed by exhaustive grep) vs. ARGUS's real market-model abnormal-return test (asset regressed on a real market proxy) with four independent significance tests and a real, measured cross-sectional clustering deflation applied to every parametric one
  • baseline reproduced — whale-signals' real compute_hit_rates/compute_base_rate run unmodified, byte-hash-pinned against the vendored source (commit 6be10a598c9319aa6b64bf517618eac2dd2ec2f5)
  • implementation complete — run_base_rate_case/run_false_positive_sweep/run_null_ablation evaluate real ARGUS-fetched ETHUSDT/BTCUSDT candle history end to end through both real systems
  • same input comparison — both real systems scored on the same real, live Bitget ETHUSDT/BTCUSDT hourly candle history, with placebo whale-event timestamps drawn from the same real series, carrying zero true informational edge by construction — the real 24h base rate (measured live, whale-signals' own real function) departs from 50%, and the two real significance tests reach independent, sometimes opposite, verdicts on the identical placebo draw
  • statistically valid evaluation — swept across many independent placebo draws (not one convenient case): whale-signals' real fixed-null test calls a false-positive rate far above the nominal 5% significant 'smart money' on genuinely uninformed events, while ARGUS's four-test full-agreement rate stays near or below nominal on the identical draws
  • costs included — real wall-clock cost measured on both real sides on the same real data — whale-signals' single binomial test vs. ARGUS's real market-model fit plus four statistical tests and a real O(n^2) cross-sectional clustering correlation, both numbers reported plainly with the reason for the gap stated rather than hidden
  • out of sample test — the false-positive-rate sweep is itself the out-of-sample evidence: each of the swept placebo draws is an independent real sample never used to design the comparison's mechanism, and the elevated whale-signals rate holds across all of them, not just the single hand-picked design case
  • ablation — a real, run ablation re-tests the SAME real placebo hit counts against a sweep of assumed null probabilities (0.50, 0.55, the real measured base rate, 0.60) using the same real scipy.stats.binomtest whale-signals' own code calls internally — testing at the real measured rate produces a materially lower false-positive rate than testing at the fixed 0.50 whale-signals actually uses, isolating the wrong fixed null as the actual mechanism rather than assuming it (the stricter claim that the true rate is the exact minimum among every swept candidate was tried first and found, by running it repeatedly, not to hold reliably against real serial-correlation variance in the overlapping return windows — the directional claim does)
  • adversarial test — the real 30-event minimum threshold whale-signals' own code hardcodes tested on both sides of the boundary (29 vs. 30) — at 29 the real function silently skips the category (printed, no exception); at 30 it is computed
  • failure cases documented — two real, measured silent-behaviour shapes found by running whale-signals' real code, not assumed: a category below the real n=30 minimum is silently skipped rather than flagged, and an all-False condition mask silently returns exactly 0.5 — a real 'no data' state masquerading as 'base rate is exactly random'
  • reproducibility proven — the real base-rate comparison run twice on the same seed produces byte-identical JSON output
  • no specialist capability superior — scoped explicitly — SCOPE_STATEMENT in eval/eventdriven_comparison.py. Claimed: on significance-testing methodology for event-driven hit-rate claims, ARGUS's existing clustering-corrected, non-fixed-null machinery does not share the measured false-positive inflation whale-signals' real fixed-null test shows on real market data. NOT claimed whale-signals' raw arithmetic is wrong, or that the two systems measure the same effect — a raw hit-rate test and a market-relative abnormal-return test can and do disagree in either direction on identical input. NOT claimed whale-signals' own real, published 646,442-transaction results were reproduced — the real Dune dataset needs a paid API key this project does not have; their real significance-testing CODE was run instead, on ARGUS's own real candle history with constructed placebo events

Market Sentiment Agent

TIED13 of 13 conditions — against a rival that does not lead the sub-theme

Sentiment integrity: resistance to coordinated posting, vs. finBERT

RivalProsusAI/finBERT for classification; BloombergGPT and FinMA for the published bar

Same-input testboth real systems run on identical symbol-matched coordinated-posting scenarios (N near-identical rephrasings of one unsourced claim) built from the same underlying narrative

Why not OWNEDRE-GRADED 2026-09-29 from IMPLEMENTED to TIED, on REAL posts (eval/sentiment_integrity_real.py, data/sentiment_integrity_real.json). Source: Track 2 run 1's own published ledger (t2-sentiment-agent/public/ledger.jsonl (the Track 2 run 1 repository), read-only), whose own mechanical novelty screen (the same rule as truth/novelty.Cluster.coordinated) flagged 35 of 3,948 real story clusters coordinated over four real trading days (2026-09-24 to 09-27); no model labelled anything. Every one of the 35 was matched to one real uncoordinated control cluster on the same day and a shared symbol (all 35 matched on the first, strictest rule). Real X/Reddit post text was re-fetched live by id through twitter-cli and rdt-cli (371 of 372 posts; one deleted or unreachable), and on each of the 70 real clusters one lone (earliest) post was compared against the real, capped burst (<=10 posts), for three…

python -m argus.eval.sentiment_comparison
Every condition and its evidence
  • best implementation studied — FinBERT, BloombergGPT, FinMA, FinMem and TradingAgents read for the feed
  • best method studied — SentimentAnalyst's own docstring names the real axis: not classification accuracy (explicitly disclaimed — 'FinBERT is the baseline and beating it on classification is not where the edge is'), but the source-independence integrity layer finBERT's architecture has no equivalent of at all — a classifier with zero source-identity concept cannot discount coordinated repetition, by construction, not by omission
  • baseline reproduced — the REAL, published ProsusAI/finbert model loaded via the standard transformers.pipeline() API and run on every scenario — not a vendored copy (no source file to vendor; a public inference model, used exactly as its own README documents, nothing redistributed)
  • implementation complete — SentimentAnalyst's real role prompt exercised end to end via a real Qwen call, not paraphrased or mocked
  • same input comparison — both real systems run on identical symbol-matched coordinated-posting scenarios (N near-identical rephrasings of one unsourced claim) built from the same underlying narrative
  • statistically valid evaluation — 35 REAL coordinated story clusters (Track 2 run 1's own published ledger, mechanically flagged, no model judgement) and 35 matched real uncoordinated controls, one lone post vs. the real capped burst on each: ARGUS resisted 35 of 35 coordinated clusters against the fair rival (dedup, then finBERT) at 31 of 35 (4 discordant, all favouring ARGUS, 0 the reverse; exact McNemar p = 0.125; bootstrap 95% interval on the 35 rows [0.029, 0.229], excluding zero). The rival never once beats ARGUS on any of the 70 real clusters measured. Per-cluster rows are kept in the artefact, so the groupwise check classes it CHECKED, not designed_cases
  • costs included — finBERT's local CPU latency measured directly (~33 ms/post); ARGUS: 141 real Qwen calls, 231,491 tokens and 53 minutes of wall time for the 30+12 run and its uncached reproducibility check, recorded in the artefact's costs block
  • out of sample test — temporal generalisation on the real-cluster run, precisely stated: nothing in the metric, cap or match rule was fit to this data, so what is checked is whether the pooled finding replicates on a day never used to choose anything — the ledger's last real day (2026-09-27, 8 of the 35 coordinated clusters). It does NOT replicate: the held-out day is an EXACT TIE (8 of 8 resisted on both ARGUS and the fair rival, 0 discordant, McNemar p = 1.0); the whole pooled edge comes from the other three days (27 of 27 vs. 23 of 27, McNemar p = 0.125). This IS the honest result of running the check, not a pass dressed up: it is exactly why the capability is graded TIED rather than OWNED
  • ablation — two real ablations, not one, because the first was genuinely informative against the module's own starting hypothesis: removing only the single named 'five accounts' sentence changed NOTHING (the model's broader source-awareness reasoning already reached the same conclusion unprompted) — a real negative result, reported as found, not discarded; a second, coarser ablation stripping the ENTIRE source-independence framing DID show the real defense degrade (directional confidence measurably rose under coordinated repetition), confirming the defense is a property of the prompt's whole framing, not any one sentence
  • adversarial test — two attacks on every narrative: five template mutations of one sentence, and five retellings by five distinct personas in five registers with no source added (the harder attack the 2026-09-23 re-check named as untested). Neither flipped the analyst to an actionable trade on any of 30 narratives. Precise, not overclaimed: CONFIDENCE is not immune (0.15 to 0.85 on insufficient_evidence reads), the signal leaned toward the rumour, below the actionable bar, on 2 of 30 diverse attacks (AAPL and HOOD, both bearish), and the bare classifier (the coarse ablation) leaned harder than the real analyst on 29 of 30. The retellings share persona templates across narratives; LLM-generated paraphrase campaigns are still untested
  • failure cases documented — feed probed live 2026-09-13: StockTwits 403 to four User-Agents, CNN Fear & Greed 418, only alternative.me answers and it is crypto-wide, not per-symbol; SCOPE_STATEMENT separately states in writing that this comparison proves the MECHANISM works when evidence reaches it, not that evidence currently does
  • reproducibility proven — finBERT is deterministic in eval mode. ARGUS's call is not byte-deterministic, so reproducibility means the SIGNAL holds: 5 of 5 stable on a genuinely uncached re-ask (`reproducibility.uncached` true in the artefact). The earlier claim of 'same signal, confidence 0.85 both times' was a cache hit and is withdrawn
  • no specialist capability superior — scoped precisely to the one property tested: on resistance to a coordinated/duplicate-source manipulation attack, ARGUS's real analyst has a working defense finBERT's per-sentence-only architecture cannot have by construction — not a claim that ARGUS classifies sentiment more accurately than finBERT, which its own design explicitly disclaims and this comparison does not attempt

PROMOTION GATE: 30 differing paired frames through argus.eval.ablation.paired, scored on realised basis points. HELPS promotes it; NO_EFFECT removes it from the panel. Kept in the code rather than deleted so the gate can actually be run — a deletion would hide the finding, and an unmarked analyst would let a dead feed count as a data source.

LOST7 of 13 conditions

Crowd sentiment classification, vs. RoB-RT on TweetEval

RivalRoB-RT (TweetEval, Barbieri et al. 2020), its published test predictions re-scored on the same tweets; finBERT and VADER beside it

Same-input testall 12,284 TweetEval sentiment test tweets, every scorer on the same items

Why not OWNEDLOST to RoB-RT by 0.185 of macro-recall on the same 12,284 test tweets: ARGUS's crowd read scores 0.544 (95% CI 0.535 to 0.553) against RoB-RT's 0.729, and trails every published TweetEval baseline, the weakest of them BLSTM at 0.583.

Every condition and its evidence
  • best implementation studied — TweetEval's paper (arXiv:2010.12421v2, Table 3) and repository leaderboard: SVM, FastText, BLSTM, three RoBERTa variants, BERTweet and TimeLMs-2021
  • best method studied — macro-averaged recall, TweetEval's and SemEval-2017 Task 4's own metric, because accuracy on this imbalanced set rewards an always-neutral scorer
  • baseline reproduced — RoB-RT's own test predictions re-scored through this module's metric: 0.729, against Table 3's 72.6 and the README's 72.8
  • implementation complete — the crowd read (`market/social_pulse.pulse`) run end to end on every tweet
  • same input comparison — all 12,284 TweetEval sentiment test tweets, every scorer on the same items
  • statistically valid evaluation — paired bootstrap of macro-recall differences on the same tweets: RoB-RT minus ARGUS +0.185, the 95% interval excluding zero
  • out of sample test — the abuse screen's configuration was fixed on TweetEval's validation splits and the test splits were read once afterwards
  • ablation — the same tweets run with the abuse screen off: VADER alone, 0.570, so the screen costs 0.026 of macro-recall
  • reproducibility proven — every input file pinned by its upstream git blob hash; one command re-runs it with no model call (python -m argus.eval.sentiment_tweeteval)

The classification race ARGUS's sentiment analyst had disclaimed, run so the disclaimed axis is a number: it is lost, and it is kept in the register.

TIED1 of 13 conditions

Market sentiment

RivalSantiment crowd-sentiment contrarian signals; Augmento; Bitget's own bitget-signal sentiment-analyst Skill; TauricResearch/TradingAgents v0.4 sentiment analyst; the S2 entry Jfash-cmd/sentinel-bitget-hackathon

Same-input testthe desk's sentiment analyst, VADER and finBERT on the identical social evidence of each settled decision, scored on the same realised move net of the same round trip

Why not OWNEDRE-GRADED 2026-09-29 from IMPLEMENTED to TIED on a measurement (eval/sentiment_signal_comparison.py, data/sentiment_signal_comparison.json). The desk's own sentiment analyst, run with its production prompt on the exact social evidence of 30 settled decisions (an evenly spaced sample of the 89 that can be joined; 33 Qwen calls, 225k tokens), against VADER and finBERT on the same posts for all 89, each lean traded over the ledger's horizon (26.8 hours on average) net of the 12bps round trip. No arm shows an edge: the analyst leaned on 11 of 30 and was right on 2 of 7 moves that cleared the cost, -80.1bps per trade; VADER 37.3% and -83.2bps; finBERT 54.3% and -34.9bps; a seeded coin flip 59.7% and -13.2bps. Paired, ARGUS minus VADER and ARGUS minus finBERT both have intervals that include zero (groupwise audit), so it is level with the general tools, not ahead and not shown behind. Why it…

python -m argus.eval.sentiment_signal_comparison
Every condition and its evidence
  • same input comparison — the desk's sentiment analyst, VADER and finBERT on the identical social evidence of each settled decision, scored on the same realised move net of the same round trip

Earnings-Driven Trading Agent

OWNED13 of 13 conditions

Refusal-first earnings surprise ranking vs. a silently-exploding factor

RivalQuantConnect/Tutorials real SUE factor (FineSelectionAndSueSorting)

Same-input testevery method on the same SEC filings: 7,258 filers across the design and holdout frames for pandas' period index and the positional pairing, and one seeded companyfacts sample of 309 filers for edgartools 5.59.1 run offline (data/general_sue_comparison.json, data/edgartools_real_check.json).

python -m argus.eval.earnings_comparison
Every condition and its evidence
  • best implementation studied — QuantConnect/Tutorials' real '355 Standardized Unexpected Earnings' strategy page read in full — confirmed the real, published SUE formula (EPS_q - EPS_q-4 standardised by the stdev of eight historical such deltas) and that its denominator has no guard anywhere in the real source; ARGUS's own existing agents/earnings.py re-read too, confirming its seven-way decomposition has no statistically-standardized number or cross-sectional ranking anywhere — a genuine content gap, not just a missing baseline
  • best method studied — two real methods compared: QuantConnect's real formula with an unguarded division vs. ARGUS's real research.sue, reproducing the exact same published formula in plain Python with an explicit, justified near-zero-variance tolerance (float-noise-safe, not a bare equality check) that refuses instead of returning inf/nan
  • baseline reproduced — QuantConnect's real, unmodified SUE computation run unmodified, byte-hash-pinned against the vendored source (commit 4a341890296f7e79e095508f06170c72ccaa629c)
  • implementation complete — sue_from_quarters/read/rank_universe evaluate real quarterly EPS end to end, including the skipped-with-reason reporting a universe scan needs
  • same input comparison — every method on the same SEC filings: 7,258 filers across the design and holdout frames for pandas' period index and the positional pairing, and one seeded companyfacts sample of 309 filers for edgartools 5.59.1 run offline (data/general_sue_comparison.json, data/edgartools_real_check.json). Before that, both real systems scored on the same real, live SEC EDGAR quarterly EPS (market/fundamentals.py's real, point-in-time, restatement-resolved XBRL fetch) for all nine real rToken anchor companies, agreeing to floating-point identity. CORRECTION 2026-09-25 (eval/general_sue_comparison.py): that agreement was between two positional quarters[i+4] computations, and SEC XBRL has no standalone fiscal Q4, so 0 of the 72 anchor pairs were really year-over-year (7.45% of 31,488 pairs across 3,997 filers). research.sue.read_dated now pairs by date, 100% year-over-year, and agrees with pandas PeriodIndex diff(4) to 1e-9 on 3,687 of 3,687 filers
  • statistically valid evaluation — alignment scored per filer on 7,258 SEC filers (design and holdout frames) with exact McNemar tests against each rival, the named one included: QuantConnect's vendored formula 3,760 filers against 0 on the design frames and 1,640 against 4 on the holdout and a groupwise bootstrap interval of [0.051, 0.063] on the per-filer difference against pandas (data/general_sue_comparison.json, eval/groupwise_audit.py); the refusal case checked across all nine real rToken anchors, plus a real cross-sectional ranking mixing a constructed artifact into the real universe to show the consequence of the reference's own unguarded denominator on an actual ranked list, not just an isolated scalar
  • costs included — real wall-clock cost measured on both real sides on the same real data — numpy's vectorised std against ARGUS's pure-Python statistics.pstdev, both numbers reported plainly with no forced winner (the real vendored call was measured faster here, and that is stated rather than omitted)
  • out of sample test — a holdout the dated rule was never fitted on, CY2016Q1-CY2021Q4 frames with market/sue.py pinned by hash in the artefact: 3,082 of 3,261 filers against pandas' 2,893, p = 6e-26 (data/general_sue_comparison.json, holdout); and the real EPS history is fetched live for the full real anchor universe each run, not a frozen fixture designed around the finding — SEC EDGAR's own data moves as new quarters are filed, and the comparison reports whichever real numbers are live the day it runs
  • ablation — an ablation on the near-zero-variance guard itself: a bare `== 0` check was tried first and found, by running it, to miss a real float-noise case (order 1e-17 from binary rounding on a mathematically-exact-zero input), letting SUE explode to an absurd finite ~6.4e15 instead of refusing — a tolerance was added to catch exactly that case. Since 2026-09-25 the absolute 1e-9 tolerance is replaced by research.sue.noise_floor (16 ulps of the largest operand): in a unit sweep of the nine anchors at ten units, the absolute rule falsely refused 13 genuine readings and the relative rule none
  • adversarial test — the real reference's crash boundary tested directly: four real quarters (reshaped to twelve real monthly slots) makes its own rw[months_eps_change] index fall outside the list, a genuine real IndexError, while five quarters does not crash and instead returns a real, silent nan — two different real failure shapes a hand's-width apart, both found by running the boundary, not assumed
  • failure cases documented — three real, measured silent-failure shapes in the real reference, found by running it: an exact-zero-variance EPS path (whole-dollar, deliberately constructed to be float-exact) produces a real, silent inf; an all-flat EPS history produces a real, silent nan; four real quarters crashes with a bare IndexError rather than a clear message
  • reproducibility proven — the real baseline-reproduced comparison run twice against the same live EDGAR fetch produces byte-identical JSON output
  • no specialist capability superior — scoped explicitly — SCOPE_STATEMENT in eval/earnings_comparison.py. Claimed: on numerical robustness of the SUE computation itself, ARGUS refuses cleanly in every real and constructed degenerate case the real reference either silently corrupts or crashes on. NOT claimed the SUE factor has validated forecasting value as a trading signal — no return or edge claim is made here, and agents/earnings.py's own existing 'EPS beat -> buy is an anti-pattern' caveat is not relitigated. NOT claimed the real anchor SUE values are fixed constants — SEC EDGAR is fetched live and will move as new quarters are filed

Cross-Asset Execution Agent

TIED11 of 13 conditions

Funding-aware cross-asset hedge routing vs. a fee-blind composite router

Rivalcrypto_sor real composite order-book router (CompositeOrderBook.newOrder)

Same-input testboth real systems scored on the same real, live Bitget order-book slippage and funding rate for a real rToken leg (NVDAUSDT) and a real crypto leg (BTCUSDT) — agreeing at zero holding time and diverging past a real, computed break-even horizon

Why not OWNEDRE-GRADED 2026-09-28 from IMPLEMENTED to TIED (Activity/27_CAPABILITY_CLOSE_PLAN.md §2): the rivals this row waited on have been run on one shared, pre-registered tape (data/xa_arena.json, seven rival configurations and four naive baselines). Under the pre-registered primary (certainty equivalent at gamma 5, stationary bootstrap, Holm) every comparison is a TIE in both periods, holding the book included. Two things against it are recorded, not hidden: on the secondary guard Triad's hourly CVaR is significantly better than ARGUS's in both periods, and removing the funding term — the mechanism this row is named for — changed nothing (only removing costs from the objective did, in period B). Why it cannot be won as built: at gamma 5 over 90-day windows hedging this book adds nothing measurable over holding it.

python -m argus.eval.execution_comparison
Every condition and its evidence
  • best implementation studied — crypto_sor's real SmartOrderRouter.ts and CompositeOrderBook.ts read in full — confirmed newOrder() is the real, decisive fill logic (a composite price-level queue across venues, greedily filled by raw price) and that no fee, funding, or holding-cost term appears anywhere in either real file
  • best method studied — two real methods compared: crypto_sor's real entry-cost-only greedy router vs. ARGUS's real total-cost router (argus.cost.model.CostModel.charge — entry slippage/fee plus every real funding settlement over a stated holding period, an already-existing, already-validated ARGUS cost engine reused here rather than reimplemented)
  • baseline reproduced — crypto_sor's real, unmodified CompositeOrderBook.newOrder() run through a real Node/ts-node subprocess (not a Python re-implementation), byte-hash-pinned against the vendored TypeScript source (commit e1bc5c85a160135889a250c21c7c20a056f8a245)
  • implementation complete — choose_hedge_leg/break_even_holding_days/HedgeDecision evaluate real notional, real order-book slippage and real funding rates end to end
  • same input comparison — both real systems scored on the same real, live Bitget order-book slippage and funding rate for a real rToken leg (NVDAUSDT) and a real crypto leg (BTCUSDT) — agreeing at zero holding time and diverging past a real, computed break-even horizon
  • statistically valid evaluation — swept across a real holding-time range (0 to 5 days) and across five real rToken/crypto leg pairs, not one convenient case — the real crypto_sor pick never changes across the holding-time sweep while ARGUS's does, and four or more of the five real leg pairs diverge past their own real break-even
  • costs included — real wall-clock cost measured on both real sides — a real Node/ts-node subprocess spawn (~2 real seconds) vs. ARGUS's real pure-Python decision (sub-millisecond), both numbers reported plainly
  • out of sample test — run_leg_pair_sweep repeats the base comparison across five real, different rToken/crypto combinations never used to design the comparison's mechanism — the divergence pattern holds on all or nearly all of them, not just the single hand-picked NVDAUSDT/BTCUSDT case
  • ablation — break_even_holding_days isolates the exact mechanism by construction: it holds entry slippage fixed and finds precisely the holding time at which the funding channel alone overtakes the entry saving, verified against the real, measured NVDAUSDT/BTCUSDT case in a pinned unit test
  • adversarial test — the real router's edge-case behaviour tested directly: an exchange filter matching no real quote returns an empty fill list rather than raising, and an order larger than the composite book's real depth silently underfills with no flag anywhere in the real return value
  • failure cases documented — three real, measured behaviours of the real router found by running it, not assumed: a single-leg book fills without error, an exchange filter matching nothing returns an empty list rather than raising, and an oversized order silently underfills with no completion flag anywhere in the real Execution[] it returns
  • reproducibility proven — the real subprocess run twice on the same real leg data returns the same real pick both times
  • no specialist capability superior — scoped explicitly — SCOPE_STATEMENT in eval/execution_comparison.py. Claimed: on pricing the FULL real cost of a cross-asset-class hedge choice (entry plus holding), ARGUS's router accounts for a real cost channel crypto_sor's real router has no representation of at all. NOT claimed either real leg is a validated hedge of anything — only the execution cost of each leg is priced, never whether it offsets the exposure being hedged. NOT claimed crypto_sor is broken as a same-instrument, cross-VENUE router — this comparison feeds it two asset-class legs of one venue as competing quotes, a faithful generalisation of its real algorithm, not evidence its original cross-exchange use case has a defect. NOT claimed the measured break-even horizons are permanent — both real cost inputs are measured live and will move with the venue's own real funding rates

Factor Discovery Agent

Every factor the lab tested, and the gate each one stopped at →

TIED11 of 13 conditions

Factor-discovery safety: no execution surface and trial-corrected selection, vs. RD-Agent

Rivalmicrosoft/RD-Agent real factor-implementation pipeline (FBWorkspace, factor_coder) for the execution surface, and vectorbt's deflated_sharpe_ratio (Bailey and Lopez de Prado) for the trial correction

Same-input testthe identical crafted, attacker-shaped factor.py payload construct is put to both real systems: RD-Agent's real execute() accepts and runs it;

Why not OWNEDRE-GRADED 2026-09-29 from IMPLEMENTED to TIED (Activity/28_CAPABILITY_CLOSE_PLAN_2.md §5). The measured parts favour ARGUS over RD-Agent: RD-Agent's unmodified FactorFBWorkspace.execute() ran an attacker payload (data/rdagent_comparison.json injection_proof), while ARGUS's search path has no eval, exec or subprocess call; and on one 400-trial pool of 326 distinct candidates on NVDAUSDT, the best in-sample Sharpe of 0.0178 deflates to p = 9.3e-05 once the trials are counted. But RD-Agent's accept decision is an LLM vote (rdagent/scenarios/qlib/developer/ feedback.py:110, 'Replace Best Result') that was read and never run on that pool, so the selection half has no same-input contest. Against the general method the correction is the same formula with the same outputs: ARGUS's deflated Sharpe equals vectorbt's on 1,215 of 1,215 swept cases, max abs diff 0.0 (data/dsr_comparison.json), so on…

python -m argus.eval.rdagent_comparison
Every condition and its evidence
  • best implementation studied — RD-Agent's real factor-discovery loop read in full — scenarios/qlib/proposal/factor_proposal.py, components/coder/factor_coder/factor.py, core/experiment.py's FBWorkspace, scenarios/qlib/developer/feedback.py — and the execution path (FBWorkspace + FactorFBWorkspace) vendored whole, byte-hash-pinned
  • best method studied — both real methods compared: RD-Agent's single LLM-driven hypothesis stream, with an LLM reading its own qlib backtest metrics as text and voting 'Replace Best Result: yes/no' (feedback.py's own real code); ARGUS's five fixed-budget algorithmic strategies (research/searchoff.py) with a hard-coded in-sample-pick/out-of-sample-score separation no LLM judgment call can quietly skip
  • baseline reproduced — RD-Agent's real FBWorkspace/FactorFBWorkspace run unmodified, byte-hash-pinned against the vendored source (commit 32b3d395e73d9db5eee3fe9063d69aec0fdc83bd)
  • implementation complete — all five search strategies plus the shared budgeted Arena evaluate real bars
  • same input comparison — the identical crafted, attacker-shaped factor.py payload construct is put to both real systems: RD-Agent's real execute() accepts and runs it; ARGUS's grammar has no code-shaped input surface to accept it at all, by construction (AST-verified, zero eval/exec/subprocess calls); separately, ARGUS's real deflated_sharpe() is run on ARGUS's own real 400-trial pool from the same real NVDAUSDT bars research/searchoff.py's own published Track 1 finding already uses
  • statistically valid evaluation — the real 400-trial search_random pass — not a hand-picked convenient case — and a 5-point trial-count sweep (1/5/25/100/400) on the identical observed value, confirming the correction responds to trial count rather than being a fixed penalty
  • costs included — both real costs measured directly and reported as genuinely NOT comparable on one axis, not force-fit into a single winner: RD-Agent's real fixed subprocess-spawn floor vs. ARGUS's real computation-bound, no-subprocess grammar evaluation — measured on real ~1487-bar NVDAUSDT data, ARGUS's own number is the LARGER of the two, the opposite of what a smaller synthetic fixture shows, reported honestly rather than the more flattering number kept
  • out of sample test — the real trial pool's best candidate is explicitly the IN-SAMPLE half (Arena.split, 65/35), the exact quantity a naive accept/reject rule would report as if validated — deflated_sharpe exists precisely to refuse trusting it uncorrected
  • ablation — trials swept 1->400 on the same observed value; probability strictly falls
  • adversarial test — a crafted factor.py payload run through RD-Agent's real, unmodified FactorFBWorkspace.execute() writes a marker file this test checks for from OUTSIDE the subprocess — genuine host-level execution of code this module never edited, not an assertion from reading the subprocess.check_output line alone
  • failure cases documented — both sides' real handling of a crashing/malformed input run: RD-Agent's real CustomRuntimeError handler catches a factor.py that raises cleanly; ARGUS rejects an unknown search-grammar op at Window construction, before a search loop is even reachable
  • reproducibility proven — the same seed reproduces the identical real trial pool bit-for-bit; separately, the six vendored RD-Agent files are hash-pinned so they cannot silently drift from the cited commit
  • no specialist capability superior — scoped explicitly — SCOPE_STATEMENT in eval/rdagent_comparison.py. Claimed: on execution surface, ARGUS's grammar structurally cannot execute code while RD-Agent's real code demonstrably can and does; on trial-count correction, RD-Agent's real accept/reject mechanism has no analogue anywhere in its source (exhaustive grep for deflation/multiple-testing/PBO/FDR terms, zero matches) while ARGUS's real DSR gate refuses the exact 'discovery' a real 400-trial run of its own search would otherwise report. NOT claimed: that RD-Agent's factor-implementation CODER (the LLM step upstream of the execute() call this comparison starts at) is unsound — not vendored or run here. NOT claimed: that RD-Agent's qlib backtest metrics are not out-of-sample — the real conf_combined_factors.yaml template DOES define train/valid/test date ranges; the gap is narrower: the SAME test window is reused as the acceptance bar across an unbounded number of loop iterations with nothing correcting for how many were tried. NOT claimed that ARGUS's own search finds better factors — research/searchoff.py's own published Track 1 result is 0 of 12 symbols surviving the all-trials DSR gate too
TIED4 of 13 conditions

Factor Discovery Agent: hypothesis to tradable factor

Rivalminihellboy/FactorMiner (arXiv 2602.14670); bigcan/sharpen Crucible; rookiewu417/FactorZen; QuantaAlpha/QuantaAlpha; microsoft/RD-Agent fin_factor

Same-input testboth sides on the same frozen 90-day bars (data/factor_split_half_bars.json, sha256 checked on load) through the same cost, out-of-sample and split-half gates;

Why not OWNEDRE-GRADED 2026-09-29 from IMPLEMENTED to TIED on factor quality, the blocker below, measured against FactorMiner (eval/factor_quality_rivals.py, data/factor_quality_rivals.json): its 109 scoreable paper factors, 12 Alpha101 and 60 adapted variants, run in FactorMiner's own engine at commit 201309cf, and ARGUS's eight rules, all through the factor lab's cost, out-of-sample and split-half gates on the same frozen 90-day bars. No family passes every gate more often than noise passes split-half alone (25 of 480, 5.2%): ARGUS 0 of 96 pairs, FactorMiner's paper factors 2 of 1,308 against 4 of 1,308 for the same factors rotated against the returns, Alpha101 0 of 144, adapted variants 0 of 720. FactorMiner's own gate agrees: 48 of 182 formulas clear its IC bar of 0.04 and none its ICIR bar of 0.5 (best 0.19). The one factor with a gross edge, High-Low Midpoint Reversion, turns a gross Sharpe of…

Every condition and its evidence
  • baseline reproduced — FactorMiner's paper factors, Alpha101 and adapted variants evaluated by FactorMiner's own engine at commit 201309cf in its own Python 3.12 environment, run as a subprocess; its own count of 110 paper factors reproduced, one all-NaN in its engine
  • same input comparison — both sides on the same frozen 90-day bars (data/factor_split_half_bars.json, sha256 checked on load) through the same cost, out-of-sample and split-half gates; ARGUS's 96 rows match data/factor_split_half.json field for field or the run stops
  • costs included — the cost gate charges the backtest engine's Bitget perp cost (12 bps round trip) on every rebalance of every pair, the same for both sides
  • adversarial test — a placebo arm rotates every rival factor half the sample against its returns; it passes every gate on 4 paper pairs against 2 for the factors as written

Judged: Agent architecture quality

The checked architecture, drawn: layers, contracts and every dependency cycle →

LOST11 of 13 conditions

Deliberation priced as a trading cost

RivalHaoKang-Timmy/LatencySensitiveBench (arxiv 2505.19481, NeurIPS 2025)

Same-input testboth real cost functions called on the identical delay values — including ARGUS's own three real, bake-off-measured THINKING_MS delays (3s/8s/40s), not synthetic numbers picked to favour either side

Why not OWNEDRE-GRADED 2026-09-29 from IMPLEMENTED to LOST (Activity/28_CAPABILITY_CLOSE_PLAN_2.md §1). The comparison the blocker below marked NOT VERIFIED has now run: data/general_delib_comparison.json, 23,003 real decision instants from free Tardis Bitget books (2026-08-01 and 2026-09-01) and the 2026-09-24 forward tape, scored against the realised move at ARGUS's three thinking delays. The charge that runs in production (agents/meta_pm.py with the constant 0.45 vol and the depth multiplier) has MSE 10.85 at 3s; the trailing empirical estimator (the same method as agents/delay_cost.py, parity 2e-12 on 238 instants) has 0.96, and trailing realised vol 0.99. The production charge's excess MSE over the trailing estimator is 9.89, block-bootstrap interval [9.20, 10.57] over 406 blocks, and it is biased 6.2x high. It beats the named specialist by a wide margin (LatencySensitiveBench's linear model,…

python -m argus.eval.deliberation_comparison
Every condition and its evidence
  • best implementation studied — 88 corpus repos read for a priced deliberation budget (none prices it), plus a fresh targeted search 2026-09-16 that found the one real exception: LatencySensitiveBench's TradingEnv.py, read in full
  • best method studied — both real methods read and compared: ARGUS's sqrt(delay) random-walk expected-displacement model (execution/latency.py) vs LatencySensitiveBench's linear-interpolation-to-average-price-with-a-cap model (TradingEnv.py:74-92) — genuinely different assumed price processes
  • baseline reproduced — no license to vendor the real file under (gh repo view: licenseInfo=null), so an independent clean-room reimplementation of the same described idea was verified against reference output vectors computed by running LatencySensitiveBench's own real, unmodified method once locally — six (input, output) pairs pinned and matched exactly
  • implementation complete — THINKING_MS and DEPTH_MULTIPLIER feed the hurdle the PM must clear
  • same input comparison — both real cost functions called on the identical delay values — including ARGUS's own three real, bake-off-measured THINKING_MS delays (3s/8s/40s), not synthetic numbers picked to favour either side
  • statistically valid evaluation — both real functions run across a 17-point delay sweep from 0 to 120 seconds, not one convenient case; boundedness and unboundedness confirmed across the whole swept range, not just the three thinking-budget points
  • costs included — the deliberation charge is added to the fee hurdle, not reported beside it; separately, both real comparison functions' own call overhead measured directly, not estimated
  • out of sample test — the decisive comparison runs on ARGUS's own real production THINKING_MS values (the actual bake-off-measured wall-clock this project runs live), not values chosen for the comparison
  • ablation — widening the baseline's real decay_window parameter from 1.5s to 60s (still finite, just larger) restores its ability to distinguish ARGUS's three real delays — confirming the collapse is caused by the SPECIFIC 1.5s cap value stated in their own code, not by having a cap at all
  • adversarial test — the decisive real finding: run on ARGUS's own three real thinking-budget delays (3s/8s/40s), the baseline's real formula reports the IDENTICAL cost for all three (each exceeds its 1.5s cap), while ARGUS's own real formula reports three distinct, correctly ordered costs on the identical delays
  • failure cases documented — SCOPE_STATEMENT states in writing what is NOT claimed: that LatencySensitiveBench's model is wrong for the delay range ITS OWN benchmark targets (likely sub-2-second, classical HFT latency), only that it cannot distinguish ARGUS's own real, much longer LLM-inference delays
  • reproducibility proven — both real functions are pure and deterministic — the same delay input always produces the same bps output, confirmed by running the full comparison twice and diffing the saved JSON artefact
  • no specialist capability superior — scoped precisely: on the property of distinguishing DIFFERENT real LLM inference delays in the range ARGUS actually operates at (seconds to tens of seconds), ARGUS's sqrt(t) model can and the baseline's real linear-capped model cannot, by construction — not a claim that the baseline is poorly designed for the shorter delay range its own paper targets
TIED11 of 13 conditions

Episodic memory across decisions

RivalTauricResearch/TradingAgents reflection log, which stores a model's prose lesson rather than a graded outcome

Same-input testidentical fixtures run through both ARGUS's real recall() and TradingAgents' real TradingMemoryLog across the resolution boundary.

Why not OWNEDRE-GRADED 2026-09-29 from IMPLEMENTED to TIED (Activity/28_CAPABILITY_CLOSE_PLAN_2.md §16) with TradingAgents' TradingMemoryLog on the one property both systems implement and that was measured on the same inputs (data/recall_comparison.json): both hide an unresolved outcome and both reveal a resolved one. The third boundary case is a granularity choice (ARGUS compares instants with a strict '<', TradingAgents compares dates with '<='), not a defect on either side. Everything else that differs is design rather than measured outcome: ARGUS shows pending episodes and enforces a five-episode floor, and its write path costs no model call where TradingAgents' costs one per episode (read, not run). Memory's value is decision quality, and neither system has measured that on the same decisions; doing so means paired frames with and without the memory block, about 200 Qwen calls, not run. The…

python -m argus.eval.recall_comparison
Every condition and its evidence
  • best implementation studied — TradingAgents, RD-Agent, FinMem and LangGraph memory paths read
  • implementation complete — rendered in the PM frame before reasoning, not applied to the answer after
  • adversarial test — truncating the future must not change what the past knew: an episode that settles after the recall instant contributes its decision and not its outcome
  • statistically valid evaluation — no pattern is stated below 5 graded episodes, matching the calibration floor
  • best method studied — TradingAgents' actual reflection/memory code read in full: graph/reflection.py (Reflector.reflect_on_final_decision, an LLM prompt-and-invoke wrapper with no logic of its own) and agents/utils/memory.py (TradingMemoryLog, 334 lines - the append-only markdown log, its as_of point-in-time filter, same/cross-ticker retrieval split, and rotation) plus its sibling agents/utils/rating.py
  • baseline reproduced — TradingAgents' real TradingMemoryLog vendored verbatim - byte-verified against commit be952b8eccb49720509af544c6675233bc1f10d0, pinned by SHA256 - and actually executed: real writes (store_decision), real outcome updates (update_with_outcome), real point-in-time reads (get_past_context) against a real temp-file markdown log, not a mock or a description
  • same input comparison — identical fixtures run through both ARGUS's real recall() and TradingAgents' real TradingMemoryLog across the resolution boundary. Both correctly hide an unresolved outcome and correctly reveal it once resolved (2 of 3 boundary cases agree exactly); the third case is a genuine, run-verified granularity divergence, not an agreement failure: ARGUS's strict < on datetime instants excludes an episode settled at exactly `now`, TradingAgents' <= on date strings includes an entry resolved exactly on `as_of` - both real, both intentional, cited to the exact line each does it
  • costs included — TradingAgents' real write path costs one LLM call per graded episode (Reflector.reflect_on_final_decision -> quick_thinking_llm.invoke, read directly at graph/reflection.py) to produce the prose it stores; ARGUS's lessons() is pure arithmetic over graded ledger fields - zero tokens, zero model calls, every single time it runs. No LLM call was made anywhere in this comparison itself (the prose TradingMemoryLog stores is supplied as a fixed string), matching this project's own hackathon-key budget discipline
  • out of sample test — the boundary logic tested here is not fixture-tuned code written only for this comparison: it is the exact, unmodified argus.agents.recall.recall() already running in production against the real paper ledger (121 decisions across twelve instruments, cited in this module's own docstring) - the 'out of sample' evidence is that the same function, not a variant of it, already carries real load outside the 6 hand-designed fixtures this comparison adds
  • ablation — ARGUS's MIN_EPISODES_FOR_A_LESSON floor (5), shown load-bearing by patching it down to 4 on an otherwise-identical 4-episode fixture: with the real floor, lessons() states nothing (correctly, since 4 < 5); with the floor patched to 4, the same data produces a real lesson. A first version of this ablation read the patched result AFTER the monkeypatch had already been restored and silently reported the floor as not load-bearing for the wrong reason - caught by running it and checking the actual booleans, not assumed correct on write, fixed the same day (see this module's own history)
  • failure cases documented — TradingAgents' real get_past_context has no equivalent floor of any kind - verified by running it on a single episode and confirming it returns content regardless of sample size, the exact failure mode ARGUS's own floor exists to prevent ('a memory that generalises from two observations is worse than no memory', this module's own docstring)
  • reproducibility proven — both systems are deterministic over their stored state - no model, no seed, no simulation in either's storage/retrieval path (TradingAgents' write path needs an LLM call to PRODUCE the prose; reading it back is pure parsing). Every fixture in this comparison is hand-constructed and fixed, not sampled
  • no specialist capability superior — scoped explicitly - SCOPE_STATEMENT in eval/recall_comparison.py. Claimed: both systems' point-in-time guard was run and verified correct on both sides; ARGUS additionally shows ungraded episodes as context (TradingAgents' real code explicitly filters pending entries out, read directly) and additionally refuses a pattern below a stated floor (TradingAgents has none, verified by running it); ARGUS's write path costs zero tokens against TradingAgents' one LLM call per episode. NOT claimed: that excluding pending entries or having no floor is a mistake on TradingAgents' part - both are real, working design choices for a system whose memory is advisory prose re-read by a model that can itself discount thin evidence, a different premise from ARGUS's structured, falsifiable one. Also NOT claimed: that ARGUS's design produces BETTER trading decisions - that needs graded real-world outcomes from both systems on the same decisions, which neither this comparison nor the project has

The advantage over the baseline is falsifiability, not richness: every line is arithmetic over data/paper_ledger.jsonl and can be recomputed by a reader.

TIED11 of 13 conditions

Pre-registered trading protocol, hash-committed

Rivalserenity-guardrails (Apache-2.0) hash-chained journal with a head anchor

Same-input testboth real systems run on identical realistic 2-entry fixtures for the CRLF case, the tamper case, and the truncation case

Why not OWNEDRE-GRADED 2026-09-29 from IMPLEMENTED to TIED (Activity/28_CAPABILITY_CLOSE_PLAN_2.md §18) with serenity-guardrails on the hash chain, the property both implement. The only difference ever measured was platform I/O: on Windows serenity's text-mode writes turn LF into CRLF and its own untampered chain then fails to verify, while ARGUS's hashes the parsed content. Run on Linux the same day (data/journal_comparison_posix.json, WSL2 Ubuntu 22.04), serenity writes LF, verifies its untampered chain clean and detects the tamper, so the earlier lead is a Windows bug in the rival, not a better method. What ARGUS has beyond it is scope, not a contest: an external anchor on Bitcoin through OpenTimestamps (the category's general tool, used as is) and sealed settlements, which serenity has no notion of. The live ledger verifies: 836 entries, chain and links intact, anchor agrees.

python -m argus.eval.journal_comparison
Every condition and its evidence
  • best implementation studied — etoro_trading/journal.py (96 lines) and guards.py (194 lines) read in full — the same append-only, hash-chained JSONL + head-anchor-sidecar design ARGUS's own PaperLedger uses, vendored byte-verified
  • best method studied — per-entry SHA-256 link plus an atomically-replaced head-anchor sidecar for tail-truncation detection is the real method in both systems' own code, read side by side
  • baseline reproduced — serenity's real ChainedJournal.append()/.verify() executed via the vendored file through a sys.modules shim, zero source edits, commit 13d46dc1c6204f27fe321bd66023691918017cce
  • implementation complete — committed against ledger head 4c382231cf77e3d3 at 94 entries, governs 95+
  • same input comparison — both real systems run on identical realistic 2-entry fixtures for the CRLF case, the tamper case, and the truncation case
  • statistically valid evaluation — swept entry counts 1 through 50 (not just the N=2 case the bug was first found at): serenity's real verify() fails at every single N, ARGUS's real verify() is clean at every single N
  • costs included — ARGUS's own chain overhead measured, not estimated: 9.75ms/entry to write, 0.021s to verify a 250-entry ledger — this artefact had never been generated before 2026-09-21 (cited the module's own source only, ATTESTED); the previous text here read '~0.014s to verify', unchecked against a real run and wrong by roughly 50% once one existed
  • out of sample test — verified against the REAL, live production paper-trading ledger this session has been writing to, 836 real entries on 2026-09-29, chain and links intact, anchor agreeing
  • ablation — isolates the one design choice that matters: hashing raw disk bytes (serenity's real behaviour) is fragile under nothing but platform text-mode I/O; hashing re-serialized parsed content (ARGUS's real behaviour) survives the identical condition
  • adversarial test — a genuine, reproducible, platform-specific bug found by RUNNING the real vendored code, not by reading it: on Windows, serenity's own ChainedJournal rejects its own completely untampered write as tail-truncated, because Python's default text-mode file write silently converts \n to \r\n and verify() re-hashes raw binary-mode-read bytes that were never what append() itself hashed; separately, test_protocol.py proves enforcement runs last in the cycle and may only reduce, never enlarge
  • failure cases documented — SCOPE_STATEMENT names exactly what is and is not claimed, including that the CRLF defect is Windows-specific and NOT re-tested on POSIX here (stated as NOT VERIFIED, not assumed); the protocol's own governs-from-entry boundary is a separate, already-documented limitation
  • reproducibility proven — the commitment digest is recomputable from the protocol text alone
  • no specialist capability superior — on every property both systems implement — link integrity, tamper detection, truncation detection — they agree; on the one property where they diverge (surviving real platform I/O), ARGUS's real code is correct and serenity's real code is not, confirmed by running both, not asserted

Judged: risk control layer effectiveness

Every risk limit, its value, and whether it could fire in the last cycle →

TIED11 of 13 conditions

Abstention scored as a decision

Rivalfd-shifts (c4467aec, Apache-2.0), the general selective-prediction evaluator, run unmodified on the same leans; and insaneamogh/AutonomousTradeAgents 'Ghost P&L' ledger, found 2026-09-16 by a fresh, targeted search…

Same-input testboth real systems scored on the structurally identical adversarial scenario — a large avoided loss and a large blocked/missed upside that roughly offset — including the EXACT dollar figures ($30,788 / $32,967) the baseline's own code comment names

Why not OWNEDRE-GRADED 2026-09-29 from IMPLEMENTED to TIED (Activity/28_CAPABILITY_CLOSE_PLAN_2.md §2) with fd-shifts (c4467aec, Apache-2.0), the general selective-prediction evaluator the category is built on. The general tool won first: before the adaptation, observatory.abstention_quality returned the same output for an oracle, a random and an inverted gate, while fd-shifts ranked all three correctly. eval/abstention_coverage.py now implements fd-shifts' method, and on the parity fixtures and the live leans (data/general_abstention_comparison.json) AURC, AUGRC and their optima match fd-shifts to floating-point error, so on the shared metric the two cannot be told apart by construction. What ARGUS adds is features, not a same-metric win: losses priced in bps, a day-clustered interval, and no crash on a ranking where fd-shifts raises on an empty sequence. The desk itself shows no ranking skill on…

python -m argus.eval.abstention_comparison
Every condition and its evidence
  • best implementation studied — the wider corpus read for a counterfactual-abstention record and found nothing; a fresh targeted search found the one real exception — AutonomousTradeAgents' 'Refusal Ledger', read in full (ghost_service.py, 538 lines)
  • best method studied — both real methods read and compared: ARGUS's settle_abstention records a single counterfactual move at settlement, scored via abstention_quality's avoided_loss/missed_gain/total_value split; AutonomousTradeAgents' GhostBucket marks every vetoed/declined proposal to market over a trading-day horizon with the identical split PLUS a separate 'headline' saved_usd/missed_usd number
  • baseline reproduced — no license to vendor under (gh repo view: licenseInfo=null), so an independent clean-room reimplementation of the aggregation was verified against reference output computed by running their own real, unmodified _bucket_from_rows once locally on their own documented example — matched exactly (net=$2179.00, loss_avoided=$30788.00, upside_blocked=$32967.00, headline saved_usd=$0.00)
  • implementation complete — settle_abstention records counterfactual_move_bps against the live tape
  • same input comparison — both real systems scored on the structurally identical adversarial scenario — a large avoided loss and a large blocked/missed upside that roughly offset — including the EXACT dollar figures ($30,788 / $32,967) the baseline's own code comment names
  • statistically valid evaluation — swept across twelve ratios of avoided-loss to blocked-upside from 0 (pure loss) to 2.0 (upside dominates), not one convenient case — confirming the real defect fires exactly where the net crosses near zero and nowhere else
  • costs included — both real comparison functions' call overhead measured directly
  • out of sample test — the reference scenario is AutonomousTradeAgents' OWN documented production incident (a real, dated example from their own code comment), not a fixture invented for this comparison
  • ablation — isolates the exact mechanism: the real bucket's own unfloored net (ghost_pnl) already carries the correct $2,179 answer — the ablation confirms the defect is specifically the max(0.0, -net) floor applied afterward, not the underlying aggregation
  • adversarial test — the decisive real finding: AutonomousTradeAgents' real headline saved_usd computation produces exactly $0.00 on their own real, documented example — not a fixed historical bug, still live in build_ghost_summary (ghost_service.py:278) — while ARGUS's real abstention_quality() reports the true, unfloored net on the identical scenario shape
  • failure cases documented — SCOPE_STATEMENT states in writing what is NOT claimed: that AutonomousTradeAgents' overall design is unsound (it is not — only the one headline computation), or that ARGUS's calendar-hour settlement horizon matches or beats their trading-day-aware one, since the two systems trade genuinely different-calendar venues
  • reproducibility proven — the ledger is hash-chained; any entry can be recomputed from its predecessor
  • no specialist capability superior — scoped precisely to the one property tested: on reporting a true, unfloored net value for a two-sided abstention record, ARGUS's real abstention_quality() has no equivalent of the named specialist's real, still-live headline-flooring defect — not a claim that ARGUS's abstention scoring is otherwise more complete (their trading-day-aware horizon and partial-mark visibility are real, useful properties this comparison does not attempt to beat)
OWNED13 of 13 conditions

Risk layer proved by domain sweep

Rivalnautechsystems/nautilus_trader risk engine, QuantConnect brokerage models, freqtrade's MaxDrawdown/StoplossGuard/LowProfitPairs/CooldownPeriod protections

Same-input testARGUS's circuit breaker and freqtrade's ported protections walked over the SAME real Bitget trade sequences at two scopes — per-symbol (compare_real_symbols) and whole-book (compare_combined_book)

python -m argus.eval.riskproof
Every condition and its evidence
  • best implementation studied — Nautilus, QuantConnect, freqtrade and Hummingbot risk paths read
  • best method studied — freqtrade's own protection arithmetic read from source and cited by file:line — max_drawdown_protection.py, stoploss_guard.py, low_profit_pairs.py, cooldown_period.py, iprotection.py — not reimplemented from memory
  • baseline reproduced — all four freqtrade protections faithfully ported, each documenting its stated simplifications and the direction they diverge
  • implementation complete — 2,177,280 states swept, zero invariant violations, all 15 gates reachable (nine Foundation 5 dimensions, up from the original five/eight)
  • same input comparison — ARGUS's circuit breaker and freqtrade's ported protections walked over the SAME real Bitget trade sequences at two scopes — per-symbol (compare_real_symbols) and whole-book (compare_combined_book)
  • statistically valid evaluation — 314 real trade checkpoints per symbol and 314 on the combined book, over the 7 of 12 contracts whose strategy runs traded (the other 5 produced no return variance and are listed in the artefact's symbols_failed); the outcome of each rule's locks carries a moving-block bootstrap interval per gated trade, [0.0012, 0.0086] points in ARGUS's favour against freqtrade's defaults, and the per-trade rows are regenerated and audited by symbol and by half (data/groupwise_audit.json)
  • costs included — 12bps round trip (CostModel.bitget_perp) applied once per discrete trade, read off SyntheticTrade.return_pct's own not-cost-adjusted docstring rather than assumed
  • out of sample test — chronological IS/OOS split matching engine.py's own 0.35 fraction formula; on the out-of-sample 122 trades the outcome difference against freqtrade keeps its sign (+0.0039 points per gated trade) with an interval that includes zero, stated rather than rounded up
  • ablation — Population RCT (N gate-ablated ConstitutionPolicy variants, live in paper/runner.py, zero extra LLM cost) plus a per-protection freqtrade ablation with real unique-contribution shares
  • adversarial test — three mutant policies caught by the sweep, plus three hand-built adversarial trade scenarios against the real comparison, findings reported as found rather than as hypothesised (one hypothesis was wrong and says so)
  • failure cases documented — two genuine arithmetic divergences (windowed-local-peak vs all-time-peak drawdown; windowed-total vs consecutive-streak loss counting) plus the combined-book finding below, all documented rather than smoothed over
  • reproducibility proven — the sweep is exhaustive over the declared domain, not sampled
  • no specialist capability superior — judged on outcomes, not on a label: over the same chronological run of 313 real strategy trades on the combined book, a lock at one trade stops the next, and each rule's book is the trades it let through (risk_layer_comparison.outcome_after_lock). freqtrade's four protections at their defaults lock all 313 and keep nothing; ARGUS keeps 226, and the 87 it stopped netted -0.24%, so its book ends +1.49% with a -0.17% worst drawdown against +1.25% and -0.35% for never locking at all. Per gated trade ARGUS's book kept 0.0048 points more than freqtrade's (moving-block bootstrap 95% interval [0.0012, 0.0086], and the same sign at every one of seven swept MaxDrawdown thresholds). Out of sample (the last 35%, 122 trades) the point estimate still favours ARGUS (+0.0039) but the interval includes zero, and against never locking the difference is not significant on either half: ARGUS's locks are not shown to add return, only to stop losing trades without stopping the book. freqtrade's MaxDrawdown proxy correlates 0.2257 with the book's true drawdown, which is why re-tuning it cannot help. CORRECTION 2026-09-29 (a hostile review): this proof used to rest on ARGUS Pareto-dominating freqtrade's precision/recall curve, scored against drawdown at ARGUS's own reduce-only bar; ARGUS locks on exactly that, so its recall of 1.0 was guaranteed before any data was read. That comparison is kept in the artefact, labelled by construction, and no longer counts.
LOST5 of 13 conditions

Prompt injection withheld on attacks it was never written against (NVIDIA garak)

RivalNVIDIA garak @8d1259ef (Apache-2.0): its latent-injection probes as development and its promptinject probes, built by its own resources/promptinject, as a held-out set scored once; the quarantine's own rules as they…

Same-input testthe current rules and the frozen earlier rules score the same generated documents

Why not OWNEDRE-GRADED 2026-09-29 from IMPLEMENTED to LOST (Activity/28_CAPABILITY_CLOSE_PLAN_2.md §47) on the row's own claim, attacks never written against, against a trained classifier (eval/injection_classifier_rival.py, data/injection_classifier_rival.json): ProtectAI's deberta-v3-base-prompt-injection-v2 (Apache-2.0, local) and ARGUS's rules on the same 662 externally sampled deepset/prompt-injections prompts, a corpus neither was built from. The classifier withholds 109 of 263 attacks (41%) and ARGUS's rules 41 (16%); 86 attacks only the classifier caught against 18 only ARGUS caught, exact McNemar p = 8e-12. Those attacks are direct injection and role-play jailbreaks, not the desk's threat model, and the trade-off runs the other way on everything the desk actually reads: on garak's latent injection ARGUS withholds 3,582 of 3,652 against the classifier's 322, on garak's held-out hijacks 2,100…

Every condition and its evidence
  • best implementation studied — garak probes/latentinjection.py and promptinject.py and resources/promptinject read at source (research/harvest/06-garak.md)
  • same input comparison — the current rules and the frozen earlier rules score the same generated documents
  • adversarial test — 5,752 attack documents from an independent red-teaming tool, split before any rule changed
  • reproducibility proven — the corpus is committed and regenerable from garak's source at a pinned commit
  • implementation complete — agents/quarantine.py screens every evidence item before a model reads it
  • baseline reproduced — ProtectAI's deberta-v3-base-prompt-injection-v2 run locally through transformers on every item of every corpus, its own two-way decision
TIED7 of 13 conditions

Attack corpus stopped before the model, vs. HeyArka's own shield on its own corpus

RivalHeyArka @8dbb967 (MIT): its @heyarka/core CORPUS of 16 vectors in six families and its @heyarka/shield pipeline (sanitize, provenance gate, corroboration gate, point-in-time guard), built from source and run on its own…

Same-input testARGUS's stages and HeyArka's shield on the same 16 vectors over HeyArka's own demo context, paired per vector, exact sign test

Measured

  • not_separable vs HeyArka shield (sanitize, provenance, corroboration, point-in-time), its own code on HeyArka's 16 attack vectors on its own demo context: which reach the reader: 0.9375 against 0.625 (share of vectors whose attack content is removed, collapsed or flagged before the reader), 16 vectors, p = 0.0625

Why not OWNEDTIED, not won, on the comparison's own statistics: on HeyArka's demo context ARGUS stops 15 of 16 vectors before the model and HeyArka's shield 10 of 16 before its agent; the five discordant vectors all go ARGUS's way (the three tool hijacks, the plausible falsehood, the explicit no-information notice), which is p = 0.0625 on an exact two-sided sign test — sixteen vectors cannot separate the gap at 0.05. A larger independent corpus is the route to a result.

Every condition and its evidence
  • best implementation studied — HeyArka read at source: packages/core/src/vectors/*.ts, runner.ts:18-73, score.ts:153-225, packages/shield/src/shield.ts:45-122 (research/repos-t2/jhaycrypt001~heyarka); every vector's transform and payload recorded with its source file:line
  • baseline reproduced — HeyArka's shield run from its own built TypeScript by eval/baselines/heyarka_shield_probe.mjs on its own corpus and demo context
  • same input comparison — ARGUS's stages and HeyArka's shield on the same 16 vectors over HeyArka's own demo context, paired per vector, exact sign test
  • implementation complete — the live gather runs the price check; the quarantine screens every evidence item
  • adversarial test — sixteen attack vectors from an independent red-team corpus, payloads byte for byte
  • failure cases documented — the one vector that reaches the model is named, with what reaches it
  • reproducibility proven — python -m argus.eval.attack_suite regenerates data/attack_suite.json; the corpus is committed (data/heyarka_corpus.json) and the probe reruns from a clone
LOST6 of 13 conditions

Volatility-targeted sizing (walk-forward GARCH) against fixed size, after fees

RivalFixed size on the same signal (garchmethod's own demo, an EMA 9/21 crossover long/flat), against milesdeutscher/garchmethod's target / forecast sizing clipped to [0.25, 2.0], both through backtest/engine.py with…

Same-input testfixed, targeted and exposure-matched targeted arms on the same signal and closes

Why not OWNEDLOST to fixed size on the measure sizing exists for. At the same average exposure, the GARCH-targeted arm's worst drawdown was deeper on all three coins (BTC 29.5% against 27.0%, ETH 54.1% against 51.4%, SOL 57.8% against 52.7%), its Sharpe higher on ETH only (0.80 against 0.70; BTC 1.09 against 1.14, SOL 1.07 against 1.11), and its fees higher on all three, because a size that moves every day trades every day. The reference's compare.py charges no fee, which is where its advantage would have come from.

python -m argus.eval.vol_target_comparison
Every condition and its evidence
  • best implementation studied — garchmethod read at source: scripts/garch_forecast.py walkforward_garch (500-day burn-in, refit every 21 days, Student-t GARCH(1,1) via arch), scripts/vol_target.py size_from_vol (clip 0.25 to 2.0), scripts/compare.py (fixed against targeted, no fees)
  • baseline reproduced — the reference's walkforward_garch run from its clone on the same Bitget closes; the pure-Python Student-t fit correlates 0.985 to 0.995 with it, median gap under 1.1 vol points, sizes differing by over 0.1 on at most 0.9% of days
  • same input comparison — fixed, targeted and exposure-matched targeted arms on the same signal and closes
  • costs included — every arm through backtest/engine.py, which refuses to run without Bitget's fee
  • failure cases documented — the Gaussian fit tried first and rejected (persistence 0.79 against 0.92 on bitcoin's tails, correlation 0.80 with the reference) is recorded in the module docstring
  • reproducibility proven — python -m argus.eval.vol_target_comparison regenerates the artefact

Judged: decision explainability

TIED11 of 13 conditions

Numeric decision grounding vs. TradingAgents' real, unchecked TraderProposal

RivalTradingAgents' real, unmodified TraderProposal (agents/schemas.py)

Same-input testboth real systems checked on the same real, live Bitget current price (and the same fabricated entry_price) for the same real symbols — TradingAgents' real validator and ARGUS's real grounding.check, not a re-implementation of either

Why not OWNEDRE-GRADED 2026-09-29 from IMPLEMENTED to TIED (Activity/28_CAPABILITY_CLOSE_PLAN_2.md §29) with the best general-purpose tool for the measured job: a pydantic v2 field validator that refuses an entry price that is not positive or not within 20% of the live price. Run on the artefact's own twelve fabricated entry prices (data/explainability_comparison.json, factors 7.3, 0.03, -1 and 1000 on three live prices), it catches 12 of 12, the same as grounding.check, and refuses none of the nine real figures (live price, 24h high and low) on the same symbols. TradingAgents' TraderProposal catches 0 of 12, but it is a schema, not a checker. Gross fabrications are caught by any bound, so this set cannot separate the two; where ARGUS differs is every figure in a free-text thesis, which a two-field validator cannot see, and that has no measured precision or recall: 289 of 774 live cycles (2026-09-12…

python -m argus.eval.explainability_comparison
Every condition and its evidence
  • best implementation studied — TradingAgents' real trader.py, schemas.py, portfolio_manager.py, all three risk_mgmt/*.py debators, reporting.py, and trading_graph.py read in full: trader.py's own grounding instruction (line 36-39) asks the model to anchor prices in the market report, but no real consumer of trader_investment_plan anywhere in the pipeline compares entry_price/stop_loss against it — grepped exhaustively, zero hits
  • best method studied — two real methods compared: TradingAgents' prompt-only grounding instruction (no code enforcement anywhere downstream) vs. ARGUS's real agents.grounding.check — deterministic numeric resolution of every figure in a thesis against the facts the desk actually had, already existing and already tested (test_grounding.py), reused here rather than reimplemented
  • baseline reproduced — TradingAgents' real, unmodified TraderProposal.entry_price validated at 999,999.0 with no relationship to any real fact — the real Pydantic validator raises nothing; its own _coerce_optional_float only normalises string format (placeholder text, a trailing '%', a currency symbol), never the value
  • implementation complete — grounding.check/extract/GroundingReport already existed, already tested end to end (test_grounding.py) before this comparison; this capability wires real live desk facts through it against the real rival, not a stub
  • same input comparison — both real systems checked on the same real, live Bitget current price (and the same fabricated entry_price) for the same real symbols — TradingAgents' real validator and ARGUS's real grounding.check, not a re-implementation of either
  • statistically valid evaluation — swept across 3 real symbols and 4 fabrication magnitudes/directions (7.3x, 0.03x, -1x, 1000x of the real live price) — 12 cases, not one hand-picked figure; TradingAgents' real validator catches 0 of 12, ARGUS catches 12 of 12
  • costs included — real wall-clock cost measured on both real, pure-Python checks per call
  • out of sample test — run against real, freshly-fetched live Bitget ticker data across 3 real symbols never used to design the mechanism, plus a positive control confirming the real current price resolves cleanly on the same live data — not a blanket flag
  • ablation — isolates the exact mechanism: a figure just inside grounding.py's own TOLERANCE constant resolves, the identical figure moved just past it on the same real fact does not — the tolerance boundary is the load-bearing mechanism, verified directly rather than assumed
  • adversarial test — the real rival's edge-case behaviour tested directly: a negative price (-50.0) is accepted with no error, exercising the one boundary _coerce_optional_float does not even attempt to check
  • failure cases documented — three real, measured behaviours of the real validator found by running it: a negative price is accepted unchecked, a percent-distance string is dropped to None rather than converted, and a placeholder string is dropped to None
  • reproducibility proven — the same real thesis and real facts checked twice return the same result
  • no specialist capability superior — scoped explicitly — SCOPE_STATEMENT in eval/explainability_comparison.py. Claimed: on the one checkable property (is a stated number traceable to a real fact), ARGUS's grounding.check enforces it in code and TradingAgents' real schema does not. NOT claimed TradingAgents' full pipeline never catches bad output by any other means — only that the one real, checkable code path performs no value-level check. NOT claimed about TraderProposal.reasoning (free text), only its two numeric fields. NOT claimed ARGUS's mechanism proves a figure is correct, only that it is traceable

Judged: execution realism behind the paper record

TIED10 of 13 conditions

Queue-position modelling ported from hftbacktest and measured against it

Rivalnkaz001/hftbacktest, backtest/models/queue.rs

Same-input testevery model sees byte-identical episodes and the identical L2 view of them; the reproduction grid is shared between ours and the transcribed reference

Why not OWNEDRE-GRADED 2026-09-29 from IMPLEMENTED to TIED (Activity/28_CAPABILITY_CLOSE_PLAN_2.md §25) with hftbacktest's queue models (backtest/models/queue.rs) and its L3/L2 engine. The capability is a faithful port: all eight probability functions reproduce hftbacktest to 1.1e-16 (data/queue_proof.json), and on real CME market-by-order data (ESH4, 2023-12-25, 1,438 orders, hftbacktest 2.4.4, data/hftbacktest_run.json) fill agreement at L3 is 1.0 with the same timestamp on all 1,130 fills. Both sides share the same best model, which is hftbacktest's own PowerProbQueueFunc3 n=3 (queue error 0.04736 against the shipped LogProbQueueFunc2's 0.04809, a 0.0007 margin with no interval on the corrected replay, chosen in-sample on one holiday session). It cannot be won: every arm available to ARGUS is also an hftbacktest arm. Two findings against the row stand beside the tie: the groupwise headline on the…

Every condition and its evidence
  • best implementation studied — queue.rs:44-330 read in full; the five probability functions transcribed and the ProbQueue update rule quoted in the port's own docstring
  • best method studied — prob() is P(a cancellation came from behind), not P(fill) — read off queue.rs:183-204 after a first draft scored the wrong quantity
  • baseline reproduced — 8 model/parameter combinations reproduce the Rust formulas to 1.1e-16 on 9 (front, back) pairs spanning both extremes
  • implementation complete — all five probability functions, RiskAdverse, ProbQueue and the L3 FIFO queue, including the cum_trade_qty double-count guard and the min() clamp
  • same input comparison — every model sees byte-identical episodes and the identical L2 view of them; the reproduction grid is shared between ours and the transcribed reference
  • statistically valid evaluation — paired 95% interval on per-episode error differences; a win needs the whole interval above zero, and a zero-centred pair is pinned as a non-win
  • costs included — fill overstatement converted at the 4bps gap between our own MAKER_BPS and TAKER_BPS; one regime is won on accuracy and lost on cost, and says so
  • out of sample test — the in-sample winner is carried over to unseen seeds rather than rechosen, so the selection is not re-run as part of the test; 3 of 5 regimes survive
  • ablation — the probability function is replaced by four constants (always behind, always ahead, coin, trades-only); it beats the best of them in 3 of 5 regimes
  • adversarial test — a front-sticky queue that replenishes behind — the model loses it, and the loss is the reported result rather than a tuned-away one
  • failure cases documented — 2 of 5 regimes are losses, both named in the verdict; plus the finding that the most accurate model is not the cheapest
  • reproducibility proven — pure Python, one seeded generator, no wall clock in the scoring path; the same seed reproduces episodes and scores exactly

Twelve of thirteen. The book recorder is running so the simulator's parameters stop being ours — and as of 2026-09-15 that calibration is read per elapsed-time horizon rather than pooled, which moved the near-touch turnover figure the book actually supports from 71.3% to 24.0% at the horizon nearest the per-event timescale (data/book_calibration.json). That narrows the gap; it does not close it. Updated 2026-09-22, twice the same day. First: the real-MBO replay path (eval/mbo_queueproof.py) built and tested against the real databento_dbn schema, ready to run, no real data read yet. Second, same day: found and used a real, account-free data source (nautilus_trader's own public DataBento-adapter test fixtures, real CME sessions, not DataBento's paid archive) and actually ran the comparison — data/mbo_queue_proof.json now carries a real result. It is a genuine, significant win for hftbacktest's own probability approach on one real session, genuinely contradicted by a second, thinner real session, and openly reported as both rather than the flattering half alone. The state stays IMPLEMENTED: a preliminary, two-sample, sample-disagreeing result on a holiday session and a two-second burst is real evidence, not yet the settled comparison this condition needs — and saying so plainly is the honest use of what was found, not a reason to round it up.

Track 1

Not entered: Track 1 is scored on strategy returns alone. These capabilities sit underneath the other two and were measured the same way.

Arbitrage

TIED11 of 13 conditions

Net executable arbitrage vs. a fee-blind detector

Rivalmaxme/bitcoin-arbitrage real profit-detection core (get_profit_for)

Same-input testthe exact walk, HiGHS, NetworkX's cycle test, maxme's fee-blind detector and the old decomposition all scored on the same real, simultaneous Bitget spot-rToken and perpetual books: 240 regular-hours snapshots

Why not OWNEDRE-GRADED 2026-09-28 from IMPLEMENTED to TIED (Activity/27_CAPABILITY_CLOSE_PLAN.md §3). The console now answers an arbitrage question on the live books with the exact two-book walk (lui/arbitrage.py); the flat-constant decompose() that lost (precision 5.8%) is on no answer path. On 640 real Bitget book snapshots (regular hours, a later held-out capture, a weekend) the walk makes the same verdicts as HiGHS and NetworkX's cycle test and matches HiGHS's optimum to 4e-14 USDT, while maxme's fee-blind detector makes 111 false accepts on the first capture. Why it cannot be won: against the general solvers both sides are exact, so correctness cannot separate them; only latency does (tens of microseconds against milliseconds), which a 65ms median leg skew makes immaterial.

python -m argus.eval.arbitrage_comparison
Every condition and its evidence
  • best implementation studied — maxme/bitcoin-arbitrage's real arbitrer.py read in full — get_profit_for/get_max_depth/arbitrage_depth_opportunity/arbitrage_opportunity/tick, and the one fee-aware code path in the whole real repository (observers/traderbotsim.py, fee=0 default, an optional simulator, never the detection layer) confirmed by reading it too
  • best method studied — two real methods compared: maxme's real profit = sell_total*w_sellprice - buy_total*w_buyprice (order-book depth only, no cost term of any kind) vs. ARGUS's real five-stage decomposition (fee, spread-crossing, slippage, execution probability, failed-leg survival) already measured against Bitget's own published index series
  • baseline reproduced — maxme's real get_profit_for/get_max_depth/arbitrage_depth_opportunity run unmodified, byte-hash-pinned against the vendored source (commit f41684a3226710853096a4e93c3b823f92079abf)
  • implementation complete — the console answers a live spot-versus-perpetual arbitrage question with the exact two-book walk (lui/arbitrage.py -> research/executable_arb.best_arbitrage), fetching both books and each venue's published taker fee; decompose() is no longer on any answer path
  • same input comparison — the exact walk, HiGHS, NetworkX's cycle test, maxme's fee-blind detector and the old decomposition all scored on the same real, simultaneous Bitget spot-rToken and perpetual books: 240 regular-hours snapshots
  • statistically valid evaluation — verdicts compared snapshot by snapshot, with a ticker-bootstrap interval on precision; groupwise-checked (data/groupwise_audit.json)
  • costs included — ARGUS's own cost decomposition IS the subject; both real per-call costs measured directly on the same computation
  • out of sample test — a 160-snapshot capture taken after the code was frozen and a 240-snapshot weekend capture, both scored without change: the exact walk ties the optimum on each
  • ablation — a real, run cost-stack ablation found the fee term ALONE does not explain the disagreement at the median spread — spread-crossing plus slippage alone already exceed it — the actual result of running the ablation, not the narrower claim originally planned before it was run
  • adversarial test — the real, unmodified maxme detector run on order-book depth shaped to the real median spread reports a positive profit ARGUS's real decomposition refuses
  • failure cases documented — an unplanned real finding from running the failure case: maxme's real get_profit_for()/get_max_depth() crash with a genuine IndexError on an empty order-book side — no length guard on the first line's list index — this comparison's own first draft wrongly assumed it would return cleanly, fixed to assert the real, observed outcome
  • reproducibility proven — both real systems reproduce identical output on identical input, twice
  • no specialist capability superior — scoped explicitly — SCOPE_STATEMENT in eval/arbitrage_comparison.py. Claimed: on the question that decides whether a headline spread is real money — does the reported number survive the full cost stack — ARGUS's real decomposition answers it and maxme's real detection layer does not answer it at all, for any cost term. NOT claimed that maxme is a currently-profitable production system — an older, small open-source project studied as a real, verifiable example of the fee-blind pattern ARGUS's own module already named as the common failure mode, not a claim about current market use. NOT claimed every positive maxme reading is wrong — the largest observed real spread clears ARGUS's own real cost stack too, reported honestly. NOT claimed the swept disagreement rate is a live-universe measurement — matched to ARGUS's own measured distribution's first two moments, not identical to the real historical series bar-for-bar

Cross-Market Correlation Strategies

LOST11 of 13 conditions

Cross-market cointegration with corrected multiple testing

Rivalstatsmodels adfuller; QuantConnect/Lean pearsonr pair ranking; FinceptTerminal

Same-input testARGUS's real adf() and the real statsmodels adfuller run on identical series across three shapes (random walk, stationary AR(1), trending); the reimplemented and real FinceptTerminal formulas verified to agree exactly on identical input before either is used further;

Why not OWNEDRE-GRADED 2026-09-29 from IMPLEMENTED to LOST (Activity/28_CAPABILITY_CLOSE_PLAN_2.md §7). The harness's own pre-registered decision in data/general_coint_comparison.json is rival_wins: ARGUS's production screen does not hold its false-discovery rate at q 0.05 (18.9% on planted universes, 10.0% on null), while 128 general pipelines do. The out-of-sample-confirmed set the desk trades holds it (4.2% planted, 0% null) but at power 0.274, below arch's Phillips-Ouliaris Pz with the same correction and the same gate (power 0.333 at 6.1%); that gap was measured against the screen (+0.021, s.e. 0.026) and has not yet been measured against the confirmed set. Under broken relationships the confirmed set's FDR is 17.5% (s.e. 5.2%). On the real 12-rToken universe every pipeline finds the same one or two pairs, a tie. data/cointegration.json's '0 of 66 pairs survive' is not cited as evidence: it…

python -m argus.eval.cointegration_comparison
Every condition and its evidence
  • best implementation studied — statsmodels' real adfuller (stattools.py) read and reproduced; Lean's real PearsonCorrelationPairsTradingAlphaModel and FinceptTerminal's real statistical_arbitrage.py both read in full (research/architecture/27-pairs-and-cointegration-teardown.md, file:line throughout), independently re-verified here against the currently-installed statsmodels 0.15.0 rather than trusted from the teardown's older environment
  • best method studied — three real methods compared: statsmodels' formal ADF/EG test (a null hypothesis and a p-value); Lean's real correlation-threshold screen (no null, no p-value, no correction for pairs compared); FinceptTerminal's real full-sample z-score (the scored point is a member of its own baseline) against ARGUS's real trailing-window zscores() (the scored point structurally excluded by the slice's own upper bound)
  • baseline reproduced — the real, installed statsmodels.tsa.stattools.adfuller imported directly (no vendoring needed — a real, published library); Lean's real pearsonr-ranking core vendored whole, byte-hash-pinned (commit 23b735d99a357807dc0df9f4c51d30f05fe0d277); FinceptTerminal's real, unmodified function run once, locally (AGPL-3.0 with a commercial-use clause — never vendored), its exact output reproduced by an independent reimplementation built from reading the source, verified to match before being trusted
  • implementation complete — adf/engle_granger/pair_test/scan/zscores all evaluate real series end to end
  • same input comparison — ARGUS's real adf() and the real statsmodels adfuller run on identical series across three shapes (random walk, stationary AR(1), trending); the reimplemented and real FinceptTerminal formulas verified to agree exactly on identical input before either is used further; Lean's real ranking core and ARGUS's real benjamini_hochberg/bonferroni run on the identical 190 constructed, genuinely-uncorrelated pairs
  • statistically valid evaluation — the multiple-testing exposure is measured across 190 pairs, not one convenient pair, and lands close to the analytically expected false-positive count (7 observed vs. 9.5 expected at 5%), confirming the construction genuinely behaves like independent noise rather than being asserted to
  • costs included — both real per-call costs measured directly, reported without a forced winner
  • out of sample test — ARGUS's real pair_test() fits the hedge ratio in-sample and tests stationarity only on data the fit never saw — the frozen-ratio design already in production, exercised end to end by the existing test suite
  • ablation — the self-inclusion understatement swept across five window sizes on the identical outlier magnitude, confirmed to shrink monotonically as the window grows — proving the effect is the self-inclusion mechanism, not an artefact of one arbitrary window size
  • adversarial test — a constructed 27-sigma-style outlier scored by FinceptTerminal's real reimplemented formula understates its own z-score by 82%, verified against their real function's real output first
  • failure cases documented — both real systems' rejection of a too-short series run and compared
  • reproducibility proven — both real systems reproduce identical output on identical input, twice
  • no specialist capability superior — scoped explicitly — SCOPE_STATEMENT in eval/cointegration_comparison.py. Claimed: on the two properties that decide whether a 'cointegrated pair' survives real trading — a baseline that excludes the point it scores, and a selection corrected for how many pairs were compared — ARGUS has both by construction and the two real specialists studied have neither. NOT claimed that FinceptTerminal's code was run inside ARGUS's own repository — AGPL-3.0 with a commercial clause makes that the wrong posture; only its real output was used, once, to verify an independent reimplementation. NOT claimed that Lean's whole OOP alpha model was vendored — only its self-contained ranking computation, which has no self-reference to the class at all. NOT claimed that correlation is never a legitimate first screen for a pair — the claim is narrower: whatever screen is used, a fixed threshold across many candidates has a computable false-positive rate, and only ARGUS's real code reports it

Cross-Asset Allocation / Rotation

TIED13 of 13 conditions — against a rival that does not lead the sub-theme

Data-honest cross-asset breadth rotation vs. a silently-dropping reference

Rivalpytaa real VAA breadth rule (vigilant_allocation) + Signal.momentum_score

Same-input testboth real systems scored on ARGUS's actual, live Bitget cross-asset candle history — tokenized US equities, real crypto majors, a real gold token, all confirmed live on the same public futures book — agreeing to floating-point identity everywhere both are defined (BTCUSDT/ETHUSDT/NVDAUSDT:…

Why not OWNEDRE-GRADED 2026-09-26 from OWNED to TIED: the rival it beat, pytaa, is the reference that silently drops weight, and the best general-purpose tool for the same job does not. On 36 byte-identical cases from a frozen real Bitget corpus (data/general_rotation_comparison.json), pandera with pydantic, configured to the same contract, handles 36 of 36, as ARGUS does; pandera alone and Great Expectations 33 (silent on an empty safe set, a NaN step and an asset in both sets); raw pytaa 11. ARGUS is faster (4.7ms a call against 484ms and 2.9s), which is not material at a monthly rebalance. The ablation holds: the rotation.py that predates the 2026-09-25 contract, byte-pinned, handles 20 of 36 with 14 silent accepts. Also found: pytaa bins by business month-end and ARGUS by calendar month, so on real BTCUSDT the two scores agree exactly only when no anchor month ends on a weekend and otherwise…

python -m argus.eval.rotation_comparison
Every condition and its evidence
  • best implementation studied — pytaa's real strategy/signals.py and backtest/positions.py read in full — Signal.classic_momentum/momentum_score/sma_crossover/protective_momentum_score and vigilant_allocation/kipnis_allocation/aqr_trend_allocation — confirming vigilant_allocation is the real, published (Keller & Keuning 2017 SSRN 2543979), self-contained breadth rule matching the handbook's own 'risk-on/off rotation (US stocks <-> Crypto <-> commodities)' framing for this exact sub-theme
  • best method studied — two real methods compared: pytaa's real weighted four-horizon momentum score plus discrete safe/risk breadth switch (pandas, no transaction cost or minimum-history guard anywhere in either function) vs. ARGUS's pure-Python reimplementation (src/ carries no pandas dependency) of the exact same published formula, with a hard refusal below the real formula's own minimum history and turnover priced at the real 6bps taker rate
  • baseline reproduced — pytaa's real vigilant_allocation and Signal.__init__/classic_momentum/momentum_score run unmodified, byte-hash-pinned against the vendored source (commit 317ad1c6618def4e1dc0fb9879050c6f9f2f026c)
  • implementation complete — momentum_score/breadth_allocation/propose_rotation/RotationPlan evaluate real monthly closes end to end, including the CLI in rotation.py's own main() against live Bitget history
  • same input comparison — both real systems scored on ARGUS's actual, live Bitget cross-asset candle history — tokenized US equities, real crypto majors, a real gold token, all confirmed live on the same public futures book — agreeing to floating-point identity everywhere both are defined (BTCUSDT/ETHUSDT/NVDAUSDT: 0.7445517502236605/1.6932445870638801/0.40376760986359983 on both sides, to the last representable digit, 2026-09-15)
  • statistically valid evaluation — checked across the full real universe this comparison can reach — the four design symbols plus fourteen further real held-out symbols (the remaining rTokens, three more crypto majors, silver) — not one convenient instrument
  • costs included — real wall-clock cost measured on both real sides on the same real data — pandas Signal.momentum_score() vs. ARGUS's pure-Python momentum_score(), measured at roughly 2ms vs. under a microsecond per call, both numbers reported plainly
  • out of sample test — the fourteen held-out real symbols beyond the four the module was designed against all agree; SCOPE_STATEMENT states explicitly why a disjoint in-sample/out-of-sample *time* split was not attempted instead — every real instrument's Bitget listing history is currently only ~13 months deep, which is short of what a split would need on either side
  • ablation — a real, run sweep of the negative-score count (0 to 4, safe asset held at its real, measured NaN condition) found and confirmed a closed form: the real reference's vanished fraction equals exactly min(1, step * is_neg) at every swept point, reaching 100% vanished at full flight-to-safety — the exact moment the breadth signal is loudest
  • adversarial test — the minimum-history boundary itself tested on both real sides at 12, 13 and 14 monthly points — confirms 13 is the exact threshold, not off by one in either direction, and that an empty safe_assets list or an all-NaN input do not raise in the real reference either, each producing its own distinct silent-failure shape
  • failure cases documented — three distinct real silent-failure shapes found by running the real reference, not assumed: a NaN safe-asset score drops exactly its intended weight share; an empty safe_assets list still reserves and then silently drops a phantom safe share; an all-NaN input returns a silent all-zero book with no exception and no warning at all
  • reproducibility proven — the real baseline-reproduced comparison run twice produces byte-identical JSON output
  • no specialist capability superior — scoped explicitly — SCOPE_STATEMENT in eval/rotation_comparison.py. Claimed: on data-availability and failure-mode handling for a breadth rotation rule computed on ARGUS's own real, short-history cross-asset universe, ARGUS's implementation refuses cleanly where the real reference silently loses part or all of the intended allocation. NOT claimed the rotation rule itself has a validated forecasting edge or backtest Sharpe — cross-asset rotation is directional by construction and no return claim is made here. NOT claimed pytaa is broken as a monthly-rebalanced-ETF tool — the failure modes measured are specific to feeding it assets whose real listing history is shorter than its own formula's minimum lookback, a condition ARGUS's own live universe currently meets and a traditional ETF universe normally would not

Factor research (validation machinery)

TIED11 of 13 conditions

Overfitting gates that raise instead of returning NaN

Rivalpolakowo/vectorbt deflated_sharpe_ratio (accessors.py:596) - not itself gated anywhere in vectorbt, but silently NaN on a single trial (var_sharpe = np.var of one value, ddof=1); a caller filtering with a negated <…

Same-input testARGUS's real deflated_sharpe and vectorbt's real deflated_sharpe_ratio run on 1,220 identical inputs (5 hand-designed + a 1,215-case deterministic grid over observed x n x trials x variance x skew x kurtosis) - agree EXACTLY (max abs diff across the whole sweep: 0.0) on every valid input, confirmed by running both…

Why not OWNEDRE-GRADED 2026-09-29 from IMPLEMENTED to TIED (Activity/28_CAPABILITY_CLOSE_PLAN_2.md §3) with a pydantic v2 validate_call + FiniteFloat contract around vectorbt, the best general tool for the same job, on 1,332 identical deflated-Sharpe inputs (data/general_overfitgates_comparison.json). On the 24 real-producer cases (real Bitget hourly candles, a 7-variant family, net of 12 bps) ARGUS and the pydantic contract return identical grades: 7 correct values and 17 correct refusals each. Against the named baseline ARGUS wins on the same real cases: bare vectorbt returns 17 silent-wrong values, all 17 discordant cases favour ARGUS (exact sign test p about 1.5e-5). ARGUS's remaining lead over pydantic (5 silent-wrong and 4 over-refusals) is on the poisoned and overflow tiers, which are constructed inputs, and on overflow ARGUS refuses 3 of 6 inputs that have a real answer. The guards…

python -m argus.eval.dsr_comparison
Every condition and its evidence
  • best implementation studied — vectorbt, empyrical and Bailey & Lopez de Prado read line by line
  • best method studied — deflated and probabilistic Sharpe taken from the source papers
  • implementation complete — DSR, PSR, OOS decay, rolling stability all computed and reported
  • statistically valid evaluation — the gate is applied to all trials, not only to the surviving candidates
  • costs included — every reported Sharpe is net of the 12bps round-trip taker fee
  • out of sample test — out_of_sample_decay alerts when OOS falls below half of in-sample
  • failure cases documented — 0 of 8 primitives return no verdict on the current run (data/overfit_gates.json failure_cases.count; corrected 2026-09-29 from a stale '2 of 8'). The documented failure case is the one the gate is built for: the deflated-Sharpe gate needs a variance across trials and raises rather than returning NaN when the observations cannot supply one. The refusal is designed — vectorbt's own deflated_sharpe_ratio silently NaNs on a single trial — and a gate that cannot decide has still protected nothing on that input, which is why it is counted as a failure case rather than folded into the rejections
  • baseline reproduced — vectorbt's real deflated_sharpe_ratio()/approx_exp_max_sharpe() (vectorbt/returns/metrics.py, the exact file this capability's baseline already names) vendored verbatim - byte-verified against commit 34b6d5935e3ea3eccd549e2592bc0f455b8045f5, pinned by SHA256 - and actually executed via a sys.modules shim satisfying its one internal import (vectorbt._typing.Array1d) with a single-attribute stand-in rather than installing plotly/numba to satisfy a type annotation. The specific defect line itself (accessors.py:596, var_sharpe = np.var(x, ddof=1)) is reproduced directly as the same bare numpy call, cited to its exact line, not vendored (nothing else is around it worth vendoring)
  • same input comparison — ARGUS's real deflated_sharpe and vectorbt's real deflated_sharpe_ratio run on 1,220 identical inputs (5 hand-designed + a 1,215-case deterministic grid over observed x n x trials x variance x skew x kurtosis) - agree EXACTLY (max abs diff across the whole sweep: 0.0) on every valid input, confirmed by running both real functions, not asserted from the formula's own resemblance on paper
  • ablation — the two NaN-input guards this comparison's own findings added to backtest/metrics.py, each confirmed independently load-bearing: deflated_sharpe's variance_of_trials NaN check and probabilistic_sharpe's observed/benchmark NaN check both raise on a tripped (NaN) case and both pass through cleanly on an otherwise-identical cleared (finite) case, verified programmatically
  • adversarial test — a real bug this comparison found in ARGUS's OWN code, not the baseline's: deflated_sharpe's pre-existing guard was `variance_of_trials < 0`, which does not catch NaN (float('nan') < 0 is False in IEEE 754) - the identical fails-every-comparison shape that makes vectorbt's own gate silent. A caller computing variance the way vectorbt's accessor does (np.var(x, ddof=1) on one trial) and passing it straight into ARGUS's own function would have gotten a silent NaN back. probabilistic_sharpe (deflated_sharpe's own single-trial reduction) had the identical gap independently. Both fixed the same session this was found, verified by re-running the exact failing case after the fix
  • reproducibility proven — both functions are pure, deterministic transforms - no model, no seed, no simulation on either side. The 1,215-case sweep is itertools.product over fixed grids, not RNG-seeded, same reasoning as every other sweep in this project: a seed's meaning can shift across Python versions
  • no specialist capability superior — scoped explicitly - SCOPE_STATEMENT in eval/dsr_comparison.py. Claimed: the two implementations compute the identical published formula (verified over 1,220 real-run cases, not assumed from reading), and ARGUS's gate refuses exactly where vectorbt's real code would go silently NaN - now genuinely true after this comparison's own finding was fixed, not merely asserted by design. NOT claimed: that this was already true before the fix - the pre-existing guard shared vectorbt's own blind spot until this comparison found it. Also NOT claimed: that vectorbt is a worse DSR implementation in general - the formula itself is identical and correct on every valid input; the only measured difference is input validation at the edges, and vectorbt genuinely has none anywhere in the package for this specific function (grepped directly: no >/< comparison against deflated_sharpe_ratio anywhere in the repository)
TIED11 of 13 conditions

Typed factor grammar with no execution surface

RivalGoogle CEL (cel-expr-python 0.1.3) for safe static typing, Polars 1.44.2 for evaluation speed, and microsoft/qlib's real expression engine (qlib/data/base.py, ops.py, data.py, utils) as the named rival

Same-input testmean/std/corr run on an identical fixed series (diff 0.0/0.0/1.11e-16); rank run on five designed cases isolating ties/constant/single-observation, plus swept across every lookback a real captured NVDAUSDT book-tape series supports — both systems, same input, every case

Why not OWNEDRE-GRADED 2026-09-29 from IMPLEMENTED to TIED (Activity/28_CAPABILITY_CLOSE_PLAN_2.md §4) with Google CEL (cel-expr-python 0.1.3), the best general-purpose safe typed expression language, run live on the same trees and the same 1,439 real NVDAUSDT hourly closes (data/general_grammar_comparison.json). On the capability's defining properties the two are equal: both reject 10 of 10 ill-typed cases before touching data, and neither has an execution surface (the AST scan of grammar.py, grammar_text.py and grammar_series.py is clean; CEL is non-Turing-complete by design). Against the named rival ARGUS wins the defining property: qlib's ExpressionProvider evaluates expressions through a nested eval (CWE-95). ARGUS's only edge over the general tools is duplicate identity on designed pairs (normal_form merges 8 of 8, SymPy 7, CEL 0), where no interval is possible. It LOSES on speed to Polars,…

python -m argus.eval.grammar_comparison
Every condition and its evidence
  • best implementation studied — RD-Agent, Alpha Jungle, Qlib and the 101 Formulaic Alphas read for operators (factor-discovery-audit.md); qlib's real expression engine additionally read in full and vendored — base.py (Expression/ExpressionOps/Feature), ops.py (1681 lines, every real Rolling/PairRolling operator incl. Rank/Mean/Std/Corr), and the field-parsing path (utils/__init__.py's parse_field, data.py's ExpressionProvider) an earlier review wrongly marked unvendorable — corrected 2026-09-16, see qlib_expression_base.py's own header
  • best method studied — both real methods run and compared: ARGUS's typed dataclass grammar (Window/Corr, validated at construction) vs. qlib's real string-expression engine (parse_field's regex rewrite -> eval()) — the structural difference that produces the adversarial finding below is a property of the two DESIGNS, confirmed by running both, not inferred from either's docs
  • baseline reproduced — qlib's real Mean/Std/Rank/Corr operators and real ExpressionProvider.get_expression_instance() run unmodified, byte-hash-pinned against the vendored source (qlib_expression_base.py/_ops.py/_eval_surface.py, commit 79633dd9506ea689e5400dea0197717b5b3d74b7)
  • implementation complete — Window/Corr's full OPS vocabulary (mean/std/rank/argmax/.../slope) evaluates
  • same input comparison — mean/std/corr run on an identical fixed series (diff 0.0/0.0/1.11e-16); rank run on five designed cases isolating ties/constant/single-observation, plus swept across every lookback a real captured NVDAUSDT book-tape series supports — both systems, same input, every case
  • statistically valid evaluation — rank swept across 15 real-market lookbacks (not one convenient case), finding both agreement and divergence, not a cherry-picked direction
  • costs included — both real per-call costs measured directly (ARGUS Window vs. qlib Mean.load)
  • out of sample test — rank comparison additionally run on data/book_tape.jsonl — real captured L2 book snapshots, not built from any of the five designed in-sample cases
  • ablation — the AST scan itself is shown sensitive, not vacuous: run against a counterfactual Window.evaluate that dispatches via eval() (never touching the real grammar.py), confirming the scan DOES flag eval() when genuinely present rather than always reporting clean
  • adversarial test — the grammar cannot reach attributes or call arbitrary code, pinned by test (test_grammar.py); separately, qlib's real ExpressionProvider IS shown reachable to arbitrary code — a crafted field string run through its real, unmodified get_expression_instance() executes a nested eval('1+1'), returning 2, a live CWE-95 in real Microsoft-maintained code
  • failure cases documented — both sides' real handling of MALFORMED (not malicious) input run: ARGUS rejects an unknown op at Window construction, before evaluate() is ever reachable; qlib's real SyntaxError/NameError handler cleanly catches three malformed field strings — the vulnerability is narrower and worse than malformed input: a syntactically VALID expression no handler is positioned to catch
  • reproducibility proven — every expression has a canonical form, so a factor cannot be paid for twice (test_grammar.py); separately, both real comparison functions run twice on identical input and agree bit-for-bit
  • no specialist capability superior — scoped explicitly — SCOPE_STATEMENT in eval/grammar_comparison.py. Claimed: on numeric fidelity, ARGUS matches qlib's real mean/std/corr to float precision and diverges from its real rank only by a named, algebraically explained convention (not a bug); on execution surface, ARGUS's grammar structurally cannot reach eval/exec anywhere (AST-verified), while qlib's real code can and, run here, does. NOT claimed: that qlib's Rank convention is wrong, or that every qlib field string is exploitable (malformed syntax IS caught cleanly). NOT claimed: that this closes the vocabulary-breadth gap in the blockers below — that is a separate axis (which fields the grammar can express), untouched by this comparison
TIED11 of 13 conditions

Cross-sectional factor evaluation

Rivalmicrosoft/qlib, which groups a (datetime, instrument) frame by datetime and ranks within each group

Same-input testARGUS's real CrossRank.combine() and qlib's real CSRankNorm run on 61 identical panels (7 hand-designed probing ties/extremes/edge sizes, plus a 54-panel deterministic grid over size x tie-density x spread, none tuned to any specific case) - agree EXACTLY on relative order on every single one, verified by an…

Why not OWNEDRE-GRADED 2026-09-27 from OWNED to TIED: the two agree exactly on every group of two or more, and the one input where ARGUS is safer (a single-instrument group, which qlib ranks 1.73) cannot occur in ARGUS's own decisions because the panel is aligned on shared timestamps. Route back: a real workload where groups shrink - a universe with staggered listings or halts - measured against qlib's handling of it

python -m argus.eval.crosssection_comparison
Every condition and its evidence
  • best method studied — all 101 Formulaic Alphas read and scored against our grammar; 46 blocked here
  • implementation complete — crossrank and crossscale, aligned on shared timestamps, innermost-first
  • adversarial test — truncating the future must not move a past value — the standard invisible leak in cross-sectional operators, pinned for rank, scale and the nested case
  • failure cases documented — a one-symbol universe and a single-symbol evaluation both raise rather than returning the neutral 0.5 that would silently change the factor
  • costs included — charged per unit of weight moved at the venue's own 6bps per side
  • statistically valid evaluation — 80 trials deflated; phases averaged rather than selected; spread published
  • out of sample test — chronological half-split decay computed for every rule
  • best implementation studied — three of the backtest-engine repos this project reads first checked directly for a cross-sectional (same-timestamp, across-instrument) ranking primitive: qlib has one (CSRankNorm, groups a (datetime, instrument) frame by datetime and ranks within each group — exactly the baseline this capability names); polakowo/vectorbt's only rank() (signals/accessors.py:1298) ranks consecutive SIGNAL EVENTS through TIME within one series, a different axis entirely, not cross-sectional; QuantConnect/Lean has no match for 'CrossSectional' anywhere in the repository (grepped case-insensitively, zero hits). qlib is not merely cited, it is the only one of the three with the primitive this capability is being measured against
  • baseline reproduced — qlib's real CSRankNorm (qlib/data/dataset/processor.py, the same file this capability's baseline field names) vendored verbatim — byte-verified against commit 79633dd9506ea689e5400dea0197717b5b3d74b7, pinned by SHA256 so the check survives without the external clone present — and actually executed via a sys.modules shim satisfying its own qlib-internal imports with stand-ins that raise NotImplementedError if ever reached, rather than editing a line of the vendored source. Confirmed correct against its own docstring's worked example: [1,2,3,4,5] -> [-1.038,-0.346,0.346,1.038,1.73]
  • same input comparison — ARGUS's real CrossRank.combine() and qlib's real CSRankNorm run on 61 identical panels (7 hand-designed probing ties/extremes/edge sizes, plus a 54-panel deterministic grid over size x tie-density x spread, none tuned to any specific case) - agree EXACTLY on relative order on every single one, verified by an argsort-with-tie-groups comparison, not eyeballed
  • ablation — ARGUS's crossrank has two design choices, each shown independently load-bearing by comparing the real function against itself with one choice disabled: midrank tie handling (disabling it changes [5,3,3,1]'s tied pair from 0.5/0.5 to 0.333/0.667) and the n<=1 neutral guard (disabling it produces NaN via an unguarded /(n-1) rather than 0.5). Both differ from their real-function counterpart, confirmed programmatically
  • reproducibility proven — both functions being compared are pure, deterministic transforms over their input list/frame - no model, no seed, no simulation on either side. The 61-panel comparison battery is itertools.product over fixed grids, not RNG-seeded, for the same reason mandate_comparison's sweep is: a seed's meaning can shift across Python versions and a hand-picked seed is itself a form of hand-tuning
  • no specialist capability superior — scoped explicitly - SCOPE_STATEMENT in eval/crosssection_comparison.py. Claimed: on cross-sectional RANKING specifically, ARGUS and qlib agree exactly on relative order on every panel tested, and ARGUS carries TWO layers of defense a genuinely single-instrument universe qlib's vendored code has neither of - CrossRank.combine()'s own defensive 0.5 fallback if ever called directly, AND research.panel.evaluate_panel's higher-level refusal (raises rather than silently computing a constant 'factor' - see that module's own docstring) before combine() would ever be reached that way in real operation; qlib's CSRankNorm has no equivalent refusal anywhere in the vendored file and, run directly on a one-row input, produces 1.73 - the transform's own maximum, not a neutral reading. NOT claimed: that crossrank is a complete substitute for CSRankNorm - qlib's additional zscore-style rescaling toward unit variance is a real step ARGUS's crossrank does not perform, by design (CrossScale is ARGUS's own separate portfolio-weight operator, a different job). Also NOT claimed: that the single-name divergence has material impact on ARGUS's own real decisions today - RTOKEN_SYMBOLS is a fixed 12-name universe and how often a real trading day's data actually shrinks a group to one instrument was measured on 2026-09-27: never. build_panel keeps only the timestamps every symbol shares, so each of the study's 2,159 real hours ranks all 12 names (data/crosssection_study.json, panel.dropped all 0) - the single-instrument case where the two differ never reaches a real decision, which is why this row is TIED rather than OWNED

The capability is proven correct and the factors are proven worthless on this universe over this window. Both halves are the result.

TIED6 of 13 conditions

Backtest critic, eight checks with quoted lines, vs. backtest-truth's static linter

RivalMrMaca11an/backtest-truth (MIT), its static AST checks (backtest_truth/ast_checks.py check_source) run from its clone on identical code

Same-input testboth tools on the same 21 fixtures (17 planted bugs, 4 clean) and the same 16 independent scripts, each independent flag scored by reading the line

Why not OWNEDTIED on the kinds both tools cover. backtest-truth has static rules for look-ahead and (in its catalogue only) same-bar fills; on the eight planted look-ahead and fill bugs ARGUS names 8 and backtest-truth 5, and on four clean files backtest-truth raises one false alarm and ARGUS none: four discordant cases, all ARGUS's way, p = 0.125 on an exact sign test. The other nine planted bugs are kinds backtest-truth has no static rule for, so they are coverage, not a head-to-head.

python -m argus.eval.backtest_critic_comparison
Every condition and its evidence
  • best implementation studied — backtest-truth read at source: backtest_truth/ast_checks.py:40-95 (the rules taken), rules.py:59 (BT006 listed, not implemented); freqtrade optimize/analysis/lookahead.py read for the dynamic method
  • baseline reproduced — backtest-truth's check_source run from its clone on every fixture and independent script
  • same input comparison — both tools on the same 21 fixtures (17 planted bugs, 4 clean) and the same 16 independent scripts, each independent flag scored by reading the line
  • implementation complete — the console reads a pasted strategy first, before its lines are flattened
  • failure cases documented — the five false alarms found on independent code (counts, chart resamples, a today end date, a ta library read as Pine, a constant comparison) each kept as a test
  • reproducibility proven — python -m argus.eval.backtest_critic_comparison regenerates the artefact from the clones
Top ↑