Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
de7277f
Add a cost test for the bounded drawing arenas' edits and checkpoints
luisleo526 Nov 6, 2026
307eac1
Share a bounded drawing arena's slots between copies and write in place
luisleo526 Nov 6, 2026
2f91a3a
Merge main into the bounded drawing arena change
luisleo526 Nov 6, 2026
a9b73e0
Say what the bounded drawing change does not do, and refresh manifest…
luisleo526 Nov 6, 2026
2beb60d
Name the copied directory and order entries exactly
luisleo526 Nov 6, 2026
f740132
Merge main into the bounded drawing arena change
luisleo526 Nov 6, 2026
6ea32cd
Test signed short trade sizes
luisleo526 Nov 6, 2026
adf5044
Preserve direction in trade size accessors
luisleo526 Nov 6, 2026
eddfb2b
Docs: name signed-size corrections for the doc-reverts guard
luisleo526 Nov 6, 2026
7294ab6
Keep signed accessor source lines stable for doc anchors
luisleo526 Nov 6, 2026
83c5019
tests: re-anchor the private fixture evidence row after a registratio…
luisleo526 Nov 6, 2026
51aa35d
ci: reduce sanitizer debug info footprint
luisleo526 Nov 6, 2026
be68cab
Merge branch 'main' into sanitizer-debug-info-corrected
luisleo526 Nov 6, 2026
834333f
Refresh twin parity pins for signed size assertions
luisleo526 Nov 6, 2026
bfd45f6
Include ABI layout coverage in PR smoke
luisleo526 Nov 7, 2026
3988fb9
Keep documentation length checks in sync with smoke coverage
luisleo526 Nov 7, 2026
589a831
Add live drawing capacity to the runtime limit vocabulary
luisleo526 Nov 7, 2026
ac4ccd8
Merge main with the hosted release policy update
luisleo526 Nov 7, 2026
fa606b7
Merge main with the hosted release policy update
luisleo526 Nov 7, 2026
fcfc07c
ci: promote the engine baseline on parity alone
luisleo526 Nov 7, 2026
4f31c10
Merge main before the x86 smoke check
luisleo526 Nov 7, 2026
b0eb21b
Merge main before publishing the live drawing limit vocabulary
luisleo526 Nov 7, 2026
a46b586
Align promotion preflight with parity-only admission
luisleo526 Nov 7, 2026
349418e
Accept grouped parity-only promotion predicates
luisleo526 Nov 7, 2026
d6772ea
Repair runtime failure catalog documentation references
luisleo526 Nov 7, 2026
c85460b
Merge main into runtime limit vocabulary
luisleo526 Nov 7, 2026
cecedc0
Merge main into the bounded drawing arena change
luisleo526 Nov 7, 2026
99b0bfe
Merge main documentation update into runtime limit vocabulary
luisleo526 Nov 7, 2026
376c4f3
Merge pull request 764 head 834333f0 (Preserve direction in trade siz…
luisleo526 Nov 7, 2026
fbe3932
Merge pull request 765 head be68cabc (ci: reduce sanitizer debug info…
luisleo526 Nov 7, 2026
3012626
Merge pull request 773 head 4f31c10c (Include ABI layout probe in PR …
luisleo526 Nov 7, 2026
378ce2f
Merge pull request 772 head 349418e5 (ci: promote the engine baseline…
luisleo526 Nov 7, 2026
b4c316b
Merge pull request 759 head cecedc0e (Write bounded drawing arenas in…
luisleo526 Nov 7, 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
11 changes: 5 additions & 6 deletions .github/workflows/promote-baseline.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
# now on the base branch carries the gated PR head's TREE (a squash merge mints
# a new commit; the strict up-to-date rule keeps its tree the head's), the gate
# is green on that head, and `lab promote` finds the verdict that binds it:
# engine pineforge/verify and pineforge/parity success on the PR head;
# engine pineforge/parity success on the PR head (pineforge/verify is advisory);
# lab promote adopts the pair the merge gate's parity verdict
# measured — the merged engine with the codegen the sweep measured
# (ruling R2, 2026-09-26), PASS or neutral alike
Expand Down Expand Up @@ -98,8 +98,8 @@ permissions:
# commits/{sha}/pulls needs pull-request read access for the repo-scoped
# token, including when this unchanged workflow is installed in a private repo.
pull-requests: read
# The engine's gate is two commit statuses (pineforge/verify,
# pineforge/parity): `statuses`. The codegen axis reads check-runs: `checks`.
# The engine axis admits on pineforge/parity; pineforge/verify is advisory.
# Read `statuses`; the codegen axis reads check-runs: `checks`.
statuses: read
checks: read
# Workload identity federation mints the GCP credential from the job's own
Expand Down Expand Up @@ -372,10 +372,9 @@ jobs:
if ! jq -es '
reduce (.[][]) as $s ({};
if has($s.context) then . else .[$s.context] = $s.state end)
| .["pineforge/verify"] == "success"
and .["pineforge/parity"] == "success"
| .["pineforge/parity"] == "success"
' <<< "$statuses" >/dev/null; then
echo "::notice::pineforge/verify and pineforge/parity must both be success on $HEAD_SHA — skipping"
echo "::notice::pineforge/parity must be success on $HEAD_SHA — skipping"
echo "green=false" >> "$GITHUB_OUTPUT"; exit 0
fi
else
Expand Down
13 changes: 13 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,19 @@ version number follows semantic versioning over the surfaces the
`request.security` at the first whole bucket opening at or after the origin.
A run that does not declare it is unchanged. The option has no defined
meaning in a live run. See `docker/README.md`.
- A bounded drawing arena (the line, box and label arenas the generated code
builds from a script's declared `max_*_count`) now writes in place and keeps
its slots in blocks of 32 that a checkpoint of the arena shares, like an
unbound arena's records. A create, a delete or a setter used to replace the
whole state with a deep copy, so a script that moved a few of its live
drawings on every bar paid time proportional to the bound on every call, and
the first write after each script-state checkpoint paid it again; they now
copy only the blocks of 32 records they write, so they do no per-record work
in the bound (the first write after a checkpoint still copies the slot
directory and the creation order, a directory entry and an order index per
occupant, and deleting the oldest drawing moves the directory's entries).
The bound, the typed overflow outcome, the slot reuse order, the
stale-handle behaviour and every value a script reads are unchanged.

## 1.9.1 — 2026-10-31

Expand Down
17 changes: 9 additions & 8 deletions ci/cr150-source-bounds.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -87,9 +87,12 @@ ceilings:
# --emit-seed, 4 stale entries removed): the bounded drawings, the owned
# storage and runtime context service, the ledger cache
# and the selected-capacity driver, reader and core. None is bounded.
# Two of those groups are gone (U1666 and U1668, the whole-state copies a bounded
# drawing arena made on every create, delete and edit): its slots are now shared
# blocks written in place, so the ceiling drops by two.
# One materialize_relative_exits local-list group and three
# SeriesPercentileNearestRank groups remain OPEN as well.
unreviewed: 1406
unreviewed: 1404
pending-flat-memory: 184
owners:
- {name: "generated-cpp", globs: ["tutorial/**"]}
Expand Down Expand Up @@ -1681,14 +1684,12 @@ entries:
- {id: "U1643", file: "src/native_execution_consumer.cpp", symbol: "cohort_opening_index_", ops: ["grow"], container: "unresolved by the index: cohort_opening_index_.reserve(...)", owner: "native-kernel", phase: "unclassified", state: "unreviewed", note: "Derived scratch populated from physical lots during eligible ordinary bar target reads. The lot count must fit row_budget before reserve(max_rows) and emplace_back; over-budget input or bad_alloc uses the complete reader. Reserve requests the fixed payload on rebuild and retains the first successful allocation across commands and begin. Layout estimate from source, not measured: 4096 rows of 16 bytes, 64 KiB payload, excluding vector and allocator overhead. Settlement and host lot-write generations invalidate the view; no rollback image, hash fold or persistence. Member-vector reserve and loop growth are outside the gate's bounded admission form, so this stays OPEN. Tests: tests/test_native_cohort_target_cost.cpp, tests/test_native_cohort_target_transcript.cpp, tests/test_native_cohort_target_invalidation.cpp, tests/test_native_cohort_target_bypass.cpp.", line: 14724}
- {id: "U1644", file: "src/native_execution_consumer.hpp", symbol: "cohort_opening_index_", ops: ["decl"], container: "std::vector<CohortOpeningIndexRow>", owner: "native-kernel", phase: "unclassified", state: "unreviewed", note: "Consumer-owned derived scratch, rebuilt from physical lots during eligible ordinary bar target reads and invalidated by settlement and host lot-write generations. Capacity survives clear and begin; contents are never persisted or hashed and require no rollback image. Layout estimate from source, not measured: kCohortOpeningIndexBytes requests 64 KiB payload, 4096 rows at 16 bytes each, excluding vector and allocator overhead; larger lot sets use the complete reader. Unsupported member-vector admission stays OPEN. Tests: tests/test_native_cohort_target_cost.cpp, tests/test_native_cohort_target_transcript.cpp, tests/test_native_cohort_target_invalidation.cpp, tests/test_native_cohort_target_bypass.cpp.", line: 2867}
- {id: "U1664", file: "include/pineforge/drawing.hpp", symbol: "<temp:string>", ops: ["temp"], container: "unresolved by the index: std::string", owner: "script-state", phase: "unclassified", state: "unreviewed", line: 123}
- {id: "U1665", file: "include/pineforge/drawing.hpp", symbol: "bound_", ops: ["alloc"], container: "unresolved by the index: make_shared", owner: "script-state", phase: "unclassified", state: "unreviewed", line: 710}
- {id: "U1666", file: "include/pineforge/drawing.hpp", symbol: "candidate", ops: ["alloc"], container: "unresolved by the index: make_shared", owner: "script-state", phase: "unclassified", state: "unreviewed", line: 731}
- {id: "U1665", file: "include/pineforge/drawing.hpp", symbol: "bound_", ops: ["alloc"], container: "unresolved by the index: make_shared", owner: "script-state", phase: "unclassified", state: "unreviewed", line: 739}
- {id: "U1667", file: "include/pineforge/drawing.hpp", symbol: "directory", ops: ["decl", "grow"], container: "std::vector<DirectoryEntry>", owner: "script-state", phase: "unclassified", state: "unreviewed", line: 635}
- {id: "U1668", file: "include/pineforge/drawing.hpp", symbol: "make_shared", ops: ["alloc"], container: "unresolved by the index: make_shared", owner: "script-state", phase: "unclassified", state: "unreviewed", line: 838}
- {id: "U1669", file: "include/pineforge/drawing.hpp", symbol: "order", ops: ["assign", "decl", "grow"], container: "std::deque<std::int32_t>", owner: "script-state", phase: "unclassified", state: "unreviewed", line: 640}
- {id: "U1670", file: "include/pineforge/drawing.hpp", symbol: "records", ops: ["decl"], container: "detail::DrawingRecordStore<Rec>", owner: "script-state", phase: "unclassified", state: "unreviewed", line: 763}
- {id: "U1671", file: "include/pineforge/drawing.hpp", symbol: "slots", ops: ["decl"], container: "std::vector<Slot>", owner: "script-state", phase: "unclassified", state: "unreviewed", line: 638}
- {id: "U1672", file: "include/pineforge/drawing.hpp", symbol: "value", ops: ["grow"], container: "unresolved by the index: value.emplace(...)", owner: "script-state", phase: "unclassified", state: "unreviewed", line: 845}
- {id: "U1669", file: "include/pineforge/drawing.hpp", symbol: "order", ops: ["assign", "decl", "grow"], container: "std::deque<std::int32_t>", owner: "script-state", phase: "unclassified", state: "unreviewed", line: 658}
- {id: "U1670", file: "include/pineforge/drawing.hpp", symbol: "records", ops: ["decl"], container: "detail::DrawingRecordStore<Rec>", owner: "script-state", phase: "unclassified", state: "unreviewed", line: 801}
- {id: "U1671", file: "include/pineforge/drawing.hpp", symbol: "slots", ops: ["decl", "grow"], container: "DrawingRecordStore<Slot>", owner: "script-state", phase: "unclassified", state: "unreviewed", line: 636}
- {id: "U1672", file: "include/pineforge/drawing.hpp", symbol: "value", ops: ["grow"], container: "unresolved by the index: value.emplace(...)", owner: "script-state", phase: "unclassified", state: "unreviewed", line: 890}
- {id: "U1673", file: "include/pineforge/owned_storage.hpp", symbol: "<temp:Base>", ops: ["temp"], container: "unresolved by the index: Base", owner: "engine-core", phase: "unclassified", state: "unreviewed", line: 342}
- {id: "U1674", file: "include/pineforge/owned_storage.hpp", symbol: "<temp:OwnedDeque>", ops: ["temp"], container: "unresolved by the index: OwnedDeque", owner: "engine-core", phase: "unclassified", state: "unreviewed", line: 341}
- {id: "U1675", file: "include/pineforge/owned_storage.hpp", symbol: "<temp:deque>", ops: ["temp"], container: "unresolved by the index: std::deque<T, OwnedAllocator<T>>", owner: "engine-core", phase: "unclassified", state: "unreviewed", line: 338}
Expand Down
90 changes: 52 additions & 38 deletions ci/cr150-source-sites.json
Original file line number Diff line number Diff line change
Expand Up @@ -2868,12 +2868,51 @@
"namespace pineforge #1",
"namespace detail #2",
"template < class Rec > struct BoundDrawingState #1",
"explicit BoundDrawingState ( DrawingBoundConfig config ) : slots ( storage_slots ( config ) ) , slot_bound ( config . slot_bound ) , pending_creation_slots ( config . pending_creation_slots ) #1"
"explicit BoundDrawingState ( DrawingBoundConfig config ) : slot_bound ( config . slot_bound ) , pending_creation_slots ( config . pending_creation_slots ) #1"
],
"cls": "grow",
"spelling": "directory . reserve ( . . . )",
"ordinal": 1
},
{
"file": "include/pineforge/drawing.hpp",
"symbol": "slots",
"scope": [
"namespace pineforge #1",
"namespace detail #2",
"template < class Rec > struct BoundDrawingState #1",
"explicit BoundDrawingState ( DrawingBoundConfig config ) : slot_bound ( config . slot_bound ) , pending_creation_slots ( config . pending_creation_slots ) #1"
],
"cls": "grow",
"spelling": "slots . push_back ( . . . )",
"ordinal": 1
},
{
"file": "include/pineforge/drawing.hpp",
"symbol": "directory",
"scope": [
"namespace pineforge #1",
"namespace detail #2",
"template < class Rec > struct BoundDrawingState #1",
"BoundDrawingState ( const BoundDrawingState & other ) : slots ( other . slots ) , order ( other . order ) , next_id ( other . next_id ) , slot_bound ( other . slot_bound ) , pending_creation_slots ( other . pending_creation_slots ) , free_from ( other . free_from ) #1"
],
"cls": "grow",
"spelling": "directory . reserve ( . . . )",
"ordinal": 1
},
{
"file": "include/pineforge/drawing.hpp",
"symbol": "directory",
"scope": [
"namespace pineforge #1",
"namespace detail #2",
"template < class Rec > struct BoundDrawingState #1",
"BoundDrawingState ( const BoundDrawingState & other ) : slots ( other . slots ) , order ( other . order ) , next_id ( other . next_id ) , slot_bound ( other . slot_bound ) , pending_creation_slots ( other . pending_creation_slots ) , free_from ( other . free_from ) #1"
],
"cls": "grow",
"spelling": "directory . assign ( . . . )",
"ordinal": 1
},
{
"file": "include/pineforge/drawing.hpp",
"symbol": "slots",
Expand All @@ -2883,7 +2922,7 @@
"template < class Rec > struct BoundDrawingState #1"
],
"cls": "decl",
"spelling": "std :: vector < Slot >",
"spelling": "DrawingRecordStore < Slot >",
"ordinal": 1
},
{
Expand Down Expand Up @@ -2944,18 +2983,6 @@
"spelling": "make_shared",
"ordinal": 1
},
{
"file": "include/pineforge/drawing.hpp",
"symbol": "candidate",
"scope": [
"namespace pineforge #1",
"template < class Rec > class DrawingArena #1",
"template < class Edit > void bound_edit ( int32_t id , Edit && edit ) #1"
],
"cls": "alloc",
"spelling": "make_shared",
"ordinal": 1
},
{
"file": "include/pineforge/drawing.hpp",
"symbol": "bound_",
Expand Down Expand Up @@ -3035,7 +3062,7 @@
},
{
"file": "include/pineforge/drawing.hpp",
"symbol": "make_shared",
"symbol": "bound_",
"scope": [
"namespace pineforge #1",
"template < class Rec > class DrawingArena #1",
Expand All @@ -3047,50 +3074,50 @@
},
{
"file": "include/pineforge/drawing.hpp",
"symbol": "make_shared",
"symbol": "directory",
"scope": [
"namespace pineforge #1",
"template < class Rec > class DrawingArena #1",
"[ [ nodiscard ] ] DrawingAllocationResult try_alloc ( Rec r ) #1"
],
"cls": "alloc",
"spelling": "make_shared",
"ordinal": 2
"cls": "grow",
"spelling": "directory . reserve ( . . . )",
"ordinal": 1
},
{
"file": "include/pineforge/drawing.hpp",
"symbol": "value",
"symbol": "order",
"scope": [
"namespace pineforge #1",
"template < class Rec > class DrawingArena #1",
"[ [ nodiscard ] ] DrawingAllocationResult try_alloc ( Rec r ) #1"
],
"cls": "grow",
"spelling": "value . emplace ( . . . )",
"spelling": "order . push_back ( . . . )",
"ordinal": 1
},
{
"file": "include/pineforge/drawing.hpp",
"symbol": "directory",
"symbol": "value",
"scope": [
"namespace pineforge #1",
"template < class Rec > class DrawingArena #1",
"[ [ nodiscard ] ] DrawingAllocationResult try_alloc ( Rec r ) #1"
],
"cls": "grow",
"spelling": "directory . push_back ( . . . )",
"spelling": "value . emplace ( . . . )",
"ordinal": 1
},
{
"file": "include/pineforge/drawing.hpp",
"symbol": "order",
"symbol": "directory",
"scope": [
"namespace pineforge #1",
"template < class Rec > class DrawingArena #1",
"[ [ nodiscard ] ] DrawingAllocationResult try_alloc ( Rec r ) #1"
],
"cls": "grow",
"spelling": "order . push_back ( . . . )",
"spelling": "directory . push_back ( . . . )",
"ordinal": 1
},
{
Expand All @@ -3117,19 +3144,6 @@
"spelling": "order_ . push_back ( . . . )",
"ordinal": 1
},
{
"file": "include/pineforge/drawing.hpp",
"symbol": "candidate",
"scope": [
"namespace pineforge #1",
"template < class Rec > class DrawingArena #1",
"void erase ( int32_t id ) #1",
"if ( bound_ ) #1"
],
"cls": "alloc",
"spelling": "make_shared",
"ordinal": 1
},
{
"file": "include/pineforge/drawing.hpp",
"symbol": "text",
Expand Down
6 changes: 4 additions & 2 deletions docker/run_failure_codes.json
Original file line number Diff line number Diff line change
Expand Up @@ -802,7 +802,8 @@
"max_bars_back",
"matrix_elements",
"udt_objects",
"drawing_ids"
"drawing_ids",
"live_drawings"
]
},
"max": {
Expand All @@ -822,7 +823,8 @@
"box drawing ID domain exhausted",
"label drawing ID domain exhausted",
"linefill drawing ID domain exhausted",
"generic drawing ID domain exhausted"
"generic drawing ID domain exhausted",
"The script keeps more than {max} live drawings of one type; the configured drawing capacity is exceeded."
],
"retryable": false,
"since": "1.4.0"
Expand Down
8 changes: 5 additions & 3 deletions docker/run_failure_codes_diff.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
"to": {
"version": null,
"unreleased": true,
"catalogSha256": "d4a555dcea58c5d7a4c3a0f2223832acb04361f6eebda5f4a642226df4a5067f"
"catalogSha256": "00b60fe00cb9371b5e5be06f671217e3d14ed0f612434dae640bed2aabddd699"
},
"catalogSchema": {
"before": "pineforge-run-failure-catalog/v1",
Expand Down Expand Up @@ -238,7 +238,8 @@
"max_bars_back",
"matrix_elements",
"udt_objects",
"drawing_ids"
"drawing_ids",
"live_drawings"
]
},
{
Expand All @@ -262,7 +263,8 @@
"box drawing ID domain exhausted",
"label drawing ID domain exhausted",
"linefill drawing ID domain exhausted",
"generic drawing ID domain exhausted"
"generic drawing ID domain exhausted",
"The script keeps more than {max} live drawings of one type; the configured drawing capacity is exceeded."
]
}
]
Expand Down
8 changes: 5 additions & 3 deletions docs/ci.md
Original file line number Diff line number Diff line change
Expand Up @@ -74,9 +74,11 @@ all stages and its existing event-aware verifier-class selection. `runner-allowl

The smoke configures Release, builds `pineforge_pr_smoke` and directly runs
`ctest --test-dir build -L '^fast$' --output-on-failure --no-tests=error`.
`PINEFORGE_PR_FAST_TESTS` in `tests/CMakeLists.txt` names its eleven real
executables; configure refuses missing, disabled, skippable, private-fixture
or `slow` rows. The target rebuilds those executables with their library.
`PINEFORGE_PR_FAST_TESTS` in `tests/CMakeLists.txt` names its twelve real
executables, including `test_abi_layout_probe`, whose size and offset pins
apply on Linux x86_64 with GNU libstdc++. Configure refuses missing, disabled,
skippable, private-fixture or `slow` rows. The target rebuilds those executables
with their library.
PR proof legs build cold; trusted post workflows also build cold and contain
no Actions cache restore or save.

Expand Down
10 changes: 5 additions & 5 deletions docs/design/BARS-BIN-INPUT.md
Original file line number Diff line number Diff line change
Expand Up @@ -205,8 +205,8 @@ Selected-window selection includes a report policy, any window option or
`--validate-window-only` (`_selected_requested` docker/run_json.py:4699).
The refusals above use the ordinary request code, not a window-specific
code (`_request_invalid` docker/run_json.py:4465). The catalog names
`run_request_invalid` docker/run_failure_codes.json:1538 and includes the
option `ohlcv_bin` docker/run_failure_codes.json:1563.
`run_request_invalid` docker/run_failure_codes.json:1540 and includes the
option `ohlcv_bin` docker/run_failure_codes.json:1565.
These request refusals exit 1 and emit the failure JSON line on stdout
(`exit_status` docker/run_json.py:4465; `write_failure`
docker/run_json.py:2366).
Expand All @@ -224,7 +224,7 @@ Read-only searches covered `docker/`, `scripts/`, `runner/` and repository
filenames/release notes; `campaign/` and `cloudrun/` are absent. The local
backtest entry is `main` docker/run_json.py:5345; the catalog itself
identifies the optimizer-only refusal separately (`description`
docker/run_failure_codes.json:2593). Neither establishes the production HPO
docker/run_failure_codes.json:2595). Neither establishes the production HPO
runner's input support.

Check the separate **pineforge-hpo** repository named by this repository's
Expand Down Expand Up @@ -336,8 +336,8 @@ Failure JSON uses `engine`, `error`, `code`, `args` (`doc`
docker/run_json.py:2322; `code` docker/run_json.py:2325; `args`
docker/run_json.py:2326). The catalog entries are `chart_bars_unreadable`
docker/run_failure_codes.json:60, `symbol_feeds_refused`
docker/run_failure_codes.json:2178 and `run_request_invalid`
docker/run_failure_codes.json:1538. Shared binary-reader helpers additionally
docker/run_failure_codes.json:2180 and `run_request_invalid`
docker/run_failure_codes.json:1540. Shared binary-reader helpers additionally
refuse malformed file `size`, metadata/digests as `sidecar`, and a bad feed
companion as `close_file` (`bar_count` docker/pf_bars.py:101;
`check_sidecar` docker/pf_bars.py:137; `check_close_size`
Expand Down
Loading
Loading