Repository navigation
ci: a translate counts only if the generated C++ compiles - #282
luisleo526 wants to merge 26 commits into
Conversation
The GitHub-hosted pytest job never provided the engine headers, Eigen or a compiler, so the 71 test files that compile generated C++ skipped themselves there and a translate-only run counted as green. Issue #281 (three valid scripts that translate but do not build) got through that way. - tests/_compile.py: PINEFORGE_REQUIRE_COMPILE=1 turns a missing compiler, engine include or Eigen into a failure, in the helper and in the collection guard. Without the flag the opt-in skip is unchanged. - tests/test_translate_implies_compile.py: translate every fixture, every gate-corpus script and the paired engine corpus, compile each result, record every translate-ok/compile-fails script in a plain list and fail if the list is not empty. Front-end rejections are reported separately. - tests/fixtures/community_repros: the three scripts of #281. Cases 2 and 3 carry a strict xfail that only a failed compiler result can satisfy; case 1 is rejected by the front end and carries a strict xfail that only a CompileError can satisfy. A fix flips the row to a failure until the marker is removed. - KNOWN_COMPILE_FAILURES: one existing fixture (drawing_lifetime/w9dg-label-collect) translates but does not compile (no is_na overload for std::string). It is excluded from the ordinary sweep and compiled under its own strict xfail row. - tests/test_require_compile.py, tests/test_ci_compile_contract.py: real child-pytest controls for both directions of the flag, and mutation controls for the workflow wiring. - .github/workflows/test.yml: the existing four-job pytest matrix checks out the paired engine and its corpus, installs g++ and Eigen, sets the flag, shards the sweep and uploads the failure list. No secret or permission is added. test-check still depends on the pytest matrix. - docs/ci-compile.md: the rule, the reports, the commands and the open access decision. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The pytest job set PINEFORGE_COMPILE_REPORT_DIR from runner.temp in its job-level env. GitHub does not allow the runner context there (only github, inputs, matrix, needs, secrets, strategy and vars), so the Test workflow was invalid and the run failed with no jobs. actionlint reports it: context "runner" is not allowed here. The report directory now lives under github.workspace/.ci/compile-report (pytest skips dot directories), and the artifact step reads the same path. The workflow contract test pins the new path and refuses a runner context before the steps. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…end rejections Review edits for the translate-implies-compile rule. - The install step exports the engine and corpus commit ids; the sweep records both in results.json and pairing.txt and, with PINEFORGE_REQUIRE_COMPILE=1, fails when either is not 40 hex characters. - The paired engine corpus sweep fails below a floor of 312 strategies, checked on the full list before sharding. - Front-end rejections are ratcheted against tests/front_end_rejection_baseline.txt: a new rejection fails, and so does a baseline entry that no longer rejects. Engine corpus labels are prefixed engine-corpus/. - docs/ci-compile.md: pairing is main by design, the ratchet, all four Python-version legs must be green and re-run together, and the corrected coverage statement. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…n eight parallel parts The first run of this change put the compile flag, the engine checkout and the sharded sweep into each of the four Python legs of the pytest job. Every leg then ran the whole suite with the compile-helper tests un-skipped, four times, and each leg took between 78 and 104 minutes (on main the legs take 10 to 20 minutes). One sweep shard alone takes about four minutes, so the cost is the rest of the suite with the compile tests un-skipped. - The pytest job is restored to exactly what it is on main. - A new job, compile, carries the rule: Python 3.12 only, the paired engine and corpus checkout, g++ and Eigen, and eight parts that run in parallel: four shards of the translate-implies-compile sweep, and four slices of the rest of the suite run with the flag set, so every compile-helper test runs exactly once. - The slices come from one rule in tests/_compile_partition.py, used by the workflow step and by the completeness test: the sorted test files the pytest configuration collects, minus the files the sweep parts run, index K modulo four. - test-check needs compile and lists it with the heavy jobs, so a failed or cancelled compile job fails the PR check, and a skipped one is accepted only under the same cheap-diff proof as pytest. - No timeout, no continue-on-error and no new cancellation; main's workflow concurrency line is unchanged. - The workflow contract test pins the layout with mutation rows, the pinned aggregate strings in tests/test_pr_workflows.py follow the new needs and heavy-job lists, and docs/ci-compile.md describes it. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The compile job paired the pull request with the floating engine main. Engine main moved ahead of codegen (host members the codegen does not reserve), so a required check turned red because of someone else's merge. - ci/engine-pin holds the one engine commit the compile job pairs with. The job reads and validates it (one line, 40 lowercase hex characters), checks the engine out at exactly that commit, and fails if the checked-out commit differs. - The sweep records the pin next to the engine and corpus commits, and with PINEFORGE_REQUIRE_COMPILE=1 fails unless the recorded engine commit equals the pin. - Tests pin the workflow text with mutation rows (the floating ref, a dropped equality check, a dropped pin step) and run the pin checks on real child processes. - docs/ci-compile.md explains the pin: bumping it is a normal reviewed commit and is where drift against a newer engine gets fixed. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The compile job pairs with a pinned engine, so a newer engine that the codegen does not yet follow stays invisible until someone bumps the pin. A daily job now runs codegen main against the current engine main and reports the engine commit, the pin and whether they differ; a red run is the drift report. - .github/workflows/engine-drift.yml runs on a daily schedule and on manual dispatch only, never on pull requests, with the same compile flag as the compile job, and has no timeout, no bypass and no cancellation. - tests/test_engine_drift_workflow.py pins the triggers, the floating engine ref, the flag and the absence of limits, with mutation rows. - docs/ci-engine-drift.md says how to read a run and who bumps the pin. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The scheduled drift job pairs on purpose with the floating engine main, but the sweep's pairing check demanded that the engine commit equal ci/engine-pin whenever the compile flag was set, so the drift job would have failed every day before any drift test ran. PINEFORGE_ENGINE_PAIRING now selects the mode, with the flag set: unset or pinned keeps the equality check against the pin, floating skips only that check, and any other value fails. The pin is still read and validated, and the engine commit, the pin and the mode are all recorded. The compile job sets pinned, the drift job sets floating, and tests pin both with real child-process rows and mutation rows. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The first GitHub run of the compile job showed that the engine commit chosen for the pin already had the host members initial_capital and replace, which the committed host_members.py does not reserve. The pin now points at the engine v1.9.1 release commit, fc0a2df5deca07f8a7e59995a17e71203fb19f34, the engine the regenerated host-member module is derived from. The contract test no longer repeats the pin value: the pin file is checked for its format only, so a later bump is one reviewed change to ci/engine-pin. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…lies-compile branch No conflicts, no edits. The compile job stays in test.yml for now. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
test.yml is push-to-main and dispatch only since the admission workflow took over pull requests, so the translate-implies-compile job would not have stopped a pull request whose generated C++ does not compile. gke-pr.yml now has the same eight part compile job: admitted behind the admit job on the pod runner, checking out the admitted head and the engine pinned by ci/engine-pin, with no run-time install (the pod image has g++ and Eigen; one fail-fast step prints g++ --version and checks /usr/include/eigen3). test-check and result need it. The compile job stays in test.yml for pushes. The admission checker lists compile among the pod jobs and in the exact job maps; rows prove the real checker accepts the job, refuses it without needs: [admit], and that compile and result run for a pull request. The compile contract tests are re-pinned to the current test.yml text (the pytest job runs on the pod runner) and now read both workflows. The strict xfail for the #281 case with an na array field is removed because that case now translates and compiles; the other two cases keep theirs. docs/ci.md and docs/ci-compile.md say where each gate runs. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
One plain merge of main (c1cc532, the TradingView-refused shapes) into the branch so the pull request is current with main before its pre-merge run. No conflict, no edit of the merge. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…il markers go The translate-implies-compile test marked issue 281 cases 1 and 2 (issue_281_comma_body, issue_281_string_na) as strict xfail so that a fix would force the marker out. Main now refuses and accepts the right shapes (the TradingView-refused-shapes fix), and a run of the merged head on CLOUD failed exactly those two rows as XPASS(strict) while compile-corpus and the gate passed. - tests/test_translate_implies_compile.py: all three issue-281 files are ordinary parametrized rows with no marks; the body is unchanged, so a regression (a front-end rejection or a compiler failure) still fails them. The row that checked each case's exact xfail marks now asserts the new truth for every case: no xfail mark, and the parametrization still covers all three files. - docs/ci-compile.md: the registry is described as the only strict-xfail class left, the issue-281 rows as ordinary rows that must translate and compile, and the two verification commands now run the three rows and then the full sweep. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…e it checks test_issue_281_rows_carry_no_xfail compared the parametrization with ISSUE_281, and both are built from ISSUE_281, so dropping a file from the tuple could not fail it. - tests/test_translate_implies_compile.py: the row now also asserts that the issue_281_*.pine files found in tests/fixtures/community_repros equal ISSUE_281, that there are three of them, and that each exists. The no-xfail check is unchanged. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Brings v1.11.0 into the branch that adds the required compile job to the pull request workflows. Three test modules conflict. tests/_compile.py keeps both required-input flags in one helper: PINEFORGE_REQUIRE_COMPILE for the compiler, engine and Eigen inputs (a failure with the branch's prefixed message) and PINEFORGE_REQUIRE_NATIVE for the native inputs, the built runtime archive included. tests/test_gke_pr_admission.py and tests/test_pr_workflows.py keep main's hosted runners for the workflow-lint, package-files, pytest and differential jobs and its native-engine route, and the branch's compile job on the GKE runner with its pinned engine pairing, shard variables and required-compile flag; every job inventory, dependency list, runner expectation and mutation row includes the compile job. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Brings in the pull request that landed on main after the previous merge (the reservation of the numbered tuple element bindings, and the string-history refusal rows pinned against the pinned reference). No conflict and no hand edit. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…s in line with main Main forbids every runner label that is self-hosted or starts with pf-ci, gke- or gkp- (tests/test_release_workflows.py), and all its jobs run on GitHub-hosted ubuntu-24.04. This branch put the required compile job of the pull request workflow on a GKE pod with a prebuilt image. The compile job of gke-pr.yml now runs on ubuntu-24.04 and installs g++ and libeigen3-dev the way the compile job of test.yml does; PF_CI_LABELS of both compile jobs names the hosted label. tests/test_ci_compile_contract.py, tests/test_gke_pr_admission.py and tests/test_pr_workflows.py assert the hosted runner and the install step, and every reverted-rule control is kept. The leg of test_native_driver_pin_uses_complete_bytes_against_the_real_base_policy that runs the pinned base policy now runs it on the historical job inventory, without the compile job, which is what that policy can admit; the candidate policy is still checked with the compile job in both inventories. tests/front_end_rejection_baseline.txt lists the 85 fixtures that the front end of main now rejects (diagnostics added on main since the baseline was measured), and its header says so. tests/test_compile_require_native.py clears the inherited required-compile flag in the row that pins the native flag alone. The compile documents say where the job runs and what it installs. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
ci/engine-pin held the commit of the engine release v1.9.1, the engine that the translator was paired with when the compile rule was written. The translator is at 1.11.0 now, and its generated C++ is built only against its own paired engine release, so both compile jobs would have built 1.11.0 output against 1.9.1 headers. The pin now holds the commit of the engine release v1.11.0. The workflows, the documents and the tests only require one lowercase 40-hex line, and they are unchanged. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
… baseline The header of tests/front_end_rejection_baseline.txt now gives, for each group of the 85 labels that main's front end added, the test that owns the group and a status: a TradingView refusal code with the line that records it, or not established. For each of the 26 labels in the TradingView fixture directories it gives the first diagnostic of the front end and the status with its evidence. No label changes. docs/ci-compile.md no longer says that two workflow files were outside an edit allowlist; it says that this pull request does not change them. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The sweep module now runs the matrix generator in a temporary directory and takes its own exit code, pins the manifest interface (schema version 1, generator version "3", and the six reviewed input digests, compared with the manifest and with the real files), checks every case source digest and the group counts, translates and compiles every positive case through the public translator and the existing compile helper, requires the intended diagnostic code and phase of each invalid control, splits the positive cases over the four sweep shards, and writes a result report. Mutation rows cover each pin and case rule. Every valid case that fails to translate or compile fails its row; there is no table of known failures yet. The consumer status stays INCOMPLETE while the producer's overall coverage or inventory is not COMPLETE. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The report directory of the sweep module was a fixture that sweep_results depended on. The pairing controls of tests/test_require_compile.py import sweep_results alone into a probe module, so that dependency made twenty-one of their rows fail with "fixture not found". The report directory is now a plain function that both fixtures writing a report call, so sweep_results keeps its original signature and the two reports still share one directory. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The consumer rows of the generated compile matrix translate and compile its 426 positive cases. On this tree 123 of them fail: 105 are refused by the public translation and 18 produce C++ that does not compile. These are real gaps and are recorded in the producer's inventory, which stays unresolved. The consumer now compares the failures it observes with a committed table, tests/fixtures/generated_compile_matrix/known_failures.tsv (case id, failing phase, cluster id, normalized reason), as an exact set in both directions within the scope each family and shard attempted. A failing case that is not in the table fails the row, a table case that no longer fails fails the row, and a changed failing phase fails the row. The table is a debt register, not a waiver: every case is still translated and compiled, and the failure message lists the table rows to add or remove. - read_known_matrix_failures admits only a canonical table (UTF-8, LF line ends, sorted unique case ids, known phases, contiguous cluster numbers, one phase and reason per cluster) and fails with a message that starts with INCOMPLETE otherwise. - compare_known_matrix_failures is a pure function of the observed failures, the table and the attempted scope. - The results report gains knownFailureCount, newFailureCount and staleCount. The consumer status stays INCOMPLETE and the producer's coverage, inventory and results statuses are copied unchanged. - Rows that need no compiler check the shipped table, that every table id is a positive case of the generated manifest, 21 corruptions of the table file (each paired with the unmutated read), and the comparison on small synthetic sets. Coverage and results remain INCOMPLETE and the inventory remains UNRESOLVED. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The generator, its coverage specification and seed index, the three seed sources, the generator tests and their document, taken unchanged from the commit that holds them. The compile job's consumer of the matrix follows in later commits. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Main now holds the 1.11.1 codegen train and the string input default fix. The wiring branch was built on the main before the train. The merge has no conflict, and against main the branch changes exactly the paths it changed against the old main. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The compile matrix consumer compares only the case id and the failing phase of the known failures table. Its cluster id and normalized reason are documentation, and no script writes the file. State both in the compile coverage document, with the steps that regenerate the table from the failure message of the matrix row. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
Graphify reviewed this change.
Worth a look — the grounded gate found no coupling regressions or blocking issues, but 1 advisory finding(s) below merit a look before merge.
Not checked: tests were not run; no formal proof of the changed code.
Graphify review — findings
Adds a compile job to the PR and test workflows that checks out the engine at the SHA in ci/engine-pin with its corpus, then runs the compile sweep in four shards plus four slices of the remaining suite. The job is wired into the test-check and gate aggregates, so a missing toolchain or failed compile blocks the PR (PINEFORGE_REQUIRE_COMPILE=1), and it uploads per-part compile reports; it uses the default token with no extra credential, so the engine and corpus checkout depends on that token's access. Adds a nightly engine-drift workflow that runs the same compile tests against engine main and reports whether its SHA differs from the pin, plus a compile-matrix generator and contract tests that fix seed and ordering, refuse sensitive paths before file access, and treat missing or conflicting negative evidence as incomplete.
Worth a look
- Compile gate cannot check out the paired engine —
.github/workflows/gke-pr.yml:187· Escalate · high- unverified hypothesis — survived the adversarial refute pass; needs human review
Review partial — this diff was larger than one review pass covers, so later files were not reviewed; some findings may be missing.
Analysis details — impact, health, verification
Impact & health
Graphify review
Impact — 2099 functions depend on the 562 functions this change touches.
Health — this change adds coupling hotspots:
- worse:
run_emitted_tu()— 263 callers, 4 callees - worse:
check_workflows()— 13 callers, 12 callees - new:
tiny_inputs()— 19 callers, 4 callees - worse:
read_sources()— 19 callers, 3 callees - new:
_assert_compile_contract()— 6 callers, 5 callees - new:
_run_pairing_control()— 10 callers, 3 callees - new:
independent_groups()— 3 callers, 8 callees - new:
classify_candidate()— 6 callers, 4 callees - …and 15 more — each is listed as a finding
Verification — 2099 functions in the blast radius were not formally verified this run (proofs are advisory here).
Gate & verification
graphify gate
PASS — objectively clean (no health regressions, tests not run — proofs not run this pass (advisory)). Grounded, not self-assessed.
Advisory (not blocking):
- verification_scope: 2000 function(s) in the blast radius were not formally verified this run
Cross-repo impact
Cross-repo impact
This change impacts 2 symbol(s) across 1 peer repo(s) — blast radius over derived cross-repo edges:
- pineforge-4pass/pineforge-hpo —
python/pineforge_hpo/transpile.py(via import_moniker, heuristic),tests/python/test_transpile.py(via import_moniker, heuristic)
1 peer repo(s) in this group are not yet indexed — cross-repo impact may be incomplete.
Cross-repo linkage is derived (SCIP-moniker matches are sound; name/contract matches are heuristic) and ADVISORY — it never affects this check's conclusion.
Test selection
Test selection
521 of 521 test file(s) selected (100%) via static blast radius.
Escalated to a full run for safety (
noncode-change,uncovered-code) — the selection is not trustworthy on its own (see below). CI should run the whole suite.
tests/test_action_pins.py— full-run-safetytests/test_allow_entry_in_qualifier.py— impact, full-run-safetytests/test_allow_entry_in_request_const.py— full-run-safetytests/test_analyzer.py— full-run-safetytests/test_analyzer_matrix_inference.py— full-run-safetytests/test_analyzer_ta_return_types.py— full-run-safetytests/test_anchor_tf_change.py— full-run-safetytests/test_anchor_time.py— full-run-safetytests/test_anchor_vwap.py— full-run-safetytests/test_array_bounds_insert_fill_slice.py— impact, full-run-safetytests/test_array_checked_access.py— impact, full-run-safetytests/test_array_empty_aggregates.py— full-run-safetytests/test_array_history.py— impact, full-run-safetytests/test_array_missing_integer_index.py— impact, full-run-safetytests/test_array_new_color_fill_and_na_size.py— full-run-safetytests/test_array_new_defaults_and_order.py— full-run-safetytests/test_array_reference_semantics.py— impact, full-run-safetytests/test_array_retained_alias.py— impact, full-run-safetytests/test_array_slice_view.py— full-run-safetytests/test_array_terminal_returns.py— impact, full-run-safetytests/test_arrseg_coded_run_stops.py— impact, full-run-safetytests/test_arrseg_review_fixes.py— impact, full-run-safetytests/test_binop_operand_order.py— impact, full-run-safetytests/test_block_shadow_primitive_types.py— full-run-safetytests/test_block_var_plain_siblings.py— impact, full-run-safetytests/test_bool_na_refusal.py— impact, full-run-safetytests/test_bool_na_refusals_2.py— impact, full-run-safetytests/test_bool_na_values.py— impact, full-run-safetytests/test_bool_string_inference.py— impact, full-run-safetytests/test_builtin_name_shadow.py— full-run-safetytests/test_builtin_named_locals_compile.py— impact, full-run-safetytests/test_builtin_named_locals_price_refusal.py— full-run-safetytests/test_builtin_named_locals_receipt.py— full-run-safetytests/test_builtin_named_locals_scope.py— full-run-safetytests/test_builtin_named_parameters.py— impact, full-run-safetytests/test_builtin_named_parameters_reference.py— full-run-safetytests/test_calc_on_order_fills_codegen.py— full-run-safetytests/test_calendar_lambda_locals.py— impact, full-run-safetytests/test_call_argument_order.py— impact, full-run-safetytests/test_callable_local_histories.py— full-run-safetytests/test_callable_series_param_types.py— impact, full-run-safetytests/test_callable_string_series_type.py— full-run-safetytests/test_callable_ta_forwarded_length.py— impact, full-run-safetytests/test_callable_var_first_reach.py— impact, full-run-safetytests/test_checked_settings.py— impact, full-run-safetytests/test_ci_compile_contract.py— impact, changed-test, full-run-safetytests/test_ci_engine_main_touched.py— full-run-safetytests/test_closed_trade_fold.py— full-run-safetytests/test_closed_trade_fold_emission.py— full-run-safetytests/test_closed_trade_text_equals.py— impact, full-run-safety- … and 471 more
non-code file(s) changed (
.github/workflows/engine-drift.yml,.github/workflows/gke-pr.yml,.github/workflows/test.yml,ci/engine-pin,docs/ci-compile.md…) → running the full suite for safety (a code graph can't see config/fixture/data deps)
changed code file(s) with no mapped test (
.github/workflows/engine-drift.yml,.github/workflows/gke-pr.yml,.github/workflows/test.yml,docs/ci-compile.md,docs/ci-engine-drift.md…) — a coverage gap or a missing link — running the full suite rather than only the selected tests
Selection is safe under the controlled-regression assumption; always-run tests + a periodic full run are the backstops. Advisory — it never changes the check verdict.
Risky patterns (advisory)
- medium
no-stderr-to-stdoutin.github/workflows/gke-pr.yml:210: stderr redirected to stdout: if ! command -v g++ >/dev/null 2>&1; then
Docs that may be stale (advisory)
AGENTS.md§ Build and environment (lines 40-64): references changed symbolsjsonAGENTS.md§ Layout (lines 65-80): references changed symbols_compileAGENTS.md§ Testing (lines 81-84): references changed symbols_compileAGENTS.md§ Architectural invariants — do not break (lines 141-184): references changed symbols_compileAGENTS.md§ Parity campaign gate (applies on EVERY harness) (lines 256-277): references changed symbolsjsonCHANGELOG.md§ Unreleased (next release) (lines 23-296): references changed symbolsreadCHANGELOG.md§ Changes since 1.7.0 (lines 411-532): references changed symbolsorderCHANGELOG.md§ Compatibility and migration (lines 626-644): references changed symbolsorderCHANGELOG.md§ Compatibility and migration (lines 802-864): references changed symbolsjsonCHANGELOG.md§ Collection lowering and refusals (lines 1035-1046): references changed symbolsorder
…and 10 more.
· 14 grounded finding(s) anchored inline below; 9 more finding(s) on lines outside this diff (see the check run).
| ) is None, message | ||
|
|
||
|
|
||
| def _assert_compile_contract(workflow: str, *, pr: bool = False) -> None: |
There was a problem hiding this comment.
_assert_compile_contract()
6 callers depend on it (afferent coupling).
Grounded coupling-delta finding (deterministic), not an LLM guess.
| return "case-" + digest(independent_json({"renderFamily": "ordinary", "axes": row})) | ||
|
|
||
|
|
||
| def independent_groups(axes, rules, core_axes, seed): |
There was a problem hiding this comment.
independent_groups()
fans out to 8 callees (efferent coupling).
Grounded coupling-delta finding (deterministic), not an LLM guess.
| assert search.stats["candidateCount"] == 1 | ||
|
|
||
|
|
||
| def tiny_inputs(scratch): |
There was a problem hiding this comment.
tiny_inputs()
19 callers depend on it (afferent coupling).
Grounded coupling-delta finding (deterministic), not an LLM guess.
| ]) | ||
|
|
||
|
|
||
| def test_manifest_and_sources_recompute_from_independent_data(scratch): |
There was a problem hiding this comment.
test_manifest_and_sources_recompute_from_independent_data()
fans out to 9 callees (efferent coupling).
Grounded coupling-delta finding (deterministic), not an LLM guess.
| ) | ||
|
|
||
|
|
||
| def test_changed_control_source_is_consumed_without_a_measured_refusal(scratch): |
There was a problem hiding this comment.
test_changed_control_source_is_consumed_without_a_measured_refusal()
fans out to 6 callees (efferent coupling).
Grounded coupling-delta finding (deterministic), not an LLM guess.
| assert all(path in paths for path in ISSUE_281) | ||
|
|
||
|
|
||
| def test_fixture_translates_implies_compiles(sweep_results): |
There was a problem hiding this comment.
test_fixture_translates_implies_compiles()
fans out to 7 callees (efferent coupling).
Grounded coupling-delta finding (deterministic), not an LLM guess.
| ) | ||
|
|
||
|
|
||
| def test_paired_engine_corpus_translates_implies_compiles(sweep_results): |
There was a problem hiding this comment.
test_paired_engine_corpus_translates_implies_compiles()
fans out to 10 callees (efferent coupling).
Grounded coupling-delta finding (deterministic), not an LLM guess.
| ) | ||
|
|
||
|
|
||
| def test_front_end_ratchet_rejects_a_stale_entry(tmp_path, monkeypatch): |
There was a problem hiding this comment.
test_front_end_ratchet_rejects_a_stale_entry()
fans out to 6 callees (efferent coupling).
Grounded coupling-delta finding (deterministic), not an LLM guess.
| return _checked_path(path) | ||
|
|
||
|
|
||
| def check_matrix_manifest(manifest, output_dir) -> list[str]: |
There was a problem hiding this comment.
check_matrix_manifest()
high coupling complexity (Ca·Ce = 15).
Grounded coupling-delta finding (deterministic), not an LLM guess.
|
|
||
|
|
||
| @pytest.mark.parametrize("family", ["ordinary", "community_seed"]) | ||
| def test_generated_matrix_positive_translates_and_compiles( |
There was a problem hiding this comment.
test_generated_matrix_positive_translates_and_compiles()
fans out to 6 callees (efferent coupling).
Grounded coupling-delta finding (deterministic), not an LLM guess.
CI rule: a script that translates only counts as passing if its generated C++ also compiles.
Refs #281.
What changes
PINEFORGE_REQUIRE_COMPILE=1:tests/_compile.pythen fails, instead of skipping, when the compiler, the engine headers or Eigen are missing.PINEFORGE_REQUIRE_NATIVE=1, the flag main added, keeps failing for the native inputs, the built runtime archive included; one helper serves both flags.compilejob runs in the pull request workflow (gke-pr.yml, after admission) and for pushes to main (test.yml). Both jobs run on GitHub-hostedubuntu-24.04, installg++andlibeigen3-dev, check out the engine at the commit pinned inci/engine-pintogether with its corpus, and run the sweep and the rest of the suite in four parts each.na()of a string array #281 (tests/fixtures/community_repros/issue_281_*.pine).tests/front_end_rejection_baseline.txtlists the scripts the front end may reject in the sweep: the 46 measured when the rule was written plus 85 that main's front end rejects now (diagnostics added on main since). A rejection that is not listed fails the sweep; a listed script that no longer rejects fails too. The header of the file says, for each group of the 85, which test owns it and what the repository shows about TradingView (a refusal code with the line that records it, or not established), and gives the first diagnostic and the status with its evidence for each of the 26 TradingView-fixture entries. The 85 are main's rejections recorded as they are; no claim about TradingView is made for a group marked not established.docs/ci-compile.mdanddocs/ci.mddescribe the rule, the baseline and where the jobs run.This update brings the branch up to date with main (two merges: v1.11.0, then the pull request that followed it) and makes it consistent with main's hosted-runner rule (
tests/test_release_workflows.pyforbids everyself-hosted,pf-ci,gke-andgkp-runner label). The three test modules that conflicted keep both sides' behaviour:tests/_compile.py(both flags),tests/test_gke_pr_admission.pyandtests/test_pr_workflows.py(main's hosted jobs and its native-engine route, and this branch's compile job). The leg of the admission test that runs the pinned base policy now runs it on the job inventory without the compile job, which is what that policy can admit; the candidate policy is still checked with the compile job in both inventories.ci/engine-pinmoves from the commit of the engine release v1.9.1 to the commit of the engine release v1.11.0, the release that the translator on main is paired with; the workflows, the documents and the tests only require one lowercase 40-hex line and are unchanged.Evidence
tests/test_translate_implies_compile.py, the engine corpus sweep) does not skip there.mainin the same setup: 25 failed, 28,184 passed, 304 skipped. The 25 failures are rows that compare against an older reference commit that is not an ancestor of the tested head, which that checkout cannot provide; the same 25 fail onmain, and the lists of failing test ids and their first assertion messages are identical.Notes
apt-getat run time on the hosted runner, like the compile job that runs for pushes.pull_request_target, so GitHub runs the one on the base branch. The compile job oftest.ymlruns for pushes to main and, on a branch, byworkflow_dispatch; the first hosted run of the job, and the job time it adds, are measured there.🤖 Generated with Claude Code