Repository navigation
metrics: carry the monthly return key as 64 bits, so extreme timestamps no longer overflow int - #574
Closed
luisleo526 wants to merge 76 commits into
Closed
luisleo526 wants to merge 76 commits into
luisleo526 wants to merge 76 commits into
Conversation
…ents and refuse a minting job without one (CR-304) release.yml `release` and `notify-hub` and the release ruleset probe's `probe` job use the `release` environment (human-dispatched); promote-baseline.yml's `promote` job uses `release-bot` (automatic, every push to main). scripts/ci_preflight.py now refuses any job that mints the release App token without a literal environment; the tests prove the refusal and its controls. The jobs keep reading the same secret names, so they work before and after the owner copies the secrets into the environments. Not to be merged until the owner confirms the two environments and their secrets exist. Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Bring the branch up to date with main so its checks run on the current tree. No conflicts; no file of the branch changed by the merge itself. Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
…ith a doc-lint rule that holds it Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
… tree builder reads CiFileLoading.make_tree copies the actionlint config and tests/CMakeLists.txt using self.CONFIG and self.CMAKE. test_second_workflow_files_are_discovered_by_the_ci_entrypoint lends it an AppTokenEnvironments test that had neither attribute, so the preflight-tests stage failed with AttributeError before any assertion ran. The test now carries the same two class constants; no assertion changes. Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Bring the branch up to date with main so its checks run on the current tree. No conflicts; no file of the branch changed by the merge itself. Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
…in the number of bars Strings and maps now live in the paged object store instead of the C++ heap, so their memory does not grow with the number of bars a script runs. - ScriptString and the map image keep their bytes in store objects; split, concat and the map operations read and write through the store. - Store transactions use a fixed pool of handles (four caller slots plus one cleanup slot). Running out throws TxPoolExhausted before any state changes; there is no heap fallback. Store::scope() joins an active transaction without taking a slot. - The join hooks join_active_tx() and abandon_joined_tx() are public pure virtuals so forwarding wrappers can pass them on. begin_cleanup() is used only by the map destructors, and note_cleanup_skipped(CleanupSkip) records whether a cleanup was skipped because the transaction was rollback-only or because it failed. - A store refuses the (limit+1)-th live object with scratch_capacity_exceeded. The limit is Shape::max_live_objects, default and ceiling 1,048,576, counted per store and rolled back with the transaction. The error reuses the cohort resource name for now; a dedicated name follows before the 1.8.0 tag. - Tests cover string and map parity, rollback, nested destroy, split, the pool limits, the live-object cap and wrapper forwarding, plus 100k and 1m growth runs for strings, maps and prepared maps. Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Plain merge; keeps the strict ruleset's up-to-date requirement. Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Two conflicts, both in the source gate. The scanner change here retires the entry for the trade-ledger iterator index (it no longer matches a site), so that entry stays removed while main's new entry for the command scratch cache budget is kept. Main also added two entries that reuse the ids this branch had given to the object-limit message and the map iterator temporary; those two move to U1545 and U1546. The unreviewed ceiling becomes 1281 (1279 here plus main's 2), the pending-flat-memory ceiling stays 185, and the pinned OPEN count becomes 1466, the number of entries (1463 on the common base, plus 2 from main, plus 23 added and minus 22 removed here). Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
… drop the stale 180 s wording test_selected_window_ownership_manifest_controls_shard_1of4 took 74 s on an idle 8-vCPU box while shards 2-4 took 41-50 s (the modulo split over sorted case ids put the heaviest controls together). The four rows carry no explicit TIMEOUT any more (#504 removed it) but the tree still described a 180 s budget and the CMake guard still exempted the exact old statement. - Shards are now assigned largest-first to the lightest shard, with a weight per case read from its AST (checker subprocess launches, through self helpers and literal loops). No measured seconds are stored. The partition stays exact, order independent and deterministic; --shard I/N validation and the "ran N tests as selected" fail-closed check are unchanged. - The two 60 s subprocess deadlines inside the controls are removed. - scripts/check_cr150_cmake_d.py no longer exempts the old six-row "TIMEOUT 180" statement, and its test now requires the refusal. - docs/ci.md, tests/ownership/README.md and the CMake comment describe the balancing and no deadline. - New rows: balance bound (max/min <= 5/4, violated by the old split) and an estimator row; the partition row now checks input-order independence. Documentation sentences removed from docs/ci.md, all introduced by 375795a (the change that split the ownership manifest controls into four CTest shards): the sentence saying that change splits the controls into four CTest shards (`test_selected_window_ownership_manifest_controls_shard_1of4` through the fourth), the sentence saying it adds three public registered/run rows to every engine profile in both fixture worlds and only raises the counts above the pinned minimum floors, and the sentence saying the private-fixture and receipt row populations stay the same. The replacement paragraph states the balanced four-shard split and the unchanged row populations. Measured on a throwaway 8-vCPU spot VM: shards 51/57/53/55 s after, 74/42/41/50 s before. Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
…er-platform stream memory bound The shared descriptor guard compares every status and descriptor flag at each boundary and masks only Darwin's kernel-maintained "descriptor was written" bit (FWASWRITTEN) under __APPLE__. A new test plants a real F_SETFL, F_SETFD and close after a pipe write and requires the guard to reject each; two more ctest rows run those planted modes through a small CMake driver that accepts only exit status 1 together with the guard's own message. The 64 MiB stream memory test keeps its 1 MiB bound everywhere except Darwin, where it allows 2 MiB for the 16 KiB page size. CHANGELOG notes the macOS report-sink limit is no longer listed (re-examined, not re-measured). 1.8.0 is Linux only, so no CI job exercises the Darwin mask or the Darwin bound. Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Attribute exclusive opens and fork-descendant scratch files to their creating process, keep unrelated co-tenants out of the witness, and report the offending path with its PID or an explicit unattributable reason. Add three public Linux CTest cases for exclusive open, inherited evidence, and diagnostics. Carry the three rows through verifier floors and mock accounting. Preserve documentation line counts and refresh the floor-table citations. Documentation replacements from 3ea5a0d name the old wording: "Their default runs now enter strict exclusion accounting" "Verifier 8 + preflight 8 + command-after 8 + report 4 add 28 public rows; plain Debug-type runs enforce the increased registration floors." "Release 938 with the overlay or 631 without it" "The floor itself remains fixed at 631/334 absent or 938/365 present" "The native PR registration floor is 1000" "Both numbers are constants of the profile" "The full-run release and kernel floors are the table's own numbers above" "EXCLUDED_REGISTERED_MIN holds 904 for debug, 895 for sanitizers" "The run floors in the table above" The release and kernel table rows from 3ea5a0d use the new floors. The population wording and table header from b97c409 are replaced: "The registered column is why the absent floor is not the absent registration, and it is to be re-measured after the registration fix lands." "registered (present / absent)" The four citation edits retain the passages named by: "The floors' numbers live in one place" "Each profile counts the rows that" "the minimum number of CTest rows" "The profile carries a row floor" Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Plain merge; keeps the strict ruleset's up-to-date requirement. Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
…inal docs wrap The App-token environment guard recognised only actions/create-github-app-token by action name; a tibdex/github-app-token step fed from vars, inputs or a secret whose name does not say "private key" passed without an environment. Both actions are now recognised by name, with a refusal row and a removal control for every ref and quoting form and every key source. The docs paragraph about the deployment environments is shortened to its facts (no internal card id) and the four neighbouring sentences keep their original line wrapping, so the paragraph is a pure addition to docs/ci.md. Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
…ed reviewer Read back from the repository settings: both environments allow deployments only from main and neither has a required reviewer, so the docs sentence no longer claims an owner review for `release`. Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Corrects four comments that no longer match the code they describe, and one stale line number in a script comment: - scripts/ci_verify.py: the selected-sink memory test is registered at its current line of tests/CMakeLists.txt. - tests/test_scratch_create_pinned_text.cpp: the header names the files that produce the pinned create diagnostics instead of a release. - src/source/pine_adapter.cpp: the placement table scans the retained placements and consults the historical minima for erased rows; it has no per-id index. - include/pineforge/native_host.hpp: the live-order read comment no longer claims the reads allocate nothing, since a spilled row is read into a buffer. No code changes. Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
… path it pins The header named two producing files; the test also pins the id-pair scratch file and the successor-roots create. It now lists all four scratch paths by what they are, and drops a stale note about an unobserved prediction. Comment text only. Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
…labels Reword published documentation that carried internal task and card labels so each passage says what the thing is. Lines that only changed a label keep their meaning. Sentences replaced or dropped, named by the commit that introduced each: - 91353de: "Read-only census for CR-150 L22u / A6 and A5-WIDER." and "All eight vectors use the three-term verdict;" (arena-bound pages), and the two passages of cr150-contracts.md that cite the external design lane's work files and its revision 6 amendment. - d093560: the paragraph of native-refactor-progress.md that quotes the supervisor cap and the decision that stopped the R5 performance wave. - a77fb73: "R4-D L1 advanced BacktestEngine, NativeStrategyHost, and the private consumer to engine_script_run_v17;" (abi-stability.md). - 44bb687: "R5 L4 adds NativeRunSpec::margin, folded only when it is set;" and "R5 L5 adds calculation, max_recalculations_per_point and open_ba..." (abi-stability.md). Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
…ds instead of internal tracking labels Replace internal task, card and work-lane labels in source comments, docstrings, workflow comments and human-readable progress lines of test programs with plain descriptions. About 620 text lines in 285 files; no identifier, file name, CTest selector, CMake fence, assertion or data file is renamed or edited. Files whose exact bytes are pinned or whose text is data stay unchanged: the frozen run_json fixture (its digest is asserted), fixture sources hashed by the heap census, the ci/ gate data, the broker-state waiver list, the ownership probe notes, the heap census report heading and the run-failure label passed to note_run_failure. Printed lines that changed are listed in the pull request; each old text was searched across the engine and the other repositories and nothing reads them. Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
…table bytes check_kernel_residuals.py fed the whole debug-stripped kernel archive to `strings -a`, so instruction bytes in a text section could spell a forbidden name by chance (four code bytes were reported on a macOS Release object). The `strings` surface is now built per archive member from section payloads: executable sections, sections without file bytes and an explicit list of debug/linker metadata sections are skipped, every other section (including unfamiliar names) is scanned. `nm -C` still reads the whole archive. Duplicate member names in the archive are an InfrastructureError, because `ar p <name>` cannot select a later member with the same name. A truncated or unrecognised object structure is an InfrastructureError as well; there is no fallback to scanning the whole object and no object or offset exception. Tests: hand-built ELF and Mach-O byte fixtures (thin, fat and fat64, 32 and 64 bit, both byte orders, ELF extended section counts) show that planted code bytes are ignored while the same word in a data section, an unknown section or a symbol is still flagged. The macOS fixtures are synthetic, not compiler output; 1.8.0 is Linux only. Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
…aragraph adds Two preflight tests pin docs/ci.md to an exact line count (the post-fleet docs test and the documented slow-row count test). The environment paragraph is now a pure addition of one blank and one paragraph line, so both pins read 2016 instead of 2014. Nothing else in either test changes. Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
…ps no longer overflow int The key that buckets equity points into months, (year * 12 + month), was computed in int. For timestamps far from the epoch (INT64_MIN milliseconds is about year -292 million) the product overflowed, which is undefined behaviour, and the libc fallback for seconds beyond +-2^40 could fail and leave an unfilled calendar. The key is now std::int64_t end to end: the UTC helper, the memo, the monthly walk and the fold in metrics_fold.hpp. The UTC key always uses the civil-date arithmetic, which is exact over the whole millisecond range, and never calls gmtime_r; the chart-timezone key widens the year before it adds 1900 and multiplies. A local-time lookup that libc cannot answer now raises the existing report_result_invalid refusal instead of returning a key read from a zeroed structure. Keys for in-range timestamps are unchanged. tests/test_utc_month_key_arithmetic.cpp checks the key against an independent Gregorian day count written in the test, at INT64_MIN, INT64_MIN + 1, +-2^41 s, INT64_MAX, around the arithmetic span edges, and over a sweep of month boundaries and leap days. Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
The two-line comment above the EXPORT_NAME property moved the line from 173 to 174. Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
luisleo526
marked this pull request as ready for review
October 28, 2026 00:26
…main The native order ABI check compares this file with the frozen base commit and fails when a single byte differs. The wording pass changed one comment line in it; restore main's bytes so the file stays pinned. The comment is cleaned together with the pin in a later joint change.
…indings reports them With environment bindings on the credentialed jobs, the App-token environment finding for promote-guard arrives after the runner findings (which main's light job move added) and the action-pin lint, not first. The expected list is built in that order; every finding is still required, none is dropped. Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Main now carries the squashed first five members of the previous stack. The only conflict was in CHANGELOG.md: keep main's lines and this branch's own macOS report-sink note, which sits between the walk-forward entry and the supported-platforms entry. The merged CHANGELOG.md equals this branch's file; nothing else needed a hand edit. Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Plain merge of the member's branch onto the stack so far. No conflict, no hand edit. Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Plain merge of the member's branch onto the stack so far. No conflict, no hand edit. Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Plain merge of the member's branch onto the stack so far. No conflict, no hand edit. Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Plain merge of the member's branch onto the stack so far. No conflict, no hand edit, including CHANGELOG.md. Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
luisleo526
added a commit
that referenced
this pull request
Oct 28, 2026
…port-sink vectors, release environments and parallel preflight (#609) This lands a stack of ten engine pull requests as one change, verified and measured once on the combined tree: - #567 tests: descriptor report-sink guard rows, Darwin write bookkeeping, per-platform stream memory bound - #572 kernel residual check: scan section payloads and symbols, never executable bytes - #511 ci: bind App-token minting jobs to release environments - #568 engine: Pine strings and maps stored on the paged object layer, flat in the number of bars - #574 metrics: carry the monthly return key as 64 bits, so extreme timestamps no longer overflow int - #575 abi: native_order_v8 and PF_ABI_VERSION 5, so a stale native module or a strategy library built for ABI 4 is refused - #558 docker: add the pf-report-sink/v1 golden vectors with a generator, a native capture tool and a drift test - #595 entrypoint: forward PINEFORGE_RUN_ID to run_json.py --run-id - #604 ci: route same-repository PR proof through member-only admission - #609 ci: parallelize independent preflight stages and balance unittest shards The member pull requests are closed as landed here.
Collaborator
Author
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The key that buckets equity points into months, (year * 12 + month), was
computed in int. For timestamps far from the epoch (INT64_MIN milliseconds is
about year -292 million) the product overflowed, which is undefined behaviour,
and the libc fallback for seconds beyond +-2^40 could fail and leave an
unfilled calendar. The key is now std::int64_t end to end: the UTC helper, the
memo, the monthly walk and the fold in metrics_fold.hpp. The UTC key always
uses the civil-date arithmetic, which is exact over the whole millisecond
range, and never calls gmtime_r; the chart-timezone key widens the year before
it adds 1900 and multiplies. A local-time lookup that libc cannot answer now
raises the existing report_result_invalid refusal instead of returning a key
read from a zeroed structure. Keys for in-range timestamps are unchanged.
tests/test_utc_month_key_arithmetic.cpp checks the key against an independent
Gregorian day count written in the test, at INT64_MIN, INT64_MIN + 1,
+-2^41 s, INT64_MAX, around the arithmetic span edges, and over a sweep of
month boundaries and leap days.
Co-Authored-By: Claude Sonnet 5.5 [email protected]
🤖 Generated with Claude Code