Repository navigation
refactor(conformance): the Python runner is codeupipe pipelines - #16
Merged
Merged
Conversation
The runner was 15 plain functions in runner.py. It is now two pipelines in conformance/runners/python/case_runner: one plays a case on a target and one times a scenario. They share the steps that read the target, write the Predicates, build the pipeline and compile it. Each step is a primitive in its own file with tests of its own. runner.py is the command line. The new runner was run beside the old one on each Python target, with all 30 cases and 7 more that were made to fail. The reports are the same byte for byte. In the timing mode the outputs and the refusals are the same, and the times are the same within the noise of a run. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The differential test tool used two functions of the old runner file. It now uses the same steps that the runner uses. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
JoshuaWink
added a commit
that referenced
this pull request
Oct 13, 2026
* refactor(conformance): the judge is a codeupipe pipeline The judge was eight plain functions in run.py. It is now a pipeline in conformance/judging: read the cases, choose the targets, run each target, compare, count, format, and write the results. Each step is a primitive in its own file and has tests that start no process. run.py keeps its command line and the function names that the tests and bench.py use. Each one calls a step of the pipeline, so there is one judge. The new judge was run beside the old one. Their reports are the same byte for byte on all 7 targets, and they gave the same verdict for each of 6550 results, 2700 of them wrong on purpose. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * refactor(conformance): the Python runner is codeupipe pipelines (#16) * refactor(conformance): the Python runner is codeupipe pipelines The runner was 15 plain functions in runner.py. It is now two pipelines in conformance/runners/python/case_runner: one plays a case on a target and one times a scenario. They share the steps that read the target, write the Predicates, build the pipeline and compile it. Each step is a primitive in its own file with tests of its own. runner.py is the command line. The new runner was run beside the old one on each Python target, with all 30 cases and 7 more that were made to fail. The reports are the same byte for byte. In the timing mode the outputs and the refusals are the same, and the times are the same within the noise of a run. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(scorecard): use the steps of the new runner The differential test tool used two functions of the old runner file. It now uses the same steps that the runner uses. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
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.
What
The Python conformance runner is now two codeupipe pipelines. It was 15 plain functions in
runner.py.This PR is on top of #15, which is on top of #14. Merge them in that order.
The pipelines (
conformance/runners/python/case_runner/)RunCasePipelineplays one case on one target:ParseTargetFilterWritePredicatesFilterBuildPipelineFilterAttachRecordHookFilterExportFilterRunDynamicFilterrunorrun_asyncRunCompiledFilterNameStepsFilterFinishResultFilterBenchScenarioPipelinetimes one scenario. It uses the first three steps andExportFilteragain, thenMakeRunFunctionFilterandMeasureFilter.RunEachCaseFilterandBenchEachScenarioFiltergo through the cases. A case that the target cannot express is reported, and the next case still runs.runner.pyis the command line: 12 lines.How it was checked against the old runner
The old runner is not in this PR. It was used for this comparison only.
Two things that the linter found in the new code
Writing the runner as primitives put it under the rules for primitives, and two of them fired on my first version:
resultdict that they got from the Payload, in place. They now make a new dict.RunDynamicFilterreadspipeline.state. Here that is correct: it is the State of the pipeline of the case, which the step ran, and that State is what the step reports. It has oneallow-state-readcomment that says so.What it gains
allow-plaincomments are gone. The pinned number in the repository self-check goes from 75 to 60.tests/conformance/test_case_runner.py, 19 tests).scorecard/used two functions of the old runner file. It now uses the same steps as the runner.Checks
Not in this change
scorecard/(29 comments) andconformance/bench.py(5 comments) are still plain code.🤖 Generated with Claude Code