Skip to content

story-041: The verification runner is not assumed to be Python - #40

Merged
jerodw merged 1 commit into
mainfrom
story/story-041
Aug 15, 2026
Merged

story-041: The verification runner is not assumed to be Python#40
jerodw merged 1 commit into
mainfrom
story/story-041

Conversation

@jerodw

@jerodw jerodw commented Aug 15, 2026

Copy link
Copy Markdown
Owner

The coordinator executed Python source to record which interpreter ran the verification suite, and read a configuration key whose name was a language. A target repository whose suite is not Python got an empty record and was told nothing.

What changed

The version probe is gone. _VERSION_PROBE = "import platform; print(platform.python_version())", run as [interpreter, "-c", probe], was Python source and Python's flag for it. The recorded version field went with it: the interpreter path was already recorded and already answers "which one ran", so the field was not worth a new configuration key to keep.

clean_clone_python is now verification_runner — naming the role rather than the language. Nine coordinator sites, two artifact schemas, the config and the template.

A retired key is refused, not ignored. A config still carrying clean_clone_python would otherwise fall through to the replacement's default and quietly exercise something other than what it asked for. The refusal sits above every other pre-flight, because it is decidable the moment the config loads: no run directory, no state.json, no log, no branch, no agent invoked.

The burn-down

story-040 split the scan's allowlist into a temporary half that should empty and a permanent half that should not. This story is the first payment:

TEMPORARY_TIES   9 entries  ->  3

What remains is exactly the other story's subject — two lines of prose in prompts/tester.md and may_not_create: ["tests/"] in the workflow. the-test-location-comes-from-configuration removes those three, and the list emptying is story-040's completion signal for the whole audit.

Three judgements worth a reviewer's eye

One literal survives, deliberately. orchestration/harness_config.py names clean_clone_python in order to refuse it, which is nominally against this story's own constraint that no language name enters orchestration/. Task 6 required the refusal and a retired key cannot be refused without being named, so it is on PERMANENT_MENTIONS with that reason recorded. Filed as an-undeclared-config-key-is-refused — refusing any undeclared key removes the literal and catches mistyped keys, which nothing catches today.

One acceptance criterion was over-stated. AC10 expected the scan to report nothing in the touched files; one line remains — a self_route_problems docstring saying "True is not a budget however much Python is willing to treat it as one". That is a statement about this harness's own implementation, so it moved to PERMANENT_MENTIONS rather than being edited away.

One edit outside scope.modify, and it was forced. tests/test_stage_baseline.py compared story-037's pre-story bound against the working tree, so renaming a local in run_clean_clone made it red for a change story-037 has nothing to say about. Repointed, not weakened.

Verification

  • 2288 passed, 21 written; verification passed on the first iteration, no retries; clean-clone green with the story committed
  • Six implementer edits under tests/ were permitted by the revert check — the suite fails with them reverted

🤖 Generated with Claude Code

Implemented by the l5 harness story workflow.
@jerodw
jerodw merged commit 2683ac4 into main Aug 15, 2026
3 checks passed
@jerodw
jerodw deleted the story/story-041 branch August 15, 2026 22:34
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