Skip to content

ci: a translate counts only if the generated C++ compiles - #282

Open
luisleo526 wants to merge 26 commits into
mainfrom
ci/translate-implies-compile-r2
Open

luisleo526 wants to merge 26 commits into
mainfrom
ci/translate-implies-compile-r2

Conversation

@luisleo526

@luisleo526 luisleo526 commented Oct 30, 2026 •

Copy link
Copy Markdown
Contributor

CI rule: a script that translates only counts as passing if its generated C++ also compiles.

Refs #281.

What changes

  • Every corpus script, every test fixture that emits C++, and every community repro goes through translate + compile against the paired engine headers. A translate-only pass fails CI. The rule is on when PINEFORGE_REQUIRE_COMPILE=1: tests/_compile.py then 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.
  • A required compile job runs in the pull request workflow (gke-pr.yml, after admission) and for pushes to main (test.yml). Both jobs run on GitHub-hosted ubuntu-24.04, install g++ and libeigen3-dev, check out the engine at the commit pinned in ci/engine-pin together with its corpus, and run the sweep and the rest of the suite in four parts each.
  • New community-repro fixtures for the three scripts in Three valid scripts that translate but do not build: single-line bodies and na() of a string array #281 (tests/fixtures/community_repros/issue_281_*.pine).
  • tests/front_end_rejection_baseline.txt lists 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.md and docs/ci.md describe 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.py forbids every self-hosted, pf-ci, gke- and gkp- runner label). The three test modules that conflicted keep both sides' behaviour: tests/_compile.py (both flags), tests/test_gke_pr_admission.py and tests/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-pin moves 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

  • Full suite in the lab setup (headers and library of the engine commit a3964ad2, whose include and source trees are identical to those of the engine release v1.11.0, the 312-strategy corpus, the pinned 1m feed, the compiler and Eigen), on the commit before the pin change (the suite does not read the pin): 28,666 rows, 25 failed, 28,336 passed, 304 skipped, 1 xfailed. The corpus compile test passes (312 of 312) and the Pyodide gate passes (268 fixtures, parity OK). The row that skips on a host without the paired corpus (tests/test_translate_implies_compile.py, the engine corpus sweep) does not skip there.
  • The control on unchanged main in 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 on main, and the lists of failing test ids and their first assertion messages are identical.
  • The eight test modules this branch adds or changes and three older workflow modules, on the head of this pull request, on a Linux arm64 host with Python 3.12, g++, Eigen and the headers of an engine checkout (the release v1.10.0 plus 13 commits), without the built library and without the paired corpus: 606 rows pass and none fails or errors, one row skips (the engine corpus sweep) and one is the marked known compile failure; the 171 rows of the three older modules pass. The fixture sweep compiled on that host.
  • The engine pin: the include and source trees at the pinned v1.11.0 release commit are identical to those of the engine used in the lab run, and the corpus commit is the same at the old and the new pin.

Notes

  • The compile job installs its toolchain with apt-get at run time on the hosted runner, like the compile job that runs for pushes.
  • The compile job of the pull request workflow cannot run on this pull request: that workflow is triggered by pull_request_target, so GitHub runs the one on the base branch. The compile job of test.yml runs for pushes to main and, on a branch, by workflow_dispatch; the first hosted run of the job, and the job time it adds, are measured there.
  • Hosted CI and Python 3.11 to 3.14 have not been run on this head; the runs above used Python 3.12.

🤖 Generated with Claude Code

luisleo526 and others added 13 commits October 30, 2026 23:32
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>
luisleo526 and others added 13 commits November 10, 2026 07:17
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>
@luisleo526
luisleo526 marked this pull request as ready for review November 11, 2026 03:39

@graphify-labs graphify-labs Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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-safety
  • tests/test_allow_entry_in_qualifier.py — impact, full-run-safety
  • tests/test_allow_entry_in_request_const.py — full-run-safety
  • tests/test_analyzer.py — full-run-safety
  • tests/test_analyzer_matrix_inference.py — full-run-safety
  • tests/test_analyzer_ta_return_types.py — full-run-safety
  • tests/test_anchor_tf_change.py — full-run-safety
  • tests/test_anchor_time.py — full-run-safety
  • tests/test_anchor_vwap.py — full-run-safety
  • tests/test_array_bounds_insert_fill_slice.py — impact, full-run-safety
  • tests/test_array_checked_access.py — impact, full-run-safety
  • tests/test_array_empty_aggregates.py — full-run-safety
  • tests/test_array_history.py — impact, full-run-safety
  • tests/test_array_missing_integer_index.py — impact, full-run-safety
  • tests/test_array_new_color_fill_and_na_size.py — full-run-safety
  • tests/test_array_new_defaults_and_order.py — full-run-safety
  • tests/test_array_reference_semantics.py — impact, full-run-safety
  • tests/test_array_retained_alias.py — impact, full-run-safety
  • tests/test_array_slice_view.py — full-run-safety
  • tests/test_array_terminal_returns.py — impact, full-run-safety
  • tests/test_arrseg_coded_run_stops.py — impact, full-run-safety
  • tests/test_arrseg_review_fixes.py — impact, full-run-safety
  • tests/test_binop_operand_order.py — impact, full-run-safety
  • tests/test_block_shadow_primitive_types.py — full-run-safety
  • tests/test_block_var_plain_siblings.py — impact, full-run-safety
  • tests/test_bool_na_refusal.py — impact, full-run-safety
  • tests/test_bool_na_refusals_2.py — impact, full-run-safety
  • tests/test_bool_na_values.py — impact, full-run-safety
  • tests/test_bool_string_inference.py — impact, full-run-safety
  • tests/test_builtin_name_shadow.py — full-run-safety
  • tests/test_builtin_named_locals_compile.py — impact, full-run-safety
  • tests/test_builtin_named_locals_price_refusal.py — full-run-safety
  • tests/test_builtin_named_locals_receipt.py — full-run-safety
  • tests/test_builtin_named_locals_scope.py — full-run-safety
  • tests/test_builtin_named_parameters.py — impact, full-run-safety
  • tests/test_builtin_named_parameters_reference.py — full-run-safety
  • tests/test_calc_on_order_fills_codegen.py — full-run-safety
  • tests/test_calendar_lambda_locals.py — impact, full-run-safety
  • tests/test_call_argument_order.py — impact, full-run-safety
  • tests/test_callable_local_histories.py — full-run-safety
  • tests/test_callable_series_param_types.py — impact, full-run-safety
  • tests/test_callable_string_series_type.py — full-run-safety
  • tests/test_callable_ta_forwarded_length.py — impact, full-run-safety
  • tests/test_callable_var_first_reach.py — impact, full-run-safety
  • tests/test_checked_settings.py — impact, full-run-safety
  • tests/test_ci_compile_contract.py — impact, changed-test, full-run-safety
  • tests/test_ci_engine_main_touched.py — full-run-safety
  • tests/test_closed_trade_fold.py — full-run-safety
  • tests/test_closed_trade_fold_emission.py — full-run-safety
  • tests/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-stdout in .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)

…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:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Health regression — _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):

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Health regression — 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):

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Health regression — 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):

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Health regression — 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):

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Health regression — 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):

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Health regression — 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):

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Health regression — 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):

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Health regression — 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]:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Health regression — 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(

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Health regression — test_generated_matrix_positive_translates_and_compiles()

fans out to 6 callees (efferent coupling).

Grounded coupling-delta finding (deterministic), not an LLM guess.

This branch has not been deployed

No deployments
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