Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
75854e2
chore(roadmap): start M22-01
vntrevx Aug 11, 2026
2a434f0
feat(vector): compile latest NFI programs generically
vntrevx Aug 11, 2026
62d893b
feat(vector): execute full indicator programs in Rust
vntrevx Aug 11, 2026
98e8cde
feat(vector): expose full native stage through PyO3
vntrevx Aug 11, 2026
1026750
feat(vector): seal and prepare raw native frames
vntrevx Aug 11, 2026
3dfa512
feat(vector): run sealed full native manifests
vntrevx Aug 11, 2026
d1d6790
feat(vector): expose sealed native file execution
vntrevx Aug 11, 2026
bd23f7a
feat(engine): select full native vector transport
vntrevx Aug 11, 2026
00f9711
feat(vector): build full native manifests
vntrevx Aug 11, 2026
8944644
feat(research): route X7 through full native transport
vntrevx Aug 11, 2026
8874e90
feat(x7): compile generic adjustment fallback expressions
vntrevx Aug 11, 2026
b22b880
fix(vector): canonicalize full native config identity
vntrevx Aug 11, 2026
1a174ed
fix(vector): retain native callback signal columns
vntrevx Aug 11, 2026
ecce3c7
fix(vector): bind positional TA-Lib parameters
vntrevx Aug 11, 2026
e31ef44
fix(vector): accept exact float cast contract
vntrevx Aug 11, 2026
f34a894
fix(vector): accept exact series cast contract
vntrevx Aug 11, 2026
f7ad90f
fix(vector): recover TA-Lib moving warmups
vntrevx Aug 11, 2026
c0e715d
feat(vector): qualify latest signal changes natively
vntrevx Aug 11, 2026
5aa2fdf
test(vector): refresh cast contract evidence
vntrevx Aug 11, 2026
6c60bff
fix(vector): preserve legacy indicator semantics
vntrevx Aug 11, 2026
7ab6236
chore(roadmap): complete M22 latest qualification
vntrevx Aug 11, 2026
f231565
feat(vector): seal no-Python native execution
vntrevx Aug 11, 2026
8e5f8a3
chore(roadmap): complete no-Python native gate
vntrevx Aug 11, 2026
eba09d9
feat(native): certify bounded five-year full pipeline
vntrevx Aug 12, 2026
802aa4f
docs: seal M22 full native performance evidence
vntrevx Aug 12, 2026
544ed22
test(sim): pin adjustment before same-candle stop
vntrevx Aug 13, 2026
8507134
fix(x7): lower current Grind 5 fallbacks
vntrevx Aug 13, 2026
b3fd87b
release: prepare v1.6.0 candidate
vntrevx Aug 13, 2026
bcf0d9e
test(vector): satisfy current Clippy
vntrevx Aug 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/product-release-contract.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"schema_version": "1.0.0",
"package_version": "1.5.0",
"package_version": "1.6.0",
"release_kind": "product",
"combined_full_x7_certified": false,
"distribution_policy": {
Expand Down
24 changes: 22 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,32 @@ All notable changes are recorded here. This project follows Semantic Versioning.

## Unreleased

## 1.6.0 - 2026-08-14

- Added the source-compiled Full Native transport: Rust now executes the complete
Indicator, Signal, Tag, callback, order, wallet, and state pipeline without
importing or executing strategy Python at runtime.
- Added content-bound Full Native worker calibration, pair-local raw-frame loading,
live-value release, and direct file-backed simulator handoff without persistent
analyzed Feather outputs.
- Added fail-closed spool-capacity admission from the run's gap-fill bound, automatic
delete-on-close cleanup, and profile evidence for admitted versus actual bytes.
- Split NFI manager validation failures from pair/timestamp/route/source-located
runtime diagnostics, and validate the embedded simulator config before expensive
pair preparation.
- Connected typed Rust vector output directly to the chronological simulator, with
pair-parallel DAG preparation and no parallel wallet or order mutation.
- Preserved SHA-verified Feather as the bounded-memory evidence/replay path and added
zero-tolerance trade-surface and every-candle full-state transport parity tests.
- Kept latest-X7 Full Native qualification and the v1.6.0 release behind the remaining
M22 source-lowering, dual-mode exactness, performance, storage, and three-OS gates.
- Certified a five-year Full Native Spot workload with three byte-identical results,
a pre-admitted 38.47 GB temporary spool bound, and no retained spool files. This is
a single-host performance/storage claim, not a new official Freqtrade certificate.
- Generalized current X7 Grind-5 fallback lowering for `slice_profit_exit`, Boolean
protection columns, bare Derisk state, Futures mode, and liquidation-distance
expressions without strategy-version, pair, or expected-result branches.
- Pinned the Freqtrade same-candle contract: position adjustment and its filled order
are applied before stop/exit evaluation. The external 2022 Futures report that
motivated the hotfix remains unclaimed until its sealed input is supplied.

## 1.5.0 - 2026-08-10

Expand Down
15 changes: 12 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ semantics stop with a clear fail-closed verdict instead of being approximated.
| Latest public release | [v1.5.0](https://github.com/vntrevx/NFI_BackTestEngine/releases/tag/v1.5.0) |
| Five-year Spot | Certified independently by v1.0.0 |
| Five-year Futures | Certified independently by v1.1.0 |
| Current `main` | v1.5.0 Native Stateful Runtime; no new combined Full X7 certification claim |
| Current `main` | v1.6.0 Full Native Strategy release candidate; no new combined Full X7 certification claim |

The Spot and Futures certificates remain valid for their own sealed strategy,
configuration, data, wheel, and host. They are not a same-candidate Spot-versus-Futures
Expand Down Expand Up @@ -80,6 +80,15 @@ Both certificates still prove exact parity for their sealed workloads. They do n
form a controlled Spot-versus-Futures performance test, so this project makes no
cross-mode speed ratio claim.

The v1.6.0 Full Native path completed a latest-X7 Spot development
qualification over 80 pairs and 2021-01-01 through 2026-01-01. Three fresh
processes finished in 63:17, 62:51, and 62:44 with byte-identical 1,162-trade
results (0.88% wall spread). Median peak RSS was 38.9 GiB. The 38.47 GB temporary
row spool remained below its pre-admitted bound and was reclaimed after every
run. This is a single-host performance/storage certificate, not an official
Freqtrade five-year parity or cross-platform performance claim. See the
[M22 performance evidence](benchmarks/evidence/m22/full-native-performance-storage.json).

For a fresh-run expectation, compare Spot's full native median with Futures' cold seed.
Use the Futures reuse number only after its content-addressed vectors already exist.
Actual runtime still depends on strategy behavior, data, hardware, and memory limits.
Expand Down Expand Up @@ -141,8 +150,8 @@ nfi-bte --version
nfi-bte doctor
```

The latest public installer and a source checkout of `main` both return
`nfi-bte 1.5.0`.
The latest public installer returns `nfi-bte 1.5.0`. A source checkout of `main`
returns the v1.6.0 Full Native Strategy release candidate.

## Quick start

Expand Down
162 changes: 162 additions & 0 deletions benchmarks/evidence/m22/full-native-performance-storage.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,162 @@
{
"schema_version": "full-native-performance-storage-v1",
"status": "certified",
"recorded_at": "2026-08-12",
"implementation": {
"commit": "eba09d977e3eddb45f7a7982ebf026b0e5731c45",
"measurement_binary_sha256": "caf5599a3a32fe6815fa4fb96a3ca9f8dfeb99536715ed5906cd6a1a06580d01",
"post_measurement_change": "Tag/Signal structural preflight liveness only; the measured execution hot path is unchanged",
"current_exact_fixture_source_fingerprint": "f89ee9bc2de011e278948d962fa831e8087675192ccbb4427d48ebb8ee8f8417",
"current_exact_fixture_binary_sha256": "642d67a08e5405b7ea5a8d7864eade0ce1655d337e2bb6b1552ffa4af9769f76"
},
"workload": {
"strategy": "NostalgiaForInfinityX7",
"strategy_version": "v17.4.528",
"upstream_commit": "1df961c07e5ce6b1a8cb459a2a46958aed258323",
"strategy_sha256": "45a2bf611d6fc5e60c7e1f4c672ce7932f6573872c2a959f6338d079dac5e382",
"manifest_sha256": "3b1b18bdaaacca43ff538e1397547df020ace3e80913371aa137607dc2185e90",
"config_sha256": "402d90b02890192a54cb6e7e9ba6fdc11b69b89bd8627fd9a268f70f4e3110db",
"trading_mode": "spot",
"timerange": "20210101-20260101",
"pair_count": 80,
"raw_frame_count": 400,
"timeframes": [
"5m",
"15m",
"1h",
"4h",
"1d"
],
"startup_candles": 800,
"source_row_shift": 1,
"retained_feature_count": 104,
"retained_feature_fingerprint": "ad099fe5ef897191a4d34597e82e0e3c850d960e24fd9611713fdd714ee17d9b",
"manifest_declared_raw_rows": 72488162,
"execution_row_count": 42134157,
"history_coverage_policy": "available local sealed history"
},
"environment": {
"os": "Linux x86_64",
"kernel": "7.0.0-28-generic",
"cpu": "12th Gen Intel(R) Core(TM) i7-1260P",
"logical_cpu_count": 16,
"memory_bytes": 50195083264,
"hardware_fingerprint": "5c71dfa54dd8a8d5e87088d2c78522f6e85d009434b4779d45bc378b82ffa30d",
"pair_worker_limit": 8
},
"calibration": {
"key": "3610776e2f8680861b6b2c7a515b47245cb0ff2cc0e85f205d9fa881c8f44281",
"record_sha256": "19d68b154601badbebe5f35d0918c06e31d112e83159f3f2ec91fc7af3f3377a",
"probe_pair": "XRP/USDT",
"probe_peak_rss_bytes": 4605874176,
"probe_wall_time_seconds": 112.182186987,
"admitted_workers": 8
},
"result": {
"sha256": "5adac8e620877b30d7e52988e377d068799be3a4045a8d45221e29620aa08266",
"byte_identical_across_repetitions": true,
"trade_count": 1162,
"final_balance": 27064.22769050002,
"profit_total_abs": 26064.227690500004,
"total_volume": 3523156.3395277644,
"rejected_signals": 4476,
"maximum_concurrent_trades": 6
},
"repetitions": [
{
"name": "cold-01",
"wall_seconds": 3797,
"vector_execute_seconds": 3115.615091735,
"event_loop_seconds": 658.949939495,
"validation_seconds": 19.61198466,
"peak_rss_bytes": 41832026112,
"profile_sha256": "c6889a5f0636980d268217f6221627fbb732eb78be1ddf7ad8fd39280cd0e2d1",
"time_log_sha256": "58dff50b2e9aaebb0da2d845f769b3c1c8b9633d8a3f4c05a0a712dbba7f0131"
},
{
"name": "warm-02",
"wall_seconds": 3771,
"vector_execute_seconds": 3103.454727467,
"event_loop_seconds": 650.534573412,
"validation_seconds": 13.957065728,
"peak_rss_bytes": 41783009280,
"profile_sha256": "7c3e74732834d3c9b0a22fadbbba65011241260298ca570485afbb522ed2a820",
"time_log_sha256": "6b74da336a8fca324f23499f382f3c33a9ede47476b330bd3d1ad690d57e72b9"
},
{
"name": "warm-03",
"wall_seconds": 3764,
"vector_execute_seconds": 3096.122603618,
"event_loop_seconds": 650.939236179,
"validation_seconds": 13.801878597,
"peak_rss_bytes": 41793679360,
"profile_sha256": "dd40bc5287a567aabdfea30352f0ce65d115c15ccf778d0b8cebc22dc009c1e3",
"time_log_sha256": "e3b901846e473dbf3958e7174c49dafb589fcc6e600b46cfd558c8c76de2c915"
}
],
"aggregate": {
"wall_seconds_min": 3764,
"wall_seconds_median": 3771,
"wall_seconds_max": 3797,
"wall_spread_ratio": 0.008767268862911796,
"five_repetitions_required": false,
"vector_execute_seconds_median": 3103.454727467,
"event_loop_seconds_median": 650.939236179,
"peak_rss_bytes_median": 41793679360,
"peak_rss_spread_ratio": 0.0011731283324167502
},
"storage": {
"target_source": "os-temp",
"cleanup_mode": "unlink-on-open",
"required_upper_bound_bytes": 38469364560,
"actual_file_backed_bytes": 38468485341,
"bound_margin_bytes": 879219,
"actual_within_bound": true,
"available_bytes_at_first_admission": 93288243200,
"available_bytes_after_final_run": 93272535040,
"named_orphan_file_count": 0,
"delete_pending_handle_count_after_exit": 0,
"partial_result_or_profile_count_after_failed_run": 0,
"unbounded_local_accumulation_observed": false
},
"exact_regression": {
"spot": {
"run_sha256": "c8b689934d386b9b355c6b54acf548c71851ac79a7ea447c559a551c6cd0f866",
"input_sha256": "b76ddcae92972692ff1fb011ef540dc81ba389bc93019174ff90a36be1539bcc",
"output_sha256": "3624f7b2de5368e126bdc0582f86a6e7c2adfaf78e02497c21ea4a207c632f98",
"trade_surface_exact": true,
"full_state_exact": true,
"state_event_count": 288,
"state_stream_hash": "6a59c86a808e0e5f8fc016c1467fa173502ea37b0eb870f84e7f51cfa1818f8b"
},
"futures": {
"run_sha256": "002579af277077e15a99aa02a8b9b1cf910385857a7ce7f07898051191804df0",
"input_sha256": "d6236067eb775fb59842853c9d15cc0ca9c2b7914b60a636d59837c00a610f14",
"output_sha256": "a36ebf30a353e185953da02b722c0268175a02b1d850555057efe77492d93af6",
"trade_surface_exact": true,
"full_state_exact": true,
"state_event_count": 5472,
"state_stream_hash": "029a12115d0e9095d4e1cc19e25694a28bee4c625b6cd59dc9226ab1ceaeff85"
}
},
"excluded_runs": [
{
"reason": "pre-fix binary rejected a reached cross-side short_normal helper route",
"included_in_performance_statistics": false
},
{
"reason": "concurrent diagnostic process contaminated host resources and the run was terminated",
"included_in_performance_statistics": false
}
],
"claim_boundary": {
"five_year_full_native_performance_and_storage_certified": true,
"latest_x7_source_compiled_without_runtime_python": true,
"runtime_strategy_pair_timerange_sha_or_result_hardcoding_added": false,
"official_freqtrade_five_year_parity_claimed": false,
"cross_platform_performance_claimed": false,
"futures_five_year_performance_claimed": false,
"v1_6_0_released": false
},
"fingerprint": "a9ab243261ecbe79c23e1f22f4a3fe8cefa794be1bb494cf922442efbd8699ad"
}
91 changes: 91 additions & 0 deletions benchmarks/evidence/m22/latest-x7-full-native-qualification.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
{
"schema_version": "latest-x7-full-native-qualification-v1",
"status": "exact",
"source": {
"upstream_commit": "1df961c07e5ce6b1a8cb459a2a46958aed258323",
"strategy_sha256": "45a2bf611d6fc5e60c7e1f4c672ce7932f6573872c2a959f6338d079dac5e382",
"strategy_version": "v17.4.528",
"freqtrade_version": "2026.5.1"
},
"changed_branch": {
"kind": "signal-protection",
"signal": "47",
"evidence_path": "benchmarks/evidence/m22/latest-x7-signal47-boundary.json",
"evidence_sha256": "84ee3f451d016a8f67f5b98314970a527cddde97f4476b147a0375c1bc6ce8d1",
"evidence_fingerprint": "d4128b380d483a05f7a230bfe78dad14502438d45a8fa0adeb0c094c5d73f7fe",
"spot_exact": true,
"futures_exact": true,
"tag_exact": true,
"baseline_reaches_and_current_rejects_boundary": true,
"one_term_passes_current": true,
"callback_and_stateful_methods_changed": false
},
"spot": {
"pair": "BTC/USDT",
"timerange": "20230101-20230102",
"transport": "full-native-vector-manifest",
"raw_frame_count": 5,
"row_count": 1089,
"retained_feature_count": 104,
"program_fingerprints": {
"indicator": "df8339e280aadb53cdca1efc552cfab3351959187b771763999f296aaa8c05a2",
"signal": "35d744c99f3702320572783608b5ff28182d75b7a91b1616d7d24088ec37d69b",
"tag": "0804bfbbd39340a53da7b7d61cefa1ef472af45d08870e1b4fa575eae9dc22be"
},
"trade_surface": {
"trade_count": 0,
"native_sha256": "cfd5868610e8e916a9233bc67f42e6e78ae3f5fff95855c4b4f87d0b1df568f6",
"official_sha256": "cfd5868610e8e916a9233bc67f42e6e78ae3f5fff95855c4b4f87d0b1df568f6",
"exact": true
},
"full_state": {
"event_count": 288,
"stream_hash": "e119fc56545e34f2b368c4baa59c0067d64d7d821a018687de8166aa81bb4428",
"first_difference": null,
"exact": true
},
"native_vector_seconds": 7.042690725,
"blockers": []
},
"futures": {
"pair": "APE/USDT:USDT",
"timerange": "20220410-20220420",
"transport": "full-native-vector-manifest",
"raw_frame_count": 10,
"row_count": 3681,
"retained_feature_count": 104,
"program_fingerprints": {
"indicator": "b3b1ab61235141e7da9ba4611a5879676ba007d20a3c34105f01e778ec3996c5",
"signal": "0d68c82365732250ca6302056d8c723e7b20565859410bc5b792d6be13cc237b",
"tag": "6ae46ee6e2f32290dea1685d9d9173a156ca1d4425afec11148c4de7809bb388"
},
"trade_surface": {
"trade_count": 1,
"entry_tag": "142 ",
"exit_reason": "exit_long_tc_w_0_8 ( 142 )",
"funding_fee": "-2.9366127",
"native_sha256": "f472f82eb970142d0d10b1b59171a8b9e80c001b9698f47ff1d53caf1f800eb7",
"official_sha256": "f472f82eb970142d0d10b1b59171a8b9e80c001b9698f47ff1d53caf1f800eb7",
"exact": true
},
"full_state": {
"event_count": 2880,
"stream_hash": "eff3ddae550d7f8877bd04f96457b6ed052b4f9ea0cca968d9a4721141f07bdb",
"first_difference": null,
"exact": true
},
"native_vector_seconds": 27.139196679,
"blockers": []
},
"claims": {
"latest_upstream_compiles_without_blockers": true,
"indicator_signal_tag_and_stateful_runtime_is_native": true,
"python_strategy_execution_in_native_runtime": false,
"official_fallback_retained": true,
"runtime_strategy_pair_timerange_sha_or_result_branches_added": false,
"m22_01_latest_dual_mode_qualification_complete": true,
"five_year_performance_certified": false,
"v1_6_0_released": false
},
"fingerprint": "2e3bb9fc12597d400043f1e2015687b9bca5da7ed97859f27b8e9842e3c8d087"
}
Loading
Loading