diff --git a/CHANGELOG.md b/CHANGELOG.md index d50cdf8c..a730d4aa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,12 +5,13 @@ README's *Releases* section and on the GitHub releases page. From 1.0.0 the version number follows semantic versioning over the surfaces the [public contract](docs/pages/public-contract.md) lists. -## Unreleased +## 1.4.0 — 2026-10-08 -**Planned 1.4.0**, paired with pineforge-codegen 1.4.0. This release is not -tagged yet. The candidate pairs engine `b3192bfc` with codegen `bfc4ddce`; -their version files still name 1.3.0 until the release workflow stamps them. -The planned minor release adds run-failure codes, typed report provenance +**[1.4.0](https://github.com/pineforge-4pass/pineforge-engine/releases/tag/v1.4.0)**, +paired with [pineforge-codegen 1.4.0](https://github.com/pineforge-4pass/pineforge-codegen-oss/releases/tag/v1.4.0). +The pre-tag behavior candidate paired engine `b3192bfc` with codegen +`bfc4ddce`; its version files still named 1.3.0 when the samples were built. +This minor release adds run-failure codes, typed report provenance and the Pine adapter and live-runner corrections below. Regenerate strategy C++ with the matching codegen and relink against the matching engine headers and archive; replacing the archive alone does not update a statically linked @@ -25,7 +26,7 @@ epoch stays `engine_script_run_v19`; *State hashes* below describes the recipe additions. *Report keys and provenance* describes the JSON changes that consumers must handle. -The prepared 1.4.0 facts map to baseline +The 1.4.0 facts map to baseline `pineforge-parity-baseline-20261007-engine-b3192bfc`: its recorded grading outcomes are **7,983 excellent / 6 strong** @@ -227,7 +228,7 @@ results on that population, not cross-version trade or hash identity. Six synthetic requests were run through the installed entrypoint on the exact v1.3.0 pair and the pinned candidate pair, using the same 40-bar -feed. Planned 1.4.0 refuses three requests that 1.3.0 allowed to complete: +feed. 1.4.0 refuses three requests that 1.3.0 allowed to complete: setting a duplicated `Period` title to `"7"`, passing `"color.blue"` to `Color`, and setting `Choice` to `"15"` outside its `[10, 20, 30]` options. The old pair returns success reports for these requests; that wire echo @@ -388,7 +389,7 @@ path's null fingerprint and the legacy path's per-title records. ### Migration -Use engine 1.4.0 with codegen 1.4.0 when the pair is released; earlier paired +Use engine 1.4.0 with codegen 1.4.0; earlier paired releases remain historical examples. Regenerate and rebuild every generated strategy and every C++ host against the new headers and archive. C loaders can probe the two new getters before using them with older libraries. diff --git a/README.md b/README.md index b1ca1585..cc56f690 100644 --- a/README.md +++ b/README.md @@ -35,11 +35,12 @@ The separate PineForge compiler, [`pineforge-codegen`](https://github.com/pinefo - **Deterministic to the bit.** Two runs with the same inputs produce identical trade lists. Same on Linux and macOS. - **Yours to embed.** 124 `PF_API` declarations across two headers — `pineforge.h`'s 81 (64 runtime exports and up to 17 per-strategy functions a generated module defines) and `native_c_api.h`'s 43 native-host declarations — an ABI that is append-only within a major version from 1.0 on. Call it from C, Python, Rust, Go, Node, Julia — or let an AI agent drive it over MCP. -**Planned 1.4.0 is unreleased.** Engine `b3192bfc` pairs with codegen -`bfc4ddce` for the candidate; both still report version 1.3.0 until tagging. -The [release notes](CHANGELOG.md#unreleased) cover typed and unresolved +**[1.4.0](https://github.com/pineforge-4pass/pineforge-engine/releases/tag/v1.4.0) +was released on 2026-10-08**, paired with +[pineforge-codegen 1.4.0](https://github.com/pineforge-4pass/pineforge-codegen-oss/releases/tag/v1.4.0). +The [release notes](CHANGELOG.md#140--2026-10-08) cover typed and unresolved provenance, coded failures, checked settings, adapter fixes and chart-clock -live input. When the 1.4.0 pair is released, regenerate strategy C++ and +live input. For the 1.4.0 pair, regenerate strategy C++ and relink against that pair's headers and archive. Published 1.3.0 download and installation examples below remain pinned to that earlier pair. @@ -139,8 +140,8 @@ TradingView's execution semantics on top of the kernel; this is the path the validation scoreboard below measures. This command block is for the published engine/codegen **1.3.0 pair**. -For the unreleased candidate use the pinned pair above; agreement on the -current `VERSION` text alone does not establish a matching build. +For 1.4.0, use the matching release tags linked above and regenerate and +relink against that pair's headers and archive. ```bash pip install "pineforge-codegen==1.3.0" @@ -248,7 +249,7 @@ workaround for those versions. **Measured 2026-10-07** on main engine `b3192bfc` with codegen-oss `bfc4ddce` (baseline `pineforge-parity-baseline-20261007-engine-b3192bfc`, snapshot `28ba8dbd`): **7,989 graded probes, 7,983 excellent + 6 strong**, 0 below strong and 0 engine errors across 18 market/timeframe lanes. The historical release 1.0.1 inventory holds 4,776,328 trades. -Planned **1.4.0 (unreleased)** maps to **7,983 excellent / 6 strong** on 7,989 graded probes (baseline `pineforge-parity-baseline-20261007-engine-b3192bfc`, 2026-10-07), with 0 below strong and 0 engine errors. These are recorded grading outcomes for that pair and population. +Release **1.4.0 (2026-10-08)** maps to **7,983 excellent / 6 strong** on 7,989 graded probes (baseline `pineforge-parity-baseline-20261007-engine-b3192bfc`, promoted 2026-10-07 UTC), with 0 below strong and 0 engine errors. These are recorded grading outcomes for that pair and population. Release **1.3.0 grades 7,982 excellent / 7 strong until the next release**, on 7,989 probes (baseline `pineforge-parity-baseline-20261006-engine-7a1f01c0`, 2026-10-06). A main scoreboard advance does not change release results. @@ -668,7 +669,7 @@ Documentation: [C ABI reference](https://cdocs.pineforge.dev) · [Getting starte ## Releases -- **Planned v1.4.0 — unreleased.** Two additive C failure getters; typed input/override provenance with explicit unresolved reasons and duplicate-title counts; coded failure JSON and checked-setting refusals; Pine exit/fill-location corrections that can change trades, reports and hash values on the affected paths; chart-timeframe live input and final-delivery draining; feed ownership and verification improvements. The C layouts stay at ABI 4, while hash recipes and report content have the disclosed changes. Pair with codegen 1.4.0 when released, regenerate and relink. See [CHANGELOG.md](CHANGELOG.md#unreleased). +- **[v1.4.0](https://github.com/pineforge-4pass/pineforge-engine/releases/tag/v1.4.0)** (2026-10-08) — two additive C failure getters; typed input/override provenance with explicit unresolved reasons and duplicate-title counts; coded failure JSON and checked-setting refusals; Pine exit/fill-location corrections that can change trades, reports and hash values on the affected paths; chart-timeframe live input and final-delivery draining; feed ownership and verification improvements. The C layouts stay at ABI 4, while hash recipes and report content have the disclosed changes. Pair with codegen 1.4.0, regenerate and relink. See [CHANGELOG.md](CHANGELOG.md#140--2026-10-08). - **v1.3.0** (2026-10-06) — a minor release: `pineforge-live` admits the proven confirmed-bar request shapes and standalone close-only `varip` from the confirmed-bar receipt a strategy generated by pineforge-codegen 1.3.0 exports; Pine adapter parity changes (exit binding at the call, global exits on a held position beside an opposite entry or a same-side add, margin calls at the open after a `process_orders_on_close` close fill, the margin-call schedule, the exact reversal tie, the carried trail, the position view after a close fill, open-marketable exits first). `pineforge.h` is unchanged. No report key changes. The hub image `pineforge-release:1.3.0` carries the pair; regenerate and relink. See [CHANGELOG.md](CHANGELOG.md). - **v1.2.0** (2026-10-05) — a minor release: a strategy generated by pineforge-codegen 1.2.0 exports a compiled execution-capabilities receipt (`strategy_capabilities_receipt`), from which `pineforge-live` refuses what its close-only stream cannot honour; Pine adapter parity changes (exit children at one point, the trail tolerance, margin, sizing and admission rules, the explicit quantity floor, the script's equity mark, bar fills under `process_orders_on_close`, the session clock across daylight-saving switches), and native runner service operation, cumulative report export and live redelivery. No report key changes. The hub image `pineforge-release:1.2.0` carries the pair; regenerate and relink. See [CHANGELOG.md](CHANGELOG.md). - **v1.1.0** (2026-10-04) — a minor release: a strategy generated by pineforge-codegen 1.1.0 exports six checked-settings C functions and stops C++ exceptions at its C entry points, and codegen 1.1.0's `transpile_full()` lists the other symbols' feeds a script requests; confirmed-bar streams compute what the batch computes, which fixes the v1.0.0 and v1.0.1 stream `request.security` known issue; Pine adapter parity changes, exact tick-built bar volume, a report-only terminal quote, the Docker harness's lot grid from `syminfo.mincontract` and its multi-symbol `request.security` feeds, and native runner webhook routing, with `pineforge/live_parser.h` and the runner's parser plugins removed (the hub image `pineforge-release:1.1.0` carries the pair); regenerate and relink. See [CHANGELOG.md](CHANGELOG.md). diff --git a/docker/README.md b/docker/README.md index d93488ea..9a74c00b 100644 --- a/docker/README.md +++ b/docker/README.md @@ -14,11 +14,10 @@ never leaves the container**. A pre-transpiled `strategy.cpp` is still accepted for back-compat. JSON report on stdout, build/transpile noise on stderr. -This checkout documents the **planned 1.4.0 release (unreleased)**. Its -candidate pairs engine `b3192bfc` and codegen `bfc4ddce`; their version files -still say 1.3.0 until tagging. The release adds typed/unresolved provenance +This checkout documents the **1.4.0 release (2026-10-08)**, pairing engine +1.4.0 with codegen 1.4.0. The release adds typed/unresolved provenance and coded failures, and the harness uses checked settings when the strategy -exports that API. Use the same-version engine/codegen pair when released, +exports that API. Use the same-version engine/codegen pair, regenerate the C++ and relink; an older image keeps its own harness behavior. ## Pull (prebuilt) @@ -268,7 +267,7 @@ docker run --rm \ before this variable existed, apart from `elapsed_seconds`. The engine catches run errors (TF mismatch, unsupported emulation flags, -unknown-input-TF, etc.) into `strategy_get_last_error()` and, with the planned +unknown-input-TF, etc.) into `strategy_get_last_error()` and, with the 1.4.0 runtime, its code/args getters. The failure line below describes both the coded form and the earlier text-only form. The container exits `4` (the harness returns 1; the entrypoint maps any harness failure to 4). @@ -473,7 +472,7 @@ read-only mounts; the image performs no network I/O at run time. Every JSON report carries a `fingerprint` recording exactly what produced it — reversible, no key required: -This is a schematic of the planned 1.4.0 provenance shape, not a measured +This is a schematic of the 1.4.0 provenance shape, not a measured before/after result. Certified values are typed; unresolved rows use the resolution records described below. The top-level `applied_inputs` and `applied_overrides` remain wire-string echoes. @@ -528,7 +527,7 @@ match a JCS direct encoder for the types we accept: | Bools / null | `true` / `false` / `null` | The `{token,digest,provenance}` object shape and canonical encoder are -unchanged in planned 1.4.0. Typed provenance normalization changes the values +unchanged in 1.4.0. Typed provenance normalization changes the values fed to that encoder, including explicit uncertainty; those changes can change the token and digest. diff --git a/docs/pages/public-contract.md b/docs/pages/public-contract.md index 1081da5e..769b28b5 100644 --- a/docs/pages/public-contract.md +++ b/docs/pages/public-contract.md @@ -23,14 +23,14 @@ tree; where no checker holds part of a rule, the page says so. The codegen states its half in its own `docs/PUBLIC_CONTRACT.md` (pineforge-codegen); the two releases pair as the last section below says. -Planned 1.4.0 is unreleased. Its candidate (engine `b3192bfc`, codegen -`bfc4ddce`) adds two runtime failure getters and the feature probe +1.4.0 followed on 2026-10-08: engine v1.4.0 with pineforge-codegen 1.4.0. +It adds two runtime failure getters and the feature probe `PINEFORGE_HAS_RUN_FAILURE_CODES_V1`, without changing C layouts or `PF_ABI_VERSION` 4. It also changes report provenance types and adds -resolution/failure fields. The repository's `CHANGELOG.md`, under -*Unreleased*, inventories the state-hash additions and report migration; -the version files still say 1.3.0 until tagging. This candidate is intended -for the same-version 1.4.0 pair, with regeneration and relinking as below. +resolution/failure fields. The repository's +[CHANGELOG.md](../../CHANGELOG.md#140--2026-10-08), under +*1.4.0 — 2026-10-08*, inventories the state-hash additions and report migration. +Use the same-version 1.4.0 pair, with regeneration and relinking as below. ## Versions diff --git a/docs/pages/release-1.4.0-sample.md b/docs/pages/release-1.4.0-sample.md index a30c6fe9..52f2dd60 100644 --- a/docs/pages/release-1.4.0-sample.md +++ b/docs/pages/release-1.4.0-sample.md @@ -1,9 +1,9 @@ -# Planned 1.4.0 — public provenance sample {#release_140_sample} +# 1.4.0 — pre-tag public provenance sample {#release_140_sample} @tableofcontents -This synthetic sample compares the released **1.3.0 source pair** with the -**unreleased 1.4.0 candidate pair**. Both were built and installed on the same +This synthetic sample compared the released **1.3.0 source pair** with the +**pre-tag 1.4.0 candidate pair**. Both were built and installed on the same x86-64 Ubuntu 24.04 host with GCC 13.3.0, then run through their own installed `docker/entrypoint.sh` and `run_json.py`. It is a report-shape example: 40 constant bars, no trades, no performance measurement and no @@ -12,12 +12,12 @@ private source or feed. | Pair | Engine commit | Codegen commit | |---|---|---| | Released 1.3.0 sources | `ec5d8bf46210bac103870ecf6fc74865cad66c8d` | `0736180e4b1ae8068df222f72ccc6a8a64471d3f` | -| Planned 1.4.0 candidate | `b3192bfc2f5a24bf4efd6d1d01e01e8fe619dfed` | `bfc4ddce453db1ba810692af9b9ba3310d87f0ac` | +| Pre-tag 1.4.0 candidate | `b3192bfc2f5a24bf4efd6d1d01e01e8fe619dfed` | `bfc4ddce453db1ba810692af9b9ba3310d87f0ac` | -These are fresh builds from pinned source, not downloaded release binaries. -Both candidate VERSION files still say 1.3.0. With -`PINEFORGE_VERSION_SOURCE=FILE`, the installed candidate reports version -`1.3.0` and engine commit `b3192bf`; the old build reports `1.3.0` and +These were fresh builds from pinned source, not downloaded release binaries. +Both candidate VERSION files said 1.3.0 at sample-build time. With +`PINEFORGE_VERSION_SOURCE=FILE`, the installed candidate reported version +`1.3.0` and engine commit `b3192bf`; the old build reported `1.3.0` and `ec5d8bf`. The candidate output has not been relabeled as a tagged artifact. ## Shared inputs diff --git a/docs/pages/tutorial-macd.md b/docs/pages/tutorial-macd.md index ec922464..21d22d3b 100644 --- a/docs/pages/tutorial-macd.md +++ b/docs/pages/tutorial-macd.md @@ -83,7 +83,7 @@ bash tutorial/run.sh Configures CMake (first time only), builds `tutorial/macd/strategy.so`, then runs the harness. The output below is the recorded engine v1.0.0 / codegen 1.0.0 result on the frozen feed; it has not -been re-measured for planned 1.4.0: +been re-measured for 1.4.0: ``` MACD(12,26,9) on BTCUSDT 15m — 672 bars, 2026-04-29 18:15 → 2026-05-06 18:00 UTC