Repository navigation
Description
Goal: the two guards #665 tightens hold what their comments promise for the forms they still cannot see: a host-dialect quoter reached any way but a direct call, a function with one call switched to POSIX and one not, and a tool that starts a Python child through another spelling of subprocess.
Filed by lane openRepoShape-5, from the checklist candidates in #665's PR (#724, head 151a0861). Tests only. Each line is read from source; the second also has a measured count (below).
Lands after: lane 5's #665 (PR #724, fix/665-four-guards). The inventory (host_calls, host_quoting, NAMED) and LAUNCHERS' scripts/family.py row are in that PR; main has the older shape of both. Line numbers below are at 151a0861 for the inventory and at main 66b230ed for LAUNCHERS.
Lines
- A quoter handed on as a value is not a call, and the inventory does not see it (
tests/test_readme_windows_quoting_sentence.py:141-163,host_calls; its docstring says so: "A quoter handed on as a value (map(shell_quoted, words)) is not a call and is not seen").functools.partial(shell_line)is the same. Read from source: nothing in the shipped tools does it today (grepof the repository formap(shell_quoted,map(shell_word,map(quote_arg,partial(shell_,partial(quote_argoutsidetests/finds none), so no host-dialect line escapes the sentence now. Direction: treat aNameorAttributethat is a host quoter and is an argument of any call, or the value of an assignment the alias walk (quoter_names,:118) already follows, as a use of it, and name its function inhost_quoting. Test it with the two forms above, astest_a_quoter_imported_under_another_name_is_a_host_call(:247) does for aliases. - The function pin counts functions, not calls.
test_the_functions_that_quote_for_the_host_are_the_ones_the_sentence_names(:234-246) comparesset(host_quoting(tool_sources()).get(tool, {}))withNAMED[tool], a set of function names. A function with two host-dialect calls where only one is switched to'posix'still has a call that follows the host, so it still passes: the test cannot tell. Measured on main66b230edwith render-cli-reference.py and tests/: the CLI reference's children write no bytecode under templates/, the launcher guard reads family.py's siblings child, the quoting-sentence inventory follows an aliased quoter, a suffixless tool and each tool's calling functions, and an S5778 pytest.raises builds its argument first (#665) #724'shost_callsoverscripts/family.pyandsetup-project.py:_switch_command1,_print_next1,_checked_mount_path1,_add_command3,_print_next_steps2, andfamily_next_command2. Only the first three are single-call functions, which is why render-cli-reference.py and tests/: the CLI reference's children write no bytecode under templates/, the launcher guard reads family.py's siblings child, the quoting-sentence inventory follows an aliased quoter, a suffixless tool and each tool's calling functions, and an S5778 pytest.raises builds its argument first (#665) #724's body says "Today the one-call functions are_switch_command,_print_next,_checked_mount_path": for the other three, one call switched to POSIX leaves the function in the set, so it is seen only if every call of it is switched. Direction: makeNAMEDmap each function to its number of host-dialect calls and compare the counts, so one call switched in_add_command(3 to 2) fails until the sentence and the table change together. -
LAUNCHERShas no row forsrc/openreposhape/cli.pyorsetup-project.py(tests/test_validator_child_encoding.py:610-613, two rows;interpreter_runsat:616-631finds onlysubprocess.run([sys.executable, ...])byast.unparse(argv.elts[0]) == "sys.executable").src/openreposhape/cli.pystarts its Python children withrun_child([sys.executable, str(script), ...], standard.child_environment())at:436,:462,:474and:564, which is neithersubprocess.runnor the matched spelling;setup-project.pystarts its with its ownrun([PYTHON, ...])(:696,:2129,:2260,:2326,:2501;PYTHON = sys.executableat:116), whosesubprocess.runat:288takes noenv=. Read from source, not measured: whethersetup-project.py's children needinherited_child_environment()is the guard's own question ("a baresubprocess.run([sys.executable, ...])takes whatever the operator's shell holds, which is the defect",:636-639), and nothing here has asked it of these two. Direction: teachinterpreter_runsthe two spellings (a call torun_childor to a name bound tosys.executableas the first element), add one row each, and see which fails: a failingsetup-project.pyrow is a finding for itsrun, and a passing one pins what is true.
Verify: tests/test_readme_windows_quoting_sentence.py and tests/test_validator_child_encoding.py pass on Linux. Mutants, each killed by a new case: map(shell_quoted, ...) added to update-shape.py; one of _add_command's three calls switched to 'posix'; env= dropped from one run_child call in cli.py.
Overlaps. fix/665-four-guards (#724) edits both test files, so this lands after it. #711 (the Git Bash dialect, v1.1.1) will move NAMED when it changes the host question; whichever lands second re-gates against the other. scripts/family.py is edited by seven open branches (#646, #684, #686, #688, #689, #692, #693) but this issue edits no tool. No pinned file changes.
Parent: #461.
Milestone: v1.1.1. Tests only, and no shipped line is unguarded today.
🤖 Generated with Claude Code
Activity
brettheap commentedon Oct 17, 2026
CLAIMED — lane openRepoShape-5, session 50cede29-ab82-4ca3-9f67-d98e1a58c8d2@Eagle, 2026-10-17T10:25:33Z, for #759
Logged in
lanes/log/openRepoShape-5.mdatab41bb15ab5073e25828b4ebdc992d9251922378.The three reads (lane-collision-protocol Rule 1):
tests/: the `setup-project.py` row's strict xfail fires on a fix insi…
tests/test_readme_windows_quoting_sentence.py: the one-question guard…
setup-project.py and the assembly root's bootstrap.py: every Python c…