Skip to content

Pine UDT object graphs on the paged object Store - #586

Closed
luisleo526 wants to merge 6 commits into
store/strings-maps-poolfrom
store/udt-object-graphs
Closed

luisleo526 wants to merge 6 commits into
store/strings-maps-poolfrom
store/udt-object-graphs

Conversation

@luisleo526

Copy link
Copy Markdown
Collaborator

Draft, stacked on #568 (the paged object Store). The base switches to main once #568 merges. Proof runs and the full description come before this leaves draft.

🤖 Generated with Claude Code

luisleo526 and others added 6 commits October 28, 2026 06:53
Generated UDT graphs keep node payloads, owning edges, roots and the
collector and copy links in the paged object Store. Shallow copies retain child
identities; deep copies preserve aliases and cycles within the copy.
Collection releases nodes unreachable from the registered roots, including
cycles. The caller's transaction versions graph contents, root bindings and
deletions together.

Every multi-record graph operation opens its scope through Store::scope(): it
joins the caller's open transaction without taking a pool handle and owns one
handle only when none is open. The fifth nested begin() on a full caller pool
throws TxPoolExhausted and leaves the graph and the caller's transaction
usable. At the per-Store live-object limit the (limit+1)-th object throws the
typed ScratchCapacityError, rolls a partial deep copy back, and consumes no id.

Tests: graph operations, boundaries, churn, resource and handle accounting,
guards, calc-on-fill, rows for the handle pool and the live-object limit, and a
100k and a one-million-bar growth row. The one-million-bar row ends at the
production live-object limit (349,524 complete bars, then a typed refusal and a
rolled-back bar) and is pinned as slow.

The source-bound manifest gains the graph's three resize sites, and the
documented slow-test counts follow the merged tree.
Brings in the store branch head after its merge of main. No conflict: the
store branch's new changes touch the workflow files, the CI preflight script
and its self-test, and the CI documentation, none of the lines this branch
edits.
The fragment under tests/cr150.d carried the name of the work package that
introduced it. It is renamed after what it registers, and the comments in the
slow-test pin list that cite its path follow. The registration file is picked
up by the existing glob, so no CMake line changes; the content of the fragment
is unchanged.
The kernel source block of CMakeLists.txt is read line by line by the
detached-comments measurement, which takes each line as one path. The
UDT graph source shared a line with the object store source, so the
measurement stopped at "kernel source is missing". Give it its own line
and move the doc citations of the top-level build file that follow the
inserted line by one.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
… graph

The source gate found three grow sites on store_ in the UDT graph unit
(resize_edges once, resize_payload twice) that the reviewed inventory did
not list. Add those three records; the inventory was emitted by the
scanner on this tree and compared with the committed file as a set of
records, and nothing else changes.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
UdtGraph::node and UdtGraph::read_object called pine_na_stop, an inline helper
of the codegen contract, which put that symbol into libpineforge_kernel.a while
the kernel boundary keeps the helpers out of the archive. Raise the same coded
failure directly from a local function, as the array and matrix units do: the
same code (pine_na_reference), the same arguments and the same English text.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
luisleo526 added a commit that referenced this pull request Oct 28, 2026
…aling, UDT graphs, metrics replay and the CI admission fix (#616)

This lands twelve engine pull requests as one change, verified and measured once on the combined tree:

- #593 scratch: a fixed write-through read cache for the adapter's id tables
- #594 live runner: a delta report stream by default, and report-path work that does not rescan closed trades
- #597 live runner: typed pre-growth stop for the ledger budget and flat pending counts
- #608 run_json: reserve the report channel, so strategy output on fd 1 cannot corrupt a report
- #586 Pine UDT object graphs on the paged object Store
- #578 native order: dormant working book, flat per-point cost for never-filled orders
- #579 adapter: skip roster passes and empty-family scans that cannot change anything
- #599 adapter: read projected pending orders through one cached duplicate index
- #563 adapter: gate the reversal exit cancel on candidate owners instead of every historical id
- #591 report sink: retire sealed closed-trade rows on sink routes when the module opts in
- #596 metrics: stream the bar Sharpe and Sortino through an ordered, packed return replay
- #615 ci: accept release.yml's matrix runner under its fetched path in PR admission

Fixes found while testing the combined tree are in the final commits: the retiring ledger's cache sizing, a residency witness that bounds sink-run heap by the declared cache cap and checks zero growth at 100k, 200k and 1M trades, a test fix for a descriptor reuse race, and a standing-orders timing grid whose 20,000-order point is tracked in #621. The member pull requests are closed as landed here.
@luisleo526

Copy link
Copy Markdown
Collaborator Author

Landed in #616 (squash a991b4e on main), which carries this change with one verify and one parity run on the combined tree.

@luisleo526 luisleo526 closed this Oct 28, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant