Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
17 changes: 9 additions & 8 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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 **<!-- pf:releases[1.4.0].scoreboard.excellent|int -->7,983<!-- /pf -->
excellent / <!-- pf:releases[1.4.0].scoreboard.strong|int -->6<!-- /pf --> strong**
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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.
Expand Down
17 changes: 9 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.

Expand Down Expand Up @@ -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"
Expand Down Expand Up @@ -248,7 +249,7 @@ workaround for those versions.

**Measured <!-- pf:scoreboard.date -->2026-10-07<!-- /pf -->** on main engine <!-- pf:scoreboard.engineCommit|short-code -->`b3192bfc`<!-- /pf --> with codegen-oss <!-- pf:scoreboard.codegenCommit|short-code -->`bfc4ddce`<!-- /pf --> (baseline <!-- pf:scoreboard.id|code -->`pineforge-parity-baseline-20261007-engine-b3192bfc`<!-- /pf -->, snapshot <!-- pf:scoreboard.snapshotSha256|short-code -->`28ba8dbd`<!-- /pf -->): **<!-- pf:scoreboard.graded|int -->7,989<!-- /pf --> graded probes, <!-- pf:scoreboard.excellent|int -->7,983<!-- /pf --> excellent + <!-- pf:scoreboard.strong|int -->6<!-- /pf --> strong**, <!-- pf:scoreboard.belowStrong|int -->0<!-- /pf --> below strong and <!-- pf:scoreboard.engineErrors|int -->0<!-- /pf --> engine errors across <!-- pf:scoreboard.lanes|int -->18<!-- /pf --> market/timeframe lanes. The historical release 1.0.1 inventory holds <!-- pf:inventory.tvTrades|int -->4,776,328<!-- /pf --> trades.

Planned **1.4.0 (unreleased)** maps to **<!-- pf:releases[1.4.0].scoreboard.excellent|int -->7,983<!-- /pf --> excellent / <!-- pf:releases[1.4.0].scoreboard.strong|int -->6<!-- /pf --> strong** on <!-- pf:releases[1.4.0].scoreboard.graded|int -->7,989<!-- /pf --> graded probes (baseline <!-- pf:releases[1.4.0].scoreboard.id|code -->`pineforge-parity-baseline-20261007-engine-b3192bfc`<!-- /pf -->, <!-- pf:releases[1.4.0].scoreboard.date -->2026-10-07<!-- /pf -->), with <!-- pf:releases[1.4.0].scoreboard.belowStrong|int -->0<!-- /pf --> below strong and <!-- pf:releases[1.4.0].scoreboard.engineErrors|int -->0<!-- /pf --> engine errors. These are recorded grading outcomes for that pair and population.
Release **1.4.0 (2026-10-08)** maps to **<!-- pf:releases[1.4.0].scoreboard.excellent|int -->7,983<!-- /pf --> excellent / <!-- pf:releases[1.4.0].scoreboard.strong|int -->6<!-- /pf --> strong** on <!-- pf:releases[1.4.0].scoreboard.graded|int -->7,989<!-- /pf --> graded probes (baseline <!-- pf:releases[1.4.0].scoreboard.id|code -->`pineforge-parity-baseline-20261007-engine-b3192bfc`<!-- /pf -->, promoted <!-- pf:releases[1.4.0].scoreboard.date -->2026-10-07<!-- /pf --> UTC), with <!-- pf:releases[1.4.0].scoreboard.belowStrong|int -->0<!-- /pf --> below strong and <!-- pf:releases[1.4.0].scoreboard.engineErrors|int -->0<!-- /pf --> engine errors. These are recorded grading outcomes for that pair and population.

Release **1.3.0 grades <!-- pf:releases[1.3.0].scoreboard.excellent|int -->7,982<!-- /pf --> excellent / <!-- pf:releases[1.3.0].scoreboard.strong|int -->7<!-- /pf --> strong until the next release**, on <!-- pf:releases[1.3.0].scoreboard.graded|int -->7,989<!-- /pf --> probes (baseline <!-- pf:releases[1.3.0].scoreboard.id|code -->`pineforge-parity-baseline-20261006-engine-7a1f01c0`<!-- /pf -->, <!-- pf:releases[1.3.0].scoreboard.date -->2026-10-06<!-- /pf -->). A main scoreboard advance does not change release results.

Expand Down Expand Up @@ -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).
Expand Down
13 changes: 6 additions & 7 deletions docker/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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).
Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -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.

Expand Down
12 changes: 6 additions & 6 deletions docs/pages/public-contract.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
16 changes: 8 additions & 8 deletions docs/pages/release-1.4.0-sample.md
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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
Expand Down
2 changes: 1 addition & 1 deletion docs/pages/tutorial-macd.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Loading