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.