Skip to content
Closed
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
68 changes: 68 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,74 @@ supported as exact pairs; on the 0.x line they are independent. See the
the release commit. A prerelease note describes changes since the preceding
prerelease or stable tag; the final stable note consolidates the series.

## 1.7.0 — 2026-10-25

A minor release of the exact engine/codegen pair, paired with engine `v1.7.0`
and dated 2026-10-25. This entry records what changed in this repository since
1.6.3, and nothing else: three pull requests merged after `v1.6.3`, one of which
changes the emitted C++ and the other two only the repository's own CI.

### Compatibility and migration

- Pairs with engine `v1.7.0` exactly. Regenerate strategy C++ with this release
and relink every strategy library against the engine `v1.7.0` headers and
`libpineforge.a`; this applies even when the C ABI number is unchanged
(README [Engine pairing](README.md#engine-pairing)). Replacing the archive
alone does not update a statically linked strategy library.
- The emitted C++ changes, as described below: every generated library gains a
new exported function, the generated constructor gains a guarded statement
for scripts that do not read closed-trade rows, and the set of reserved names
grows. The Python and JSON contract, the diagnostic codes and
severities, and the catalog schema are not changed.
- Engine behavior changes are described in the paired engine's own release
notes; this entry does not summarize them.

### Changes since 1.6.3

- Declare whether the emitted code reads closed-trade rows, and let scripts that
do not read them opt into streamed trade history
([#213](https://github.com/pineforge-4pass/pineforge-codegen-oss/pull/213)).
Generated libraries now export `int strategy_reads_trade_history(void)`: `1`
when the emitted code reads a `strategy.closedtrades.*` accessor, `0` when it
does not. The closed-trade count (`strategy.closedtrades` alone) and the
open-trade accessors (`strategy.opentrades.*`) do not count as reads. For a
script that does not read closed-trade rows, the generated constructor calls
`this->set_trade_history_streamable(true)`, guarded by
`#if defined(PINEFORGE_HAS_TRADE_HISTORY_POLICY_V1)` so that it compiles
against engine headers that lack the setter; a script that reads closed-trade
rows emits no such call. The constructor's host calls are now qualified
(`this->configure_pine_strategy(cfg)`). A library generated by an earlier
release has no such export, and its absence does not establish that the
script is a non-reader. What the engine does with
the streaming setting is described in the engine `v1.7.0` release notes.
- Reserve more names in generated C++ and escape them as `pf_safe_<name>` when a
Pine identifier uses one (same pull request, documented in the new
"Identifiers in generated C++" section of
[docs/PUBLIC_CONTRACT.md](docs/PUBLIC_CONTRACT.md)): the engine namespaces and
types that `using namespace pineforge;` brings into scope (`report`,
`report_sink`, `report_sequence`, `source`, `native_calendar`, `pine_color`,
`RunFailureCode`, `RunFailureInfo`, `QtyType`, `CommissionType`, `XLoc`,
`YLoc`, `normalize_timezone_for_posix`), the generated C exports
(`strategy_create`, `strategy_create_checked`, `run_backtest`,
`run_backtest_full`, `run_backtest_full_checked`, `strategy_free`,
`report_free`, `strategy_set_input`, `strategy_set_input_checked`,
`strategy_set_override`, `strategy_set_override_checked`,
`strategy_set_magnifier_volume_weighted` and the new
`strategy_reads_trade_history`), the feature macros
`PINEFORGE_HAS_TRADE_HISTORY_POLICY_V1` and
`PINEFORGE_HAS_SYMBOL_SECURITY_EVAL_V1`, and the host member
`set_trade_history_streamable`. A Pine `type report`, for example, now becomes
`struct pf_safe_report`; before, such a script could fail to compile against the
1.7.0 engine headers with an ambiguous reference. An identifier that does not
collide keeps its spelling. The existing `CPP_RESERVED` export lists the new
names; no new reserved-name API is introduced.
- Repository and CI only, no effect on emitted C++ or on the Python and JSON
contract: the `promote-baseline` workflow refuses untrusted heads and actors
(SEC846,
[#242](https://github.com/pineforge-4pass/pineforge-codegen-oss/pull/242)),
and `test.yml` adopts the organization's CI canon (CR-241,
[#243](https://github.com/pineforge-4pass/pineforge-codegen-oss/pull/243)).

## 1.6.1 — 2026-10-18

A patch release of the exact engine/codegen pair, paired with engine `v1.6.1`
Expand Down
Loading