Skip to content

story-046: The test location comes from configuration - #44

Merged
jerodw merged 1 commit into
mainfrom
story/story-046
Aug 16, 2026
Merged

story-046: The test location comes from configuration#44
jerodw merged 1 commit into
mainfrom
story/story-046

Conversation

@jerodw

@jerodw jerodw commented Aug 16, 2026

Copy link
Copy Markdown
Owner

workflows/story-workflow.json declared "may_not_create": ["tests/"], and prompts/tester.md told the tester that new tests belong in tests/ and to use the shared resolution in tests/conftest.py. Those are a target repository's layout and a target repository's test framework, written into the harness. A JavaScript project puts tests in __tests__/ or spec/; a Go project has none at all — _test.go files sit beside their sources.

What changed

A tests_dir key, and the workflow references it:

"may_not_create": ["{{tests_dir}}"],

The placeholder is resolved when the workflow loads, so stage_restrictions and its six readers — the ownership check, the revert check's governed edits, the stage-baseline capture, stage_exception_problems and both of plan_validation's checks — are untouched. harness_config.load_workflow returns may_not_create: ['tests/'] for this repository exactly as before.

tests_dir is declared in schemas/harness-config.schema.json, so story-039's set-equality coverage holds and story-043's undeclared-key refusal accepts it. The tester prompt takes the location by injection rather than restating it.

This closes the portability audit

TEMPORARY_TIES: frozenset[tuple[str, str]] = frozenset()

Story-040 split the scan's allowlist into a temporary half that should burn down and a permanent half that should not, and said the temporary half reaching empty was the completion signal. It is empty.

The scan still reports eight findings, and every one is a PERMANENT_MENTION: five shebangs declaring the harness's own entry points as Python programs, and two docstrings describing the harness's own implementation. Not one is a tie to a target's stack.

Five ties were found by the audit on 2026-08-15. the-interpreter-is-not-assumed-to-be-python removed two, an-undeclared-config-key-is-refused removed the literal that survived them, and this removes the last three.

The retry is worth reading

Verification failed once and routed to validation. The finding is one the request predicted and the tester still walked into: three assertions read TEMPORARY_TIES to decide something, and with the list emptied to frozenset() none of them could fail. An assertion written against "the burn-down still has entries" fails on success.

Resolved by reading the scan rather than the list, and by keeping one removed tie verbatim as a control:

#: One of the ties the-interpreter-is-not-assumed-to-be-python removed from
#: the coordinator, kept verbatim so the absence below can be shown to fail.
HISTORICAL_COORDINATOR_TIE = "    version = platform.python_version()"

so "the coordinator carries no temporary tie" is demonstrable rather than vacuous.

Verification

  • 2408 passed, 4 written; verification passed on the second iteration; one retry, routed to validation; clean-clone green with the story committed
  • First run under story-045's ordering: implementer → tester → documenter → verifier, with the documenter running once per attempt — the retry cost that story recorded, observed rather than predicted

🤖 Generated with Claude Code

Implemented by the l5 harness story workflow.
@jerodw
jerodw merged commit 4dae569 into main Aug 16, 2026
3 checks passed
@jerodw
jerodw deleted the story/story-046 branch August 16, 2026 15:50
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