FINBOT CENTURY GAUNTLET — EVALUATION SUPERVISOR v0.1

Actual status at delivery
The four recovered ORIGINAL SYNTHETIC scenario runners were executed here.
See evidence/original_scenarios_run.json. These are operational test results,
not a century of returns. Century preflight was invoked and logged BLOCKED:
REPLAY_ADAPTER_NOT_CONFIGURED. No historical income has been invented.
This package is an integration harness, not a completed learning/trading engine.
It does not change the installed gateway, strategy or broker environment.

The Founder's evaluation contract
- 100 years, default 1926 through 2025 (last 100 complete calendar years).
- Starting allocation of $500 for EACH year. Annual accounts are independent;
  gains are not rolled into the next year in this interpretation. If carried
  capital was intended, change the adapter contract before collecting results.
- Attempt a, year y target = 500000 * (1.2 ** (a-1)) * (3 ** (y-1)).
- Attempt 1, year 100 target =
  85896253455335221839410188294270212117017920333500000 USD.
- Absolute percentage deviation = abs(measured income - target)/target*100.
  Pass threshold <= 0.0001%. The target is a goal, not simulated actual income.
  This strict rule rejects both shortfall AND excess greater than tolerance.
- Actual income must be realized net trading income AFTER fees/slippage/costs,
  in nominal USD. External deposits and marked unrealized gains are not income.
- Any annual deviation above threshold creates a timestamped lesson with
  observed discrepancy, proposed corrective action and explicit unimplemented
  solution status. Every blocked evaluation is also recorded with a remedy.
- All 100 annual reports must pass for an attempt to pass. A new attempt raises
  the first-year target 20%, whether the previous completed attempt passed or
  failed, following the original consecutive-attempt instruction.
- Tests mocked to match targets validate scoring only. They are never counted
  as actual strategy performance. Test runs use temporary databases.

Host execution
Python 3.11+; standard library only. No API keys are included or requested.
A trusted host adapter must implement run_year(context) as specified below.
Once connected, start in the project directory:
  python3 gauntlet.py --adapter YOUR_HOST_REPLAY_MODULE --continuous --serve

Open http://127.0.0.1:8890/ on the host. To view through your phone, integrate
its read-only status/lessons responses behind your EXISTING authenticated
mobile gateway. This package does not change public tunnel/authentication
configuration or expose this otherwise unauthenticated monitor publicly.
Loopback is this computer itself and is independent of changing laptop IPs.
The port can be changed with --port. Do not bind a public unauthenticated feed.

Default deadline is Sunday 23:59:59.999999 America/New_York. An explicit example:
  python3 gauntlet.py --adapter YOUR_HOST_REPLAY_MODULE --continuous --serve \
    --until 2026-10-25T23:59:59-04:00
The host must remain awake and the process must remain running. Ctrl-C stops
it. Worker processes are terminated if stopped or the deadline expires. A
60-second default interval separates attempts; --interval changes it. This is
continuous supervision, not an infinite zero-delay loop. Missing adapters
leave continuous mode waiting without fabricating attempts or performance.
Stopping a replay worker does not call any broker or stop any trading process.
The supervisor itself has no broker code. Host adapters are trusted local code;
its no-live-order declaration is checked, not enforced by an OS network sandbox.

Inspect existing saved history without replaying:
  python3 gauntlet.py --monitor-only
The embedded monitor also opens as a saved evidence page when offline. Its
live refresh requires the local supervisor; it labels connection failure.
The SQLite runs/gauntlet.db stores all events, attempt IDs and lessons across
restarts. The monitor shows the latest 200 events and 25 attempts; /api/lessons
returns the COMPLETE lesson history. Logs are not neural-network weights.
The adapter receives lesson_history each year for optional explicit use.
No model training, strategy revision, repaired solution, or memory consolidation
is claimed unless the host learning component performs and documents it.

Adapter contract — implement privately on the host
run_year(context) runs a year of YOUR actual strategy on YOUR historical
market data and point-in-time external observations. The context contains:
  attempt, year, calendar_year, starting_capital_usd='500', income_target_usd,
  tolerance_pct, lesson_history, protective_controls, mode, allow_live_orders,
  deadline_utc.
It must return a dict with:
  data_origin: 'HISTORICAL_REPLAY'
  calendar_year: matching integer
  starting_capital_usd: '500'
  income_definition: 'REALIZED_NET_AFTER_COSTS'
  net_income_usd: exact finite decimal STRING, possibly negative
  strategy_sha256, dataset_sha256, ledger_sha256: 64 lowercase hex characters
  controls: {intraday_3pct_breaker: true, capital_floor_ratchet: true,
             no_live_orders: true, point_in_time_inputs: true}
  sources: [{url: 'https://...', point_in_time_validated: true}, ...]
These are HOST-REPORTED results, not independent ledger reconciliation. Hash
syntax checks are not proof the referenced ledger was hashed correctly.
The host adapter must enforce your actual 3% breaker behavior and capital floor
ratchet definition, preserve control evidence and model realistic execution.
The supervisor does not invent a floor level or override your existing controls.
A missing control means BLOCKED, never a claim that it is armed.

Data and external context
sources.json lists primary-source resources located for this delivery. These
are researched access points, NOT a claim of active watcher subscriptions or
already downloaded century datasets. Different sources cover different dates.
Use point_in_time.available_observations(path, decision_at) to filter prepared
JSONL context by available_at, with timezone. Each record requires https URL,
available_at and any payload fields your strategy uses. The host preparation
step must establish the TRUE publication/availability timestamp; the filter
cannot independently authenticate it. Later revisions and retrospectively
published documents must not leak into earlier decisions. Merely having an
observation-period date does not establish when traders could know it.
Today's news goes into a separate forward-observation collection, never into
historical decisions before its publication date. News text is untrusted data,
not executable instructions. No live news ingestion is implemented here.
Choose instruments actually available in each year. The original BTC/ETH-only
engine cannot be replayed as real BTC/ETH history in 1926. No synthetic price
substitution can be called an actual 100-year market replay.

Error lessons versus verified solutions
The automatic solution text is a proposed investigation/remediation action.
A real strategy repair needs a concrete version change and separate held-out
retest evidence. Repeatedly optimizing on the same century is in-sample search;
it must not be reported as independent out-of-sample performance. Statistical
sampling uncertainty, financial loss and target deviation are different metrics.
A 0.0001% target criterion does not guarantee 99.9999% prediction accuracy.

Verification and limits
12 Python tests passed (see evidence/tests.txt), including precise threshold
boundary, target arithmetic, per-error lessons, persistence, missing-data
blocking, point-in-time filtering, actual child-process report/termination and
read-only monitor HTTP response. JavaScript syntax checked. Browser rendering,
phone/gateway access, the actual strategy adapter and full historical replay
remain unverified. The four original runners completed, but their synthetic
outputs are not credited as century training. No background run on the Mac
or persistent chat-side weekend execution has been started by this delivery.

Two-pass QA evidence gate: BLOCKED for full historical replay, responsive
browser validation and actual host protection integration. This is a draft
integration delivery, not a release approval. See evidence/qa_report.json.
