Skip to content

tests/conftest.py and tests/test_adopt_plan_paths_spelled.py: under a one-byte locale such as Latin-1 the 0xff --work-dir row skips and the two U+00E9 rows read the child's UTF-8, so none of the three fails on a tool that is right, and the bytes helper starts its child as run_script does (#1196) - #1209

Draft
brettheap wants to merge 1 commit into
fix/1167-plan-paths-spelled-rowsfrom
fix/1196-paths-spelled-locale-and-env

Conversation

@brettheap

@brettheap brettheap commented Oct 23, 2026 •

Copy link
Copy Markdown
Contributor

Closes #1196

This PR lands after #1185. It is stacked on #1185's branch (fix/1167-plan-paths-spelled-rows, head d193617c7), which is itself stacked on #1154's. It is retargeted to main once #1185 has landed, by the lane's stacked-PR procedure. Tests only: no change to adopt-project.py (sha256 efe97bf7...b3d2, #1154's, byte for byte), and the tool is right in every case below.

From RV1185's review of #1185 (#1185 issuecomment-6356497748): its N1 and N2.

N1: three rows failed under a one-byte locale

Latin-1 built with localedef -c, as #1153's test_adopt_one_byte_locale.py builds it (LOCPATH, LC_ALL=en_US.ISO-8859-1, PYTHONUTF8=0).

  • The 0xff --work-dir row. skip_where_a_name_cannot_be_not_utf_8 (tests/conftest.py) also skips, before the disk is touched, where os.fsdecode(b"\xff") is not U+DCFF. Latin-1 reads the byte as U+00FF, which is printable, so _shown rightly prints it as typed. The disk and os.fsencode take the byte in every locale, so only os.fsdecode can say.
  • The two U+00E9 rows. run_script takes encoding (None unless named, so no other caller changes), and the four run_script calls of the spelled file name "utf-8": every child there is told PYTHONIOENCODING=utf-8.
  • The helper's own tests. test_non_utf8_name_callers.py's fixture a_system_that_carries_the_byte (which test_non_utf8_git_failures.py and test_non_utf8_oserror_sites.py use) and three rows of test_non_utf8_name_helpers.py guard the rows that let the probe through to the disk. They skip where the helper skips on the new question, as they do for the first. Without it, 28 of them failed under Latin-1 where they passed.

N2: the bytes helper's environment

plan_of_a_repository_on_github_as_bytes builds its child's environment with blank_unnamed_pin_sources and the git identity defaults, as run_script and test_stdout_encoding.py's run_tool_bytes do. Read from the helper with a pin-source override and a lane set, and no identity, in this process: before, SHAPE_PIN_SOURCE_OPENXDOX was '/somewhere/else' and the four GIT_* names were absent; now it is '' and they are the suite's IDENTITY_NAME and IDENTITY_EMAIL. The run ends at the clone refusal, so nothing it says changes, and no row can see it.

Rows added

Five, and no other row changes: three in test_non_utf8_name_helpers.py (the new question asked of an emulated Latin-1 os.fsdecode, before the disk; UTF-8 and ASCII controls) and two in the new tests/test_run_script_encoding.py (stdout and stderr read in the encoding named).

Counts

Run Before (d193617c7) After
spelled file, UTF-8 (LC_ALL=C.UTF-8) 31 passed 31 passed
spelled file, ASCII (LC_ALL=C PYTHONUTF8=0 PYTHONCOERCECLOCALE=0) 16 passed, 15 skipped 16 passed, 15 skipped
spelled file, Latin-1 3 failed, 15 passed, 13 skipped 0 failed, 17 passed, 14 skipped
spelled file + the 2 non-UTF-8 --out rows of test_stdout_encoding.py, Latin-1 (RV1185's run) 5 failed, 15 passed, 13 skipped 0 failed, 17 passed, 16 skipped
the 22 test files that use the helper and test_repo_hygiene.py (23 files; 24 after, with the new one), UTF-8, on the head 1085 passed, 1 skipped 1090 passed, 1 skipped
the same 24 files on a scratch merge of origin/main 961640c68 and the head 1091 passed, 1 skipped

Under UTF-8 every one of the 1086 tests that ran before has the outcome it had (compared by test id from the junit files): no new skip. The one skip is the Windows default-stdout row. Under Latin-1, over the same files: 0 tests went from passed to failed, 25 from failed to passed or skipped, 80 from passed to skipped (they ask for a name that is not UTF-8, which Latin-1 has none of), and 50 fail there before and after (not these files' defect: a one-byte locale is not a configuration they run under).

Mutants

Each restored, sha256 checked. "UTF-8" and "Latin-1" name the locale the run was made in.

Mutant Killed by
locale skip removed UTF-8: the new ..._skips_before_the_disk row; Latin-1: it, the 0xff row and the 2 test_stdout_encoding.py rows
locale asked after the disk UTF-8: ..._skips_before_the_disk
comparison inverted UTF-8: 8 rows of test_non_utf8_name_helpers.py; Latin-1: 4
callers fixture without the locale half Latin-1: 23 rows
helpers guard without the locale half Latin-1: 5 rows
run_script drops encoding UTF-8: the latin-1 row of test_run_script_encoding.py; Latin-1: both its rows and both U+00E9 rows
plan_of_a_local_source / plan_of_a_repository_on_github drops encoding Latin-1: the --out / --work-dir U+00E9 row
RV1185's O1, O2, O3 on adopt-project.py UTF-8 and ASCII: the 0xff row, at its line assert
bytes helper without blank_unnamed_pin_sources, or without the identity defaults survive, as #1196 says no row can see them
the question asked as os.fsdecode(os.fsencode(probe)) equivalent: the same answer

Merge-trees

git merge-tree --write-tree of the head against origin/main, #1185's head, #1154's head and each of the 55 open PRs' heads: clean, except #1117 and #1201, which conflict at docs/handbook.html against origin/main itself, with or without this branch. No open PR but #1154 and #1185 touches any of the five files.

Left

Outside this issue: 50 tests of these 24 files fail under Latin-1 before and after, as do #1154's own test_stdout_encoding.py rows that name U+65E5 U+672C (now skipped by this change where they ask the helper).

🤖 Generated with Claude Code
Lane: openreposhape-4 (openRepoShape-4)

Summary by Sourcery

Make the test suite correctly account for locale-dependent filename decoding and subprocess output encoding.

Bug Fixes:

  • Prevent tests from failing under single-byte locales by skipping non-UTF-8 filename cases when the locale decodes the probe byte as a character.
  • Ensure test subprocess output is decoded using the encoding declared by the child process.

Enhancements:

  • Align byte-oriented test helpers with the standard child environment, including pin-source clearing and Git identity defaults.

Tests:

  • Add coverage for locale-sensitive filename skips and explicit subprocess output encodings.

… one-byte locale such as Latin-1 the 0xff `--work-dir` row skips and the two U+00E9 rows read the child's UTF-8, so none of the three fails on a tool that is right, and the bytes helper starts its child as `run_script` does (#1196)

Follows #1185 (for #1167), from RV1185's review of it (#1185
issuecomment-6356497748): its N1 and N2. No change to adopt-project.py,
and the tool is right in every case below. Under a Latin-1 locale built as
#1153's test_adopt_one_byte_locale.py builds one, the new file and the two
non-UTF-8 `--out` rows of test_stdout_encoding.py gave 5 failed, 15
passed, 13 skipped; they give 0 failed, 17 passed, 16 skipped now.

N1, the three rows that failed under a one-byte locale:

- `skip_where_a_name_cannot_be_not_utf_8` (tests/conftest.py) also skips
  where `os.fsdecode(b"\xff")` is not U+DCFF, before the disk is touched.
  Latin-1 reads the byte as U+00FF, a printable character, so `_shown`
  prints `wd<U+00FF>k` as typed, and the 0xff row's premise, that Python
  reads it in as U+DCFF, does not hold. The disk and `os.fsencode` take
  the byte in every locale, so neither could say. UTF-8 and ASCII give
  U+DCFF and skip no more than before: the 1086 tests of the 22 files
  that ask the helper, and of test_repo_hygiene.py, have under UTF-8 the
  outcome they had. The two non-UTF-8 `--out` rows of
  test_stdout_encoding.py ask it too, and skip under Latin-1 where they
  failed.
- `run_script` takes `encoding`, None unless named, and the four runs of
  tests/test_adopt_plan_paths_spelled.py name "utf-8": each child is told
  `PYTHONIOENCODING=utf-8`, and a parent in Latin-1 read the two bytes of
  U+00E9 as two characters (`..._non_ascii_out_path_...` and
  `..._non_ascii_work_dir_...`). Both rows pass there now.
- The rows of test_non_utf8_name_callers.py (its fixture, which
  test_non_utf8_git_failures.py and test_non_utf8_oserror_sites.py use)
  and test_non_utf8_name_helpers.py that let the probe through to the
  disk skip where the helper skips on the new question, as they skip
  where it skips on the first: 28 of them failed under Latin-1 without it.

N2: `plan_of_a_repository_on_github_as_bytes` builds its child's
environment with `blank_unnamed_pin_sources` and the git identity
defaults, as `run_script` and test_stdout_encoding.py's `run_tool_bytes`
do. It had neither; the run ends at the clone refusal, so nothing it says
changes, and no row sees it.

Five rows are added and no other row changes: three in
test_non_utf8_name_helpers.py (the new question asked of an emulated
Latin-1 `os.fsdecode`, before the disk, and the UTF-8 and ASCII controls)
and two in the new tests/test_run_script_encoding.py (the keyword reads
stdout and stderr in the encoding named). The 31 rows of the spelled file
are unchanged: 31 pass under UTF-8, and under ASCII 16 pass and 15 skip.

Lane: openreposhape-4 (openRepoShape-4)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@sourcery-ai

sourcery-ai Bot commented Oct 23, 2026

Copy link
Copy Markdown

Reviewer's Guide

Tests are corrected for one-byte locales and explicit child output encodings: invalid non-UTF-8 filename premises now skip before filesystem access, run_script decodes output according to the caller-specified encoding, and the raw-byte planning helper receives consistent isolated environment defaults.

File-Level Changes

Change Details Files
Make non-UTF-8 filename tests account for locales that decode 0xFF as a character rather than a surrogate, skipping invalid premises before filesystem access.
  • Add an os.fsdecode(b"\xff") locale check to the shared skip helper.
  • Align caller fixtures and emulated helper tests with the new locale prerequisite.
  • Add UTF-8/ASCII controls and a Latin-1 pre-disk skip regression test.
tests/conftest.py
tests/test_non_utf8_name_callers.py
tests/test_non_utf8_name_helpers.py
tests/test_adopt_plan_paths_spelled.py
Ensure subprocess output is decoded using the encoding expected by the child instead of the parent process locale.
  • Add an optional encoding parameter to run_script and pass it to subprocess.run.
  • Use UTF-8 decoding for tests whose children set PYTHONIOENCODING=utf-8.
  • Add coverage proving stdout and stderr honor explicit UTF-8 and Latin-1 decoding.
tests/conftest.py
tests/test_adopt_plan_paths_spelled.py
tests/test_run_script_encoding.py
Make the bytes-based GitHub planning helper construct the same isolated child environment as other test subprocess helpers.
  • Centralize blank pin-source, lane, Git identity, and surrogateescape environment setup.
  • Use the centralized environment when invoking the raw-byte subprocess helper.
tests/test_adopt_plan_paths_spelled.py

Possibly linked issues


Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

@sonarqubecloud

Copy link
Copy Markdown

@brettheap

Copy link
Copy Markdown
Contributor Author

RV1209: independent review of #1209 at 13a2c58c: READY

Independent adversarial review for lane 4. No MUST and no SHOULD; five NITs for follow-ups. The PR does what #1196 asks. Under UTF-8 no test of the 25 files that reach the changed helpers changes its outcome; only the five new rows are added. Under a real Latin-1 locale the three rows of the spelled file no longer fail. run_script's new keyword changes nothing for a caller that does not name it. The bytes helper's child now gets the pin-source blanking and the git identity. Every mutant of the new guard that is not equivalent fails a row on Linux, except one: a mutant that asks the locale before the system's question (N3).

What I measured against

1. UTF-8: nothing that ran before skips now

LC_ALL=C.UTF-8, the 25 files, d193617c7 against 13a2c58cb, by test id.

Before After
total 1112 passed, 1 skipped 1117 passed, 1 skipped
test_non_utf8_name_helpers.py 19 passed 22 passed
test_run_script_encoding.py (absent) 2 passed
each of the other 23 files same counts same counts
  • Transitions. The only ones are 5 from absent to passed: the three new helper rows and the two new run_script rows. No test changed outcome.
  • The one skip. It is test_stdout_encoding.py's Windows default-stdout row, on both heads.
  • ASCII. The spelled file under LC_ALL=C PYTHONUTF8=0 PYTHONCOERCECLOCALE=0 gives 16 passed and 15 skipped, before and after.

2. Latin-1

Latin-1, d193617c7 -> 13a2c58cb Before After
spelled file 3 failed, 15 passed, 13 skipped 0 failed, 17 passed, 14 skipped
test_non_utf8_name_helpers.py 19 passed 17 passed, 5 skipped
test_non_utf8_name_callers.py 36 passed 18 passed, 18 skipped
test_run_script_encoding.py (absent) 2 passed
all 25 files 988 passed, 87 failed, 38 skipped 915 passed, 52 failed, 151 skipped
  • The three rows. The two U+00E9 rows go from failed to passed. The 0xff row goes from failed to skipped, on the new reason: "this system's file name encoding (iso8859-1) reads the byte 0xFF as '\xff', not as '\udcff'".
  • All 25 files, by id. 0 rows went from passed to failed, 2 from failed to passed, 33 from failed to skipped and 80 from passed to skipped. These match the body's figures once test_local_remote_dir_urls.py's 10 failed-to-skipped rows are added.
  • The skip does not hide a wrong tool. I read the failure text of each of the 33 failed-to-skipped rows. Each fails on its own UTF-8 premise, not on a defect it was written to catch:
    • a name holding 0xE9 or 0xFF is Latin-1 text there, so the tool prints it (branch a<U+00FF>b created) or goes on with it;
    • a U+FFFD is escaped by a Latin-1 stdout;
    • or the test's own make_source_repo cannot spell U+65E5 U+672C (the two test_stdout_encoding.py rows).
  • But the skip also falls where the tool can be judged. See N1.

3. run_script(encoding=None)

  • Before, subprocess.run got text=True and no encoding or errors. After, it gets text=True, encoding=None, and still no errors. I read this from both heads with a probe that captures the keywords (two calls, one with input=). The only difference is the explicit encoding: None.
  • Why that is the same. inspect.signature(subprocess.Popen.__init__) gives encoding=None and errors=None as the defaults. On 3.12, Popen reads encoding is None the same way whether it was passed or not.
  • No caller could have passed it before. encoding comes after *args, so it is keyword-only, and no caller named it before (that would have been a TypeError). The two callers that spread keywords into run_script never name it: test_adopt_pins.py's check_plan and check_on_github (**named), and test_chain_pin_sources.py's functools.partial(run_script, env=env).
  • The 25-file comparison in section 1 shows no outcome change. The PR's CI tests job, the full suite, passed on the head.

4. N2: the bytes helper's child environment

A probe called plan_of_a_repository_on_github_as_bytes with subprocess.run captured. It ran with SHAPE_PIN_SOURCE_OPENXDOX=/somewhere/else, Shape_Pin_Source_Mixed=/x and LANES_LANE=openRepoShape-9 set, and no GIT_* identity. I compared what it got with test_stdout_encoding.child_environ(tmp, "utf-8:surrogateescape"), which is what run_tool_bytes uses.

Name d193617c7 13a2c58cb child_environ
SHAPE_PIN_SOURCE_OPENXDOX /somewhere/else '' ''
Shape_Pin_Source_Mixed /x '' ''
LANES_LANE '' '' ''
the four GIT_* identity names absent the suite's IDENTITY_NAME and IDENTITY_EMAIL the same
PYTHONIOENCODING utf-8:surrogateescape the same the same
AGENT_PROTOCOL_ROOT absent absent <tmp>/agent-protocol

At the head, apart from the stand-in gh (PATH, GH_STUB_LOG), the only key child_environ has and the helper lacks is AGENT_PROTOCOL_ROOT. See N5.

5. Mutants

I wrote these myself, and applied each in a separate worktree at the head. The UTF-8 and Latin-1 runs used the helpers file, test_run_script_encoding.py, the spelled file and test_stdout_encoding.py's two non-UTF-8 --out rows (57 tests), unless the table says otherwise.

Mutant UTF-8 Latin-1
none (control) 57 passed 54 passed, 39 skipped (with the callers file)
G1: locale question removed killed, 1: ..._skips_before_the_disk killed, 4: it, the 0xff row and both --out rows (callers file included)
G2: comparison inverted killed, 8 helper rows (not run)
G3: locale asked after the disk probe killed, 1: ..._skips_before_the_disk killed, 1: the same row
G4: locale asked BEFORE the system's os.fsencode question survives, 57 passed (not run). See N3
G5: narrower, skip only where sys.getfilesystemencoding() is Latin-1 killed, 1: ..._skips_before_the_disk killed, 2: both ..._is_not_skipped controls
G6: os.fsdecode(os.fsencode(NOT_UTF_8_PROBE)) survives survives. Equivalent, as the body says
F1: callers fixture without the locale half (not run) killed, 23 rows of the callers, oserror-sites and git-failures files
F2: helpers guard without the locale half (not run) killed, 5 helper rows
E1: run_script drops encoding killed, 1: the latin-1-reads-two row killed, 3: the utf-8 row and both U+00E9 rows
E3: plan_of_a_local_source drops encoding (not run) killed, 1: the --out U+00E9 row
E4: plan_of_a_repository_on_github drops encoding (not run) killed, 1: the --work-dir U+00E9 row

After each run I restored the tree with git checkout -- tests/ and checked the sha256 of the four files the mutants touch against the head's. All 18 restores matched, and the worktree is clean. The encoding="utf-8" added to test_each_of_the_two_paths_is_spelled_in_one_run and a_command_on_github is equivalent in every locale those rows run in: they type U+202E, which Latin-1 and ASCII skip. It is harmless consistency.

6. Gate

7. Merge-trees

Scope: the three files past the issue's text

Each change is needed once the shared helper asks the locale, and each is right:

  • The callers fixture. Without it, 23 rows fail under Latin-1 (F1).
  • The helpers guard. Without it, 5 rows fail (F2).
  • test_run_script_encoding.py. It is the only row that holds run_script's keyword under UTF-8, the locale CI runs (E1).

Whether the shared helper should ask the locale at all is N1.

Findings

  • N1 (NIT): under a one-byte locale the shared helper's new question also skips rows that can judge the tool.
    • What. 80 rows passed under Latin-1 before and skip there now:
      • 35 on the helper's own new reason. Most are branch rows (on_a_branch_that_is_not_utf_8 and the test_adopt_git_reads.py default-branch rows), for example test_plan_refuses_a_default_branch_that_is_not_utf8[head], test_family_tracking_branch.py's ..._is_refused_by_name[add] and test_family_head_by_hand_bytes.py's 8 test_the_printed_line_puts_the_member_back_on_a_branch_that_is_not_utf8 rows. Their names come from git's bytes, which are not UTF-8 in any locale. Each passed there, so the tool was judged and was right.
      • 45 on the two guards, the callers fixture and the helpers guard. Their subject is how a caller or the helper treats the disk's EILSEQ, EACCES, ENOSPC and EEXIST, emulated. That has nothing to do with the locale.
    • The docstring overstates it. "so no file name here is one that is not UTF-8" is not true of a git branch. The disk and git still hold the byte 0xFF in every locale; only Python's reading of it changes.
    • Why only a NIT. No row the skip catches was failing on a wrong tool (section 2). Neither CI nor the bench runs a one-byte locale, and 52 rows of these files still fail there after. tests/test_adopt_plan_paths_spelled.py: follow-up of PR #1185 (#1167) from its review: three of its rows fail under a one-byte locale where the tool is right (the 0xff --work-dir and the two U+00E9 paths), and its new helper builds the child's environment without blank_unnamed_pin_sources or the git identity defaults #1196 asked for exactly this change to the shared helper.
    • Follow-up.
      • Put the locale question in its own helper, for example skip_where_the_locale_reads_the_byte_as_text() in tests/conftest.py.
      • Call it from the rows whose premise is that Python reads 0xFF in as U+DCFF: the 0xff --work-dir row and test_stdout_encoding.py's two non-UTF-8 --out rows.
      • Leave skip_where_a_name_cannot_be_not_utf_8 with its two questions, so the callers-fixture and helpers-guard halves are not needed.
      • Or keep this design, and say in the helper's docstring that under a one-byte locale it also skips the git-branch rows.
  • N2 (NIT): the new Latin-1 helper row fails on a real Windows.
    • What. test_a_locale_that_reads_the_byte_as_a_character_skips_before_the_disk is not LINUX_ONLY, and it patches only os.fsdecode. On Windows the helper's first question skips first. I emulated it with os.fsencode = windows_fsencode and the row's Latin-1 fsdecode. The reason is then "this system's os.fsencode makes no byte of a surrogate...", which holds no 0xFF, so assert "0xFF" in reason fails.
    • Why only a NIT. CI is Linux only (ci: run the test suite on Linux only #597), but this file is written to hold the Windows answers too.
    • Fix. In that row, also patch os.fsencode with a POSIX one, lambda name: name if isinstance(name := os.fspath(name), bytes) else name.encode("utf-8", "surrogateescape"). Or skip it where len(os.fsencode(NOT_UTF_8_PROBE)) != 1.
  • N3 (NIT): no row holds that the locale is asked after the system's question.
    • What. G4 (the two swapped) survives on Linux. But Windows' os.fsdecode is UTF-8 with surrogatepass, and b"\xff".decode("utf-8", "surrogatepass") raises UnicodeDecodeError. With Windows' os.fsencode and os.fsdecode both emulated, the head's helper skips on the os.fsencode reason, and G4's helper raises UnicodeDecodeError. The conftest comment at NOT_UTF_8_BRANCH already says os.fsdecode "raises on Windows".
    • Fix. In test_where_fsencode_makes_three_bytes_the_disk_is_not_asked, also patch os.fsdecode with Windows' (lambda name: name if isinstance(name := os.fspath(name), str) else name.decode("utf-8", "surrogatepass")). G4 then fails there.
  • N4 (NIT): the two-question predicate is written three times.
    • What. The same test, len(os.fsencode(NOT_UTF_8_PROBE)) != 1 or os.fsdecode(b"\xff") != NOT_UTF_8_PROBE, is in the callers fixture a_system_that_carries_the_byte and in the helpers file's skip_where_an_earlier_question_skips. Its two halves are also the helper's own first two steps. A third question added to the helper later would have to be added in all three, or those rows fail again, as 28 did here.
    • Fix. Define one predicate in tests/conftest.py, for example an_earlier_question_skips() -> bool, beside the helper, and use it from both test files.
  • N5 (NIT): the new helper's docstring claims more parity than it has.
    • What. the_environment_of_a_child_read_as_bytes says the child is started "as test_stdout_encoding.py's run_tool_bytes starts its own". run_tool_bytes (through child_environ) also sets an empty AGENT_PROTOCOL_ROOT, and this helper does not (section 4). It has no effect here: shape_advisory.workspace_paths is read only after a clone, and the run ends at the clone refusal.
    • Fix. Say "as run_script starts every other child", which is exact. Or add "AGENT_PROTOCOL_ROOT": str(tmp_path / "agent-protocol"), with the directory made, and keep the sentence.

Notes, not findings

Lane: openreposhape-4 (openRepoShape-4)

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