Experimental Beta

Index Reproduction Report

2026-08-02 · Experimental

Section references throughout point to the May 2026 technical dossier for this system. Figures are quoted exactly as published there.

Purpose. Independent re-derivation of every quantitative claim in the dossier §1.3.1–1.3.2 directly from the production database, plus a full account of the defects found while doing so, with the queries, measured values, deviations and commit hashes required to repeat the exercise.

FieldValue
Report date2026-08-02
DatabaseNeon PostgreSQL 16.14, neondb (eu-central-1)
Database size90 MB · 132,886 rows
Repository state auditedcf6dcce
Reproduction window2026-05-02 .. 2026-05-11 inclusive
Access mode for §1–§5read-only (SELECT only)
Backup taken before any writeevolentity_backup_2026-08-02 (48 MB, 11 tables + schema)

Window predicates are computed_at >= '2026-05-02' AND computed_at < '2026-05-12'. "As of window end" counts use < '2026-05-12'.


1. Results — 15 claims, all reproduced within 0.25%

#Claim (dossier §1.3.1–1.3.2)StatedMeasuredDeviation
1ETS adjusted, mean0.3280.32756990.13%
2ETS range, lower0.2840.28362340.13%
3ETS range, upper0.3750.37450600.13%
4Confidence (CSS), mean0.1520.15238100.25%
5MTI, mean0.2900.28970660.10%
6MTI snapshots1821820%
7Agents registered10,10510,1050%
8Sectors6506500%
9Scoring records4,9504,9500%
10Agreements, total42,49242,4920%
11— research-task40,83440,8340%
12— research-commission1,6581,6580%
13Agreements per active agent7.17.090 (42,492 / 5,993)0.14% (denominator: §4.1)
14Ledger entries10,08810,0880%
15Audit records10,72410,7240%

Supplementary distributions, same window:

  • ETS mean per cycle, across 420 cycles: 0.2850809 – 0.3743789
  • ETS mean per day, across 9 days: 0.2894332 – 0.3715531
  • MTI per snapshot, across 182 snapshots: 0 – 0.3646

2. Queries

-- 1-3, 9: ETS aggregate and scoring-record count
SELECT COUNT(*) n, AVG(ets_adjusted) mean,
       MIN(ets_adjusted) mn, MAX(ets_adjusted) mx,
       COUNT(DISTINCT cycle_id) cycles
  FROM trust_snapshots
 WHERE computed_at >= '2026-05-02' AND computed_at < '2026-05-12';
-- n=4950  mean=0.3275698533135625  mn=0.28362336944284283
-- mx=0.37450603246191677  cycles=420

-- 4: confidence
SELECT COUNT(*) n, AVG(css) mean FROM confidence_snapshots
 WHERE computed_at >= '2026-05-02' AND computed_at < '2026-05-12';
-- n=4950  mean=0.1523809523809701

-- 5-6: market trust index
SELECT COUNT(*) n, AVG(mti_global) mean, MIN(mti_global) mn, MAX(mti_global) mx
  FROM market_index_snapshots
 WHERE computed_at >= '2026-05-02' AND computed_at < '2026-05-12';
-- n=182  mean=0.2897065934065934  mn=0  mx=0.3646

-- 7-8: population
SELECT COUNT(*) agents, COUNT(DISTINCT sector) sectors
  FROM subjects WHERE registered_at < '2026-05-12';
-- agents=10105  sectors=650

-- 10-13: agreements
SELECT COUNT(*) total, COUNT(DISTINCT agent_id) agents
  FROM agreements WHERE initiated_at < '2026-05-12';
-- total=42492  agents=5993
SELECT agreement_type, COUNT(*) FROM agreements
 WHERE initiated_at < '2026-05-12' GROUP BY agreement_type;
-- research_task=40834  research_commission=1658

-- 14-15
SELECT COUNT(*) FROM ledger_entries WHERE created_at < '2026-05-12';  -- 10088
SELECT COUNT(*) FROM audit_records  WHERE recorded_at < '2026-05-12'; -- 10724

3. Index scale — correction to the technical dossier, §1.3.2

the technical dossier, §1.3.2 labels the index as being on a 0–1 scale. That label is incorrect. The scale has always been 0–100.

^1c6b586 (OlehVasylenko2000 2026-03-19 13:48:04 +0100 427)
    ets_raw = min(max(ets_raw, 0.0), 100.0)
  • Introduced by 1c6b586, the first commit in the repository.
  • git log -S "100.0" -- backend/engine/scoring.py returns only 1c6b586; the bound has never been modified. Its value on 2026-05-11 was 100.0.
  • The adjusted mean of 0.328 is 0.328 out of 100, not 32.8%. The measured values are correct; only the scale label in the document is not.

The published methodology page states the scale authoritatively.


4. Terminology note — "cycles"

Claim #9 reproduces exactly as 4,950 trust-snapshot records. Distinct cycle_id values in the same window: 420. Precise phrasing is therefore *"4,950 scoring records across 420 cycles"*.


4.1 Note on claim #13 — which denominator "active agent" means

The figure reproduces as 42,492 / 5,993 = 7.090, where 5,993 is the count of distinct agent_id values appearing in agreements in the window — agents that executed at least one agreement. No other reading lands on 7.1:

DenominatorValueResult
distinct agent_id (executing agents)5,9937.090
distinct principal_id2,86814.82
distinct participants (either role)8,8614.79
all subjects with is_active = true10,1054.20

Worth flagging: "active" is also used inside the system with a different meaning — active_count in the index is the number of subjects carrying a non-zero score (12 today). The claim reproduces under the natural reading of the sentence, not under the system's internal sense of the word.


5. Definition history of the aggregate

VersionCommit · dateDefinition
v01c6b586 · 2026-03-19Mean ETS over active subjects, excluding css_band = 'insufficient' and subjects without a snapshot
v1bb6ea47, 6879b50 · 2026-05-02 · 4d6350b · 2026-05-04SQL aggregation; the css_band exclusion removed
v2e4e88da · 2026-06-29 · 034ebae · 2026-07-01Added AND ts.ets_adjusted > 0; added a one-sided damper floor = prev × 0.95
v3beca2a1 · 2026-08-02Damper made symmetric (±5% per cycle)
v46502437 · 2026-08-02Stale evidence counted at its floor weight instead of dropped

4d6350b (2026-05-04) landed inside the reproduction window; the figures still reproduce to 0.13% because the scored population was unchanged across that boundary.


6. Defects found

Five defects were found by auditing the system against its own published figures. None of them changes any figure in §1. Four are fixed; one is documented and open. §6.6 records a separate architectural gap, which is not a defect against any published claim.

6.1 One-sided damper — FIXED (beca2a1)

034ebae (2026-07-01) bounded only the downward movement of the score:

floor_ets = prev.ets_adjusted * 0.95
if ets_r["ets_adjusted"] < floor_ets:
    ets_r = {**ets_r, "ets_adjusted": floor_ets, ...}

Decay was bounded while increases passed through unbounded — a one-way ratchet. Replaced with a symmetric ±5% per-cycle limiter (damp_ets), covered by 11 unit tests including a multi-cycle regression guard.

6.2 Stale-exclusion inflation — FIXED (6502437)

compute_scores dropped stale evidence. Because a family score is the mean of item weights, dropping the lowest-weighted items raised the mean: a decaying evidence base increased the trust score, contradicting the index's own definition. Measured on production data:

2026-05-112026-08-02
evidence items1,9282,528
stale0 (0.0%)1,928 (76.3%)
mean weight, all items0.7703530.170255
mean weight, non-stale (what was scored)0.7703530.557435
inflation factor1.000×3.274×

The May figures were therefore not inflated by this mechanism; the factor was exactly 1.000 because nothing had gone stale yet.

Second consequence, found only by re-running. Exclusion also erased differentiation: subjects differ in what *fraction* of their evidence is stale, and dropping stale items discarded exactly that difference. Before the fix the twelve principals differed by 0.0016; after it, by 0.121 — the subject whose staleness ratio is 54% against the others' 77% separates from the rest.

Fixed by counting stale evidence at its floor weight, which makes the mean over a fixed evidence set monotonically non-increasing as it ages. 11 unit tests, including per-family and mixed-base monotonicity ("ageing never raises the score").

6.3 Path-dependent anti-gaming multiplier — OPEN, documented

The AG-02 burst penalty is written onto an evidence row while a burst is in progress and persists there. It cannot be re-derived from any later instant: at the May cycle timestamp the 4-hour burst window contains 0 items, yet the rows carry a stored multiplier of 0.3495 applied days earlier.

The engine is therefore not a pure function of (evidence, reference time). Recomputing the multiplier during replay diverges by exactly ×2.50000 (= 1 / AG02_BURST_PENALTY_MULTIPLIER), uniformly across all twelve subjects. A faithful replay restores the stored multipliers; REPLAY_RECOMPUTE_AG=1 demonstrates the divergence.

For an index whose purpose is auditability this is material: a value that cannot be independently re-derived from evidence is not fully auditable. Making the engine pure is core-hardening work and is not claimed as complete.

6.4 Silent coefficient substitution — FIXED (6502437)

The engine fell back to built-in coefficients with only a log warning if the deployed coefficient set was absent. The two sets were verified byte-identical, so no published figure is affected — but the failure mode is that a run on another machine would produce authoritative-looking numbers from unknown coefficients. REQUIRE_PRIVATE_WEIGHTS=1 now makes this a hard error, and both batch tools set it, so a published figure cannot come from substituted coefficients. Provenance is exposed as WEIGHTS_SOURCE / AG_CONFIG_SOURCE.

6.5 Negative agreement durations — cause FIXED, historical rows retained

1,474 agreements record `completed_at` earlier than `initiated_at`, i.e. a negative duration. All of them were written in a two-day burst on 2026-05-02..04, all research_task / settled, 2.942% of all agreements.

The inversion is sub-millisecond: 182 µs to 4,674 µs, mean 460 µs.

Cause, located in code rather than inferred: completed_at was stamped when the ORM object was constructed (backend/api/__init__.py), while initiated_at came from the column default (backend/models/__init__.py:248), which SQLAlchemy evaluates later at flush time. The gap between those two moments is exactly the observed magnitude. Both ends now come from a single clock read, with a regression test asserting the invariant.

Scope of impact, measured rather than assumed:

  • No published figure changes. Claims #10–12 are row counts (42,492 total, 40,834 settled, 1,658 pending) and are unaffected by the ordering of two columns within a row.
  • No score changes. Agreements do not feed the scored evidence: only 2 SF-06 evidence items exist in the entire database, and the twelve scored principals carry SF-07 and SF-05 evidence only.
  • What is affected is any metric derived from agreement *duration*, which would compute as negative for these rows. No such metric is currently published.

Of the 1,480 agreements that record a completion time at all, 1,474 (99.6%) carry the inversion; the remaining 6 have durations averaging 4.3 hours and are a genuinely different population. The historical rows are not rewritten — they are recorded here instead.

6.6 Agreement outcome never transitions — ARCHITECTURAL GAP, not a defect against any claim

the dossier does not rely on this. It reports agreement *types* — 40,834 research-task and 1,658 research-commission — and both reproduce exactly (claims #11–#12). Nothing in the dossier states that agreements were settled, so nothing below contradicts the submitted document. It is recorded because it is a real property of the data model, not because it creates a discrepancy.

No code anywhere assigns Agreement.outcome. The only reference outside the insert statements is a read (backend/engine/spawn_logic.py:27, filtering pending). An outcome is fixed when the row is written and never changes, so pending is terminal as well.

# backend/scheduler.py:248-261 — bulk path
db.add(Agreement(..., outcome="settled", ...))   # no completed_at

# super_agents/super_agent.py:145 — via the API endpoint
await create_agreement(..., outcome="settled", ...)  # completed_at set here

Measured:

  • 46,942 of 48,416 rows carrying settled (97.0%) have no completion timestamp, because the bulk path never sets one.
  • Joining ledger_entries.reference_id to agreements.agreement_id returns 0 rows, against 10,088 ledger entries — there is no settlement record.

One measurement worth stating precisely, because it is easy to over-read. In the May window each agreement type happens to carry exactly one outcome (research_tasksettled, research_commissionpending, one distinct outcome per type), so grouping by type and grouping by outcome return the same two numbers. That correlation is a property of that window only, not of the schema: across the full dataset research_commission appears with both pending (1,672) and settled (1,455), alongside three further types. Claims #11–#12 are therefore reported and reproduced by agreement_type, which is what the dossier states.

Classified as an architectural gap, open: the data model has no settlement transition, no completion event and no ledger linkage. Closing it means implementing that lifecycle — product work — and historical rows are not rewritten.


7. Reproducing the May cycle with the current engine

backend/tools/replay_may.py reconstructs the evidence state at each stored cycle's own computation instant, pins the engine's clock to it, loads the deployed coefficients, and compares against the stored values. Everything runs inside a transaction that is always rolled back.

subject                             stored ETS  replay ETS    dev%   stored CSS  replay CSS   dev%
Nazar-SuperAgent-01-20260503          0.283623    0.283623   0.00%     0.152381    0.152381  0.00%
…all twelve…
WORST DEVIATION  ETS=0.000%  CSS=0.000%
VERDICT: REPRODUCED (<=1%)

Two properties matter:

  1. Exact, not "within tolerance". Deviation is 0.000% on both metrics for all twelve principals.
  2. Reproduced under v4. The same 0.000% holds after the §6.2 fix, because nothing was stale in May. The corrections apply forward only and do not restate history.

Determinism required one engine change: compute_decay_weight and apply_antigaming measured age against the current clock, so the same evidence re-scored later produced different weights. Both now take an explicit reference_time (4679fcf, 08c29de). One SF-07 item ingested 2026-05-03 weighs 0.767974 as of 2026-05-11 and 0.100000 as of 2026-08-02.

The qualification in §6.3 applies: the replay restores the stored anti-gaming multipliers rather than deriving them.


8. Re-computation of 2026-08-02

After v3 and v4 the existing population was re-scored in a single batch.

Value
Cycles8 (stop rule: <0.5% change for 3 consecutive)
Aggregate3.0526 → 2.4252 (−20.6%)
Scored population12, unchanged on every cycle
Final spread0.120998 (sd 0.033442)
Bandssuppressed: 12
3.0526 → 2.8921 → 2.7475 → 2.6101 → 2.4842 → 2.4254 → 2.4253 → 2.4253 → 2.4252
   Δ%      5.258    5.000    5.001    4.824    2.367    0.004    0.000    0.004

The first four cycles are limited by the ±5% damper; after that the value falls below the limit on its own, i.e. it reached its natural level rather than resting against a bound.

Final distribution — eleven identical plus one. Not a spectrum:

Nazar-SuperAgent-02-20260504   2.536130   ← 54% of its evidence stale
the other eleven               2.415133 – 2.415136   ← 77% stale

The population contains exactly two distinct evidence profiles and the index produces exactly two distinct values. The mechanism discriminates where the inputs differ; the evidence supply does not yet give it much to discriminate on.

These 8 cycles ran in one batch and are not 8 days of operation. They are recorded in audit_records as v3_migration_start / v3_migration_complete. An earlier, aborted batch was rolled back (trust_snapshots 72, confidence_snapshots 72, market_index_snapshots 3); its audit records were deliberately retained so the intervention remains visible.


9. Forward projection

No new evidence is being ingested, so existing evidence ages and the index declines toward the floor weights that bound it. Derived analytically from the decay floors (backend/tools/project_ets.py), validated against the live value: model 2.425230 vs actual 2.4252.

DateIndexSpreadBand
2026-08-02 (validation)2.4252300.121suppressed
2026-08-242.01110.0547suppressed
2026-09-041.83540.0351suppressed
2026-12-310.76380.0141suppressed
t → ∞0.05490.0141suppressed

Two observations that are unfavourable and stated here rather than left to be discovered:

  1. The index does not reach zero — the asymptote is set by the SF-07 decay floor — but it does keep falling while no evidence arrives.
  2. The spread narrows over time (0.121 → 0.0141). The one differentiated subject converges toward the rest as every item reaches its floor, so the observable discrimination shrinks with the age of the evidence base.

10. Bands — no differentiation has ever been demonstrated

Every scored subject sits in the lowest band, suppressed. This is the correct reading of the present evidence base, not a scoring fault: coverage is 2 of 7 signal families (SF-07: 2,516 items; SF-05: 12), from a single source (D-01), at the two lowest evidence tiers (3 and 4). The next band requires 10.0.

This is not a regression introduced by the fixes above. Across the entire recorded history:

SELECT ets_band, COUNT(*) FROM trust_snapshots GROUP BY ets_band;
-- suppressed: 21981
SELECT COUNT(*) FROM trust_snapshots WHERE ets_adjusted >= 10.0;
-- 0

No snapshot has ever reached the next band — including the May window whose figures are published. the dossier states a numeric range, and that range is accurate; band-level differentiation was never claimed and has never occurred.

Confidence is identical across all twelve principals — 0.152381 to fifteen decimal places — because it is a function of coverage and source diversity: 0.6 × (2/7) + 0.4 × (1/6) = 0.238095… at present, 0.152381 in May.


11. Scope of measurement

Trust scoring is computed at the principal/orchestrator level. Measured:

  • Subjects carrying evidence items: 12
  • Active subjects in scoring scope: 12
  • Distinct subjects with trust snapshots: 12

The scope is constant across the entire history — the same population in the May window and today. The twelve are internal test orchestrators from our own agent operations, and the naming reflects that; this is a synthetic testnet, as the dossier states. Registered agents (10,336 at report date) are not individually scored. Extension from principal-level to per-agent scoring is stated in the dossier as planned work, not as an implemented capability.


12. Data currency

The scheduled scoring job stopped after 2026-07-27 when the compute host serving it was taken offline; the database was unaffected and continued to serve reads throughout. The public site now reads the database directly and a scheduled cycle runs daily in CI (8ae74b9), so the previous compute host is no longer in the path. Every figure displayed publicly is labelled with its computation date.


13. Reproducing this report

  1. Connect read-only to the database.
  2. Execute the queries in §2 verbatim; compare against §1.
  3. Verify the scale claim: git blame -L 425,428 -- backend/engine/scoring.py and git log -S "100.0" -- backend/engine/scoring.py.
  4. Verify the definition history: git show <hash>:backend/engine/scoring.py for each commit in §5.
  5. Re-derive the May cycle: python backend/tools/replay_may.py (read-only, rolled back). Add REPLAY_RECOMPUTE_AG=1 to observe §6.3.
  6. Run the test suite: python -m pytest backend/tests/ — 26 tests covering the damper, coefficient provenance and ageing monotonicity.
  7. Reproduce the projection: python backend/tools/project_ets.py.