nixbot

builds

failed mcptoon-0.7.19 checks.aarch64-darwin.pkgs-mcptoon · build #4847 · raw

1Sourcing python-remove-tests-dir-hook2Sourcing python-catch-conflicts-hook.sh3Sourcing python-remove-bin-bytecode-hook.sh4Sourcing pypa-build-hook5Using pypaBuildPhase6Sourcing python-runtime-deps-check-hook7Using pythonRuntimeDepsCheckHook8Sourcing pypa-install-hook9Using pypaInstallPhase10Sourcing python-imports-check-hook.sh11Using pythonImportsCheckPhase12Sourcing python-namespaces-hook13Sourcing python-catch-conflicts-hook.sh14Sourcing pytest-check-hook15Using pytestCheckPhase
unpackPhase
16unpacking source archive /nix/store/yjfl19d0f41pk6ws1ji37pa8w25sc7hg-source17source root is source18setting SOURCE_DATE_EPOCH to timestamp 315619200 of file "source/tests/test_watch.py"
configurePhase
19no configure script, doing nothing
buildPhase
20Executing pypaBuildPhase21Creating a wheel...22pypa build flags: --no-isolation --outdir dist/ --wheel23* Getting build dependencies for wheel...24/nix/store/qmli4gwqi36clrxc1i29q6mnf8sizlbc-python3.14-setuptools-83.0.0/lib/python3.14/site-packages/setuptools/config/_apply_pyprojecttoml.py:82: SetuptoolsDeprecationWarning: `project.license` as a TOML table is deprecated25!!2627 ********************************************************************************28 Please use a simple string containing a SPDX expression for `project.license`. You can also use `project.license-files`. (Both options available on setuptools>=77.0.0).2930 By 2027-Feb-18, you need to update your project and remove deprecated calls31 or your builds will no longer be supported.3233 See https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license for details.34 ********************************************************************************3536!!37 corresp(dist, value, root_dir)38/nix/store/qmli4gwqi36clrxc1i29q6mnf8sizlbc-python3.14-setuptools-83.0.0/lib/python3.14/site-packages/setuptools/config/_apply_pyprojecttoml.py:61: SetuptoolsDeprecationWarning: License classifiers are deprecated.39!!4041 ********************************************************************************42 Please consider removing the following classifiers in favor of a SPDX license expression:4344 License :: OSI Approved :: Apache Software License4546 See https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license for details.47 ********************************************************************************4849!!50 dist._finalize_license_expression()51/nix/store/qmli4gwqi36clrxc1i29q6mnf8sizlbc-python3.14-setuptools-83.0.0/lib/python3.14/site-packages/setuptools/dist.py:765: SetuptoolsDeprecationWarning: License classifiers are deprecated.52!!5354 ********************************************************************************55 Please consider removing the following classifiers in favor of a SPDX license expression:5657 License :: OSI Approved :: Apache Software License5859 See https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license for details.60 ********************************************************************************6162!!63 self._finalize_license_expression()64running egg_info65creating src/mcptoon.egg-info66writing src/mcptoon.egg-info/PKG-INFO67writing dependency_links to src/mcptoon.egg-info/dependency_links.txt68writing entry points to src/mcptoon.egg-info/entry_points.txt69writing requirements to src/mcptoon.egg-info/requires.txt70writing top-level names to src/mcptoon.egg-info/top_level.txt71writing manifest file 'src/mcptoon.egg-info/SOURCES.txt'72reading manifest file 'src/mcptoon.egg-info/SOURCES.txt'73adding license file 'LICENSE'74adding license file 'NOTICE'75writing manifest file 'src/mcptoon.egg-info/SOURCES.txt'76* Building wheel...77/nix/store/qmli4gwqi36clrxc1i29q6mnf8sizlbc-python3.14-setuptools-83.0.0/lib/python3.14/site-packages/setuptools/config/_apply_pyprojecttoml.py:82: SetuptoolsDeprecationWarning: `project.license` as a TOML table is deprecated78!!7980 ********************************************************************************81 Please use a simple string containing a SPDX expression for `project.license`. You can also use `project.license-files`. (Both options available on setuptools>=77.0.0).8283 By 2027-Feb-18, you need to update your project and remove deprecated calls84 or your builds will no longer be supported.8586 See https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license for details.87 ********************************************************************************8889!!90 corresp(dist, value, root_dir)91/nix/store/qmli4gwqi36clrxc1i29q6mnf8sizlbc-python3.14-setuptools-83.0.0/lib/python3.14/site-packages/setuptools/config/_apply_pyprojecttoml.py:61: SetuptoolsDeprecationWarning: License classifiers are deprecated.92!!9394 ********************************************************************************95 Please consider removing the following classifiers in favor of a SPDX license expression:9697 License :: OSI Approved :: Apache Software License9899 See https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license for details.100 ********************************************************************************101102!!103 dist._finalize_license_expression()104/nix/store/qmli4gwqi36clrxc1i29q6mnf8sizlbc-python3.14-setuptools-83.0.0/lib/python3.14/site-packages/setuptools/dist.py:765: SetuptoolsDeprecationWarning: License classifiers are deprecated.105!!106107 ********************************************************************************108 Please consider removing the following classifiers in favor of a SPDX license expression:109110 License :: OSI Approved :: Apache Software License111112 See https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license for details.113 ********************************************************************************114115!!116 self._finalize_license_expression()117running bdist_wheel118running build119running build_py120creating build/lib/mcptoon121copying src/mcptoon/sync.py -> build/lib/mcptoon122copying src/mcptoon/config.py -> build/lib/mcptoon123copying src/mcptoon/skills.py -> build/lib/mcptoon124copying src/mcptoon/manifest.py -> build/lib/mcptoon125copying src/mcptoon/health.py -> build/lib/mcptoon126copying src/mcptoon/discover.py -> build/lib/mcptoon127copying src/mcptoon/client.py -> build/lib/mcptoon128copying src/mcptoon/cache.py -> build/lib/mcptoon129copying src/mcptoon/__init__.py -> build/lib/mcptoon130copying src/mcptoon/serve.py -> build/lib/mcptoon131copying src/mcptoon/native_tools.py -> build/lib/mcptoon132copying src/mcptoon/bench.py -> build/lib/mcptoon133copying src/mcptoon/installer.py -> build/lib/mcptoon134copying src/mcptoon/cli.py -> build/lib/mcptoon135copying src/mcptoon/toon_vendored.py -> build/lib/mcptoon136copying src/mcptoon/plugin.py -> build/lib/mcptoon137copying src/mcptoon/errors.py -> build/lib/mcptoon138copying src/mcptoon/watch.py -> build/lib/mcptoon139copying src/mcptoon/demo_server.py -> build/lib/mcptoon140copying src/mcptoon/router.py -> build/lib/mcptoon141copying src/mcptoon/demo.py -> build/lib/mcptoon142copying src/mcptoon/schema_simplifier.py -> build/lib/mcptoon143copying src/mcptoon/usage.py -> build/lib/mcptoon144copying src/mcptoon/__main__.py -> build/lib/mcptoon145copying src/mcptoon/output.py -> build/lib/mcptoon146running egg_info147writing src/mcptoon.egg-info/PKG-INFO148writing dependency_links to src/mcptoon.egg-info/dependency_links.txt149writing entry points to src/mcptoon.egg-info/entry_points.txt150writing requirements to src/mcptoon.egg-info/requires.txt151writing top-level names to src/mcptoon.egg-info/top_level.txt152reading manifest file 'src/mcptoon.egg-info/SOURCES.txt'153adding license file 'LICENSE'154adding license file 'NOTICE'155writing manifest file 'src/mcptoon.egg-info/SOURCES.txt'156installing to build/bdist.macosx-14.0-arm64/wheel157running install158running install_lib159creating build/bdist.macosx-14.0-arm64/wheel160creating build/bdist.macosx-14.0-arm64/wheel/mcptoon161copying build/lib/mcptoon/sync.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon162copying build/lib/mcptoon/config.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon163copying build/lib/mcptoon/skills.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon164copying build/lib/mcptoon/manifest.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon165copying build/lib/mcptoon/health.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon166copying build/lib/mcptoon/discover.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon167copying build/lib/mcptoon/client.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon168copying build/lib/mcptoon/cache.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon169copying build/lib/mcptoon/__init__.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon170copying build/lib/mcptoon/serve.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon171copying build/lib/mcptoon/native_tools.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon172copying build/lib/mcptoon/bench.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon173copying build/lib/mcptoon/installer.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon174copying build/lib/mcptoon/cli.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon175copying build/lib/mcptoon/toon_vendored.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon176copying build/lib/mcptoon/plugin.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon177copying build/lib/mcptoon/errors.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon178copying build/lib/mcptoon/watch.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon179copying build/lib/mcptoon/demo_server.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon180copying build/lib/mcptoon/router.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon181copying build/lib/mcptoon/demo.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon182copying build/lib/mcptoon/schema_simplifier.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon183copying build/lib/mcptoon/usage.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon184copying build/lib/mcptoon/__main__.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon185copying build/lib/mcptoon/output.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon186running install_egg_info187Copying src/mcptoon.egg-info to build/bdist.macosx-14.0-arm64/wheel/./mcptoon-0.7.19-py3.14.egg-info188running install_scripts189creating build/bdist.macosx-14.0-arm64/wheel/mcptoon-0.7.19.dist-info/WHEEL190creating '/nix/var/nix/builds/nix-77679-3945013545/source/dist/.tmp-r3720idn/mcptoon-0.7.19-py3-none-any.whl' and adding 'build/bdist.macosx-14.0-arm64/wheel' to it191adding 'mcptoon/__init__.py'192adding 'mcptoon/__main__.py'193adding 'mcptoon/bench.py'194adding 'mcptoon/cache.py'195adding 'mcptoon/cli.py'196adding 'mcptoon/client.py'197adding 'mcptoon/config.py'198adding 'mcptoon/demo.py'199adding 'mcptoon/demo_server.py'200adding 'mcptoon/discover.py'201adding 'mcptoon/errors.py'202adding 'mcptoon/health.py'203adding 'mcptoon/installer.py'204adding 'mcptoon/manifest.py'205adding 'mcptoon/native_tools.py'206adding 'mcptoon/output.py'207adding 'mcptoon/plugin.py'208adding 'mcptoon/router.py'209adding 'mcptoon/schema_simplifier.py'210adding 'mcptoon/serve.py'211adding 'mcptoon/skills.py'212adding 'mcptoon/sync.py'213adding 'mcptoon/toon_vendored.py'214adding 'mcptoon/usage.py'215adding 'mcptoon/watch.py'216adding 'mcptoon-0.7.19.dist-info/licenses/LICENSE'217adding 'mcptoon-0.7.19.dist-info/licenses/NOTICE'218adding 'mcptoon-0.7.19.dist-info/METADATA'219adding 'mcptoon-0.7.19.dist-info/WHEEL'220adding 'mcptoon-0.7.19.dist-info/entry_points.txt'221adding 'mcptoon-0.7.19.dist-info/top_level.txt'222adding 'mcptoon-0.7.19.dist-info/RECORD'223removing build/bdist.macosx-14.0-arm64/wheel224Successfully built mcptoon-0.7.19-py3-none-any.whl225Finished creating a wheel...226Finished executing pypaBuildPhase
pythonRuntimeDepsCheckHook
227Executing pythonRuntimeDepsCheck228Checking runtime dependencies for mcptoon-0.7.19-py3-none-any.whl229Finished executing pythonRuntimeDepsCheck
installPhase
230Executing pypaInstallPhase231Successfully installed mcptoon-0.7.19-py3-none-any.whl232Finished executing pypaInstallPhase
pythonOutputDistPhase
233Executing pythonOutputDistPhase234Finished executing pythonOutputDistPhase
fixupPhase
235checking for references to /nix/var/nix/builds/nix-77679-3945013545/ in /nix/store/6jnycgcmjhfvl3cwxicp2dimwg770ys0-mcptoon-0.7.19...236patching script interpreter paths in /nix/store/6jnycgcmjhfvl3cwxicp2dimwg770ys0-mcptoon-0.7.19237stripping (with command strip and flags -S) in /nix/store/6jnycgcmjhfvl3cwxicp2dimwg770ys0-mcptoon-0.7.19/lib /nix/store/6jnycgcmjhfvl3cwxicp2dimwg770ys0-mcptoon-0.7.19/bin238checking for references to /nix/var/nix/builds/nix-77679-3945013545/ in /nix/store/8y2vxyb8fpbl7n6hmdsiwvhgknaf78q1-mcptoon-0.7.19-dist...239patching script interpreter paths in /nix/store/8y2vxyb8fpbl7n6hmdsiwvhgknaf78q1-mcptoon-0.7.19-dist240Rewriting #!/nix/store/4l8r0s2r5fna7src82b5fc2hixdvfyw0-python3-3.14.7/bin/python3.14 to #!/nix/store/4l8r0s2r5fna7src82b5fc2hixdvfyw0-python3-3.14.7241wrapping `/nix/store/6jnycgcmjhfvl3cwxicp2dimwg770ys0-mcptoon-0.7.19/bin/mcptoon'...242Executing pythonRemoveTestsDir243Finished executing pythonRemoveTestsDir
installCheckPhase
244no Makefile or custom installCheckPhase, doing nothing
pythonImportsCheckPhase
245Executing pythonImportsCheckPhase246Check whether the following modules can be imported: mcptoon
pytestCheckPhase
247Executing pytestCheckPhase248pytest flags: -m pytest249============================= test session starts ==============================250platform darwin -- Python 3.14.7, pytest-9.1.1, pluggy-1.6.0251rootdir: /nix/var/nix/builds/nix-77679-3945013545/source252configfile: pyproject.toml253testpaths: tests254collected 1059 items 255256tests/test_bench.py ............. [ 1%]257tests/test_cache.py .... [ 1%]258tests/test_calculator.py .......................... [ 4%]259tests/test_claude_plugin_package.py ............. [ 5%]260tests/test_cli_flags.py ........... [ 6%]261tests/test_client.py .............................. [ 9%]262tests/test_command_coverage.py .... [ 9%]263tests/test_completion.py ........ [ 10%]264tests/test_config.py ......... [ 11%]265tests/test_dead_server_diagnostics.py ... [ 11%]266tests/test_demo.py ..................... [ 13%]267tests/test_demo_dead_package.py ........ [ 14%]268tests/test_demo_server.py .............................................. [ 18%]269..... [ 18%]270tests/test_discover.py .................................... [ 22%]271tests/test_doctor_star_hint.py ..... [ 22%]272tests/test_envelope.py ........ [ 23%]273tests/test_fallback_json.py ...... [ 24%]274tests/test_footprint_claims.py ............ [ 25%]275tests/test_gemini_manifest.py ...... [ 25%]276tests/test_health.py ............. [ 27%]277tests/test_help_shortcircuit.py ......... [ 27%]278tests/test_llms_txt.py ...... [ 28%]279tests/test_native_tools.py ........................... [ 31%]280tests/test_output.py ................................................... [ 35%]281........................................................................ [ 42%]282................ [ 44%]283tests/test_plugin_install.py .......... [ 45%]284tests/test_plugin_scan.py ............................... [ 48%]285tests/test_policy_overrides.py ................ [ 49%]286tests/test_readme_links.py ... [ 49%]287tests/test_registry_sync.py ............ [ 50%]288tests/test_router.py ............................................ [ 55%]289tests/test_search.py ................................ [ 58%]290tests/test_serve.py .................................................... [ 63%]291... [ 63%]292tests/test_serve_perf.py .......... [ 64%]293tests/test_serve_prompts.py ........ [ 65%]294tests/test_skills.py ................................................... [ 69%]295................................FFF....... [ 73%]296tests/test_stats_toggle.py ......... [ 74%]297tests/test_stderr_pipe_deadlock.py .... [ 75%]298tests/test_sync.py ................ [ 76%]299tests/test_tier_claims_consistent.py .... [ 76%]300tests/test_toml_config.py .......................... [ 79%]301tests/test_toon_cross_validate.py ............................... [ 82%]302tests/test_v02_features.py .................................... [ 85%]303tests/test_v04_features.py ................ [ 87%]304tests/test_v05_features.py ...................... [ 89%]305tests/test_v072_delight.py ..........s.. [ 90%]306tests/test_v073_http_security.py .............................. [ 93%]307tests/test_v074_stdio_timeout.py ............ [ 94%]308tests/test_v076_stateless_serve.py ................... [ 96%]309tests/test_v07_spec2026.py ..................... [ 98%]310tests/test_watch.py .................. [100%]311312=================================== FAILURES ===================================313_____ TombstoneTests.test_removal_uses_the_shared_graveyard_when_given_one _____314315self = <tests.test_skills.TombstoneTests testMethod=test_removal_uses_the_shared_graveyard_when_given_one>316317 def setUp(self):318 self.tmp = tempfile.TemporaryDirectory()319 self.base = Path(self.tmp.name)320 self.repo = self.base / "repo"321 (self.repo / "skills" / "alpha").mkdir(parents=True)322 (self.repo / "skills" / "alpha" / "SKILL.md").write_text(323 "---\nname: alpha\ndescription: d\n---\n", encoding="utf-8")324 (self.repo / "unrelated.txt").write_text("keep me\n", encoding="utf-8")325> self._git("init")326327tests/test_skills.py:940: 328_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 329tests/test_skills.py:951: in _git330 return subprocess.run(["git", *args], cwd=str(self.repo),331/nix/store/4l8r0s2r5fna7src82b5fc2hixdvfyw0-python3-3.14.7/lib/python3.14/subprocess.py:555: in run332 with Popen(*popenargs, **kwargs) as process:333 ^^^^^^^^^^^^^^^^^^^^^^^^^^^334/nix/store/4l8r0s2r5fna7src82b5fc2hixdvfyw0-python3-3.14.7/lib/python3.14/subprocess.py:1039: in __init__335 self._execute_child(args, executable, preexec_fn, close_fds,336_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 337338self = <Popen: returncode: 255 args: ['git', 'init']>, args = ['git', 'init']339executable = b'git', preexec_fn = None, close_fds = True, pass_fds = ()340cwd = '/nix/var/nix/builds/nix-77679-3945013545/tmp70wy65yc/repo', env = None341startupinfo = None, creationflags = 0, shell = False, p2cread = -1342p2cwrite = -1, c2pread = 14, c2pwrite = 15, errread = 16, errwrite = 17343restore_signals = True, gid = None, gids = None, uid = None, umask = -1344start_new_session = False, process_group = -1345346 def _execute_child(self, args, executable, preexec_fn, close_fds,347 pass_fds, cwd, env,348 startupinfo, creationflags, shell,349 p2cread, p2cwrite,350 c2pread, c2pwrite,351 errread, errwrite,352 restore_signals,353 gid, gids, uid, umask,354 start_new_session, process_group):355 """Execute program (POSIX version)"""356 357 if isinstance(args, (str, bytes)):358 args = [args]359 elif isinstance(args, os.PathLike):360 if shell:361 raise TypeError('path-like args is not allowed when '362 'shell is true')363 args = [args]364 else:365 args = list(args)366 367 if shell:368 # On Android the default shell is at '/system/bin/sh'.369 unix_shell = ('/system/bin/sh' if370 hasattr(sys, 'getandroidapilevel') else '/nix/store/lb6nd0iyy9x0bm7yfx2fkw0wbjllg4ic-bash-5.3p15/bin/sh')371 args = [unix_shell, "-c"] + args372 if executable:373 args[0] = executable374 375 if executable is None:376 executable = args[0]377 378 sys.audit("subprocess.Popen", executable, args, cwd, env)379 380 if (_USE_POSIX_SPAWN381 and os.path.dirname(executable)382 and preexec_fn is None383 and (not close_fds or _HAVE_POSIX_SPAWN_CLOSEFROM)384 and not pass_fds385 and cwd is None386 and (p2cread == -1 or p2cread > 2)387 and (c2pwrite == -1 or c2pwrite > 2)388 and (errwrite == -1 or errwrite > 2)389 and not start_new_session390 and process_group == -1391 and gid is None392 and gids is None393 and uid is None394 and umask < 0):395 self._posix_spawn(args, executable, env, restore_signals, close_fds,396 p2cread, p2cwrite,397 c2pread, c2pwrite,398 errread, errwrite)399 return400 401 orig_executable = executable402 403 # For transferring possible exec failure from child to parent.404 # Data format: "exception name:hex errno:description"405 # Pickle is not used; it is complex and involves memory allocation.406 errpipe_read, errpipe_write = os.pipe()407 # errpipe_write must not be in the standard io 0, 1, or 2 fd range.408 low_fds_to_close = []409 while errpipe_write < 3:410 low_fds_to_close.append(errpipe_write)411 errpipe_write = os.dup(errpipe_write)412 for low_fd in low_fds_to_close:413 os.close(low_fd)414 try:415 try:416 # We must avoid complex work that could involve417 # malloc or free in the child process to avoid418 # potential deadlocks, thus we do all this here.419 # and pass it to fork_exec()420 421 if env is not None:422 env_list = []423 for k, v in env.items():424 k = os.fsencode(k)425 if b'=' in k:426 raise ValueError("illegal environment variable name")427 env_list.append(k + b'=' + os.fsencode(v))428 else:429 env_list = None # Use execv instead of execve.430 executable = os.fsencode(executable)431 if os.path.dirname(executable):432 executable_list = (executable,)433 else:434 # This matches the behavior of os._execvpe().435 executable_list = tuple(436 os.path.join(os.fsencode(dir), executable)437 for dir in os.get_exec_path(env))438 fds_to_keep = set(pass_fds)439 fds_to_keep.add(errpipe_write)440 self.pid = _fork_exec(441 args, executable_list,442 close_fds, tuple(sorted(map(int, fds_to_keep))),443 cwd, env_list,444 p2cread, p2cwrite, c2pread, c2pwrite,445 errread, errwrite,446 errpipe_read, errpipe_write,447 restore_signals, start_new_session,448 process_group, gid, gids, uid, umask,449 preexec_fn)450 self._child_created = True451 finally:452 # be sure the FD is closed no matter what453 os.close(errpipe_write)454 455 self._close_pipe_fds(p2cread, p2cwrite,456 c2pread, c2pwrite,457 errread, errwrite)458 459 # Wait for exec to fail or succeed; possibly raising an460 # exception (limited in size)461 errpipe_data = bytearray()462 while True:463 part = os.read(errpipe_read, 50000)464 errpipe_data += part465 if not part or len(errpipe_data) > 50000:466 break467 finally:468 # be sure the FD is closed no matter what469 os.close(errpipe_read)470 471 if errpipe_data:472 try:473 pid, sts = os.waitpid(self.pid, 0)474 if pid == self.pid:475 self._handle_exitstatus(sts)476 else:477 self.returncode = sys.maxsize478 except ChildProcessError:479 pass480 481 try:482 exception_name, hex_errno, err_msg = (483 errpipe_data.split(b':', 2))484 # The encoding here should match the encoding485 # written in by the subprocess implementations486 # like _posixsubprocess487 err_msg = err_msg.decode()488 except ValueError:489 exception_name = b'SubprocessError'490 hex_errno = b'0'491 err_msg = 'Bad exception data from child: {!r}'.format(492 bytes(errpipe_data))493 child_exception_type = getattr(494 builtins, exception_name.decode('ascii'),495 SubprocessError)496 if issubclass(child_exception_type, OSError) and hex_errno:497 errno_num = int(hex_errno, 16)498 if err_msg == "noexec:chdir":499 err_msg = ""500 # The error must be from chdir(cwd).501 err_filename = cwd502 elif err_msg == "noexec":503 err_msg = ""504 err_filename = None505 else:506 err_filename = orig_executable507 if errno_num != 0:508 err_msg = os.strerror(errno_num)509 if err_filename is not None:510> raise child_exception_type(errno_num, err_msg, err_filename)511E FileNotFoundError: [Errno 2] No such file or directory: 'git'512513/nix/store/4l8r0s2r5fna7src82b5fc2hixdvfyw0-python3-3.14.7/lib/python3.14/subprocess.py:1990: FileNotFoundError514__________ TombstoneTests.test_removal_without_a_repo_still_archives ___________515516self = <tests.test_skills.TombstoneTests testMethod=test_removal_without_a_repo_still_archives>517518 def setUp(self):519 self.tmp = tempfile.TemporaryDirectory()520 self.base = Path(self.tmp.name)521 self.repo = self.base / "repo"522 (self.repo / "skills" / "alpha").mkdir(parents=True)523 (self.repo / "skills" / "alpha" / "SKILL.md").write_text(524 "---\nname: alpha\ndescription: d\n---\n", encoding="utf-8")525 (self.repo / "unrelated.txt").write_text("keep me\n", encoding="utf-8")526> self._git("init")527528tests/test_skills.py:940: 529_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 530tests/test_skills.py:951: in _git531 return subprocess.run(["git", *args], cwd=str(self.repo),532/nix/store/4l8r0s2r5fna7src82b5fc2hixdvfyw0-python3-3.14.7/lib/python3.14/subprocess.py:555: in run533 with Popen(*popenargs, **kwargs) as process:534 ^^^^^^^^^^^^^^^^^^^^^^^^^^^535/nix/store/4l8r0s2r5fna7src82b5fc2hixdvfyw0-python3-3.14.7/lib/python3.14/subprocess.py:1039: in __init__536 self._execute_child(args, executable, preexec_fn, close_fds,537_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 538539self = <Popen: returncode: 255 args: ['git', 'init']>, args = ['git', 'init']540executable = b'git', preexec_fn = None, close_fds = True, pass_fds = ()541cwd = '/nix/var/nix/builds/nix-77679-3945013545/tmpuc36z25c/repo', env = None542startupinfo = None, creationflags = 0, shell = False, p2cread = -1543p2cwrite = -1, c2pread = 14, c2pwrite = 15, errread = 16, errwrite = 17544restore_signals = True, gid = None, gids = None, uid = None, umask = -1545start_new_session = False, process_group = -1546547 def _execute_child(self, args, executable, preexec_fn, close_fds,548 pass_fds, cwd, env,549 startupinfo, creationflags, shell,550 p2cread, p2cwrite,551 c2pread, c2pwrite,552 errread, errwrite,553 restore_signals,554 gid, gids, uid, umask,555 start_new_session, process_group):556 """Execute program (POSIX version)"""557 558 if isinstance(args, (str, bytes)):559 args = [args]560 elif isinstance(args, os.PathLike):561 if shell:562 raise TypeError('path-like args is not allowed when '563 'shell is true')564 args = [args]565 else:566 args = list(args)567 568 if shell:569 # On Android the default shell is at '/system/bin/sh'.570 unix_shell = ('/system/bin/sh' if571 hasattr(sys, 'getandroidapilevel') else '/nix/store/lb6nd0iyy9x0bm7yfx2fkw0wbjllg4ic-bash-5.3p15/bin/sh')572 args = [unix_shell, "-c"] + args573 if executable:574 args[0] = executable575 576 if executable is None:577 executable = args[0]578 579 sys.audit("subprocess.Popen", executable, args, cwd, env)580 581 if (_USE_POSIX_SPAWN582 and os.path.dirname(executable)583 and preexec_fn is None584 and (not close_fds or _HAVE_POSIX_SPAWN_CLOSEFROM)585 and not pass_fds586 and cwd is None587 and (p2cread == -1 or p2cread > 2)588 and (c2pwrite == -1 or c2pwrite > 2)589 and (errwrite == -1 or errwrite > 2)590 and not start_new_session591 and process_group == -1592 and gid is None593 and gids is None594 and uid is None595 and umask < 0):596 self._posix_spawn(args, executable, env, restore_signals, close_fds,597 p2cread, p2cwrite,598 c2pread, c2pwrite,599 errread, errwrite)600 return601 602 orig_executable = executable603 604 # For transferring possible exec failure from child to parent.605 # Data format: "exception name:hex errno:description"606 # Pickle is not used; it is complex and involves memory allocation.607 errpipe_read, errpipe_write = os.pipe()608 # errpipe_write must not be in the standard io 0, 1, or 2 fd range.609 low_fds_to_close = []610 while errpipe_write < 3:611 low_fds_to_close.append(errpipe_write)612 errpipe_write = os.dup(errpipe_write)613 for low_fd in low_fds_to_close:614 os.close(low_fd)615 try:616 try:617 # We must avoid complex work that could involve618 # malloc or free in the child process to avoid619 # potential deadlocks, thus we do all this here.620 # and pass it to fork_exec()621 622 if env is not None:623 env_list = []624 for k, v in env.items():625 k = os.fsencode(k)626 if b'=' in k:627 raise ValueError("illegal environment variable name")628 env_list.append(k + b'=' + os.fsencode(v))629 else:630 env_list = None # Use execv instead of execve.631 executable = os.fsencode(executable)632 if os.path.dirname(executable):633 executable_list = (executable,)634 else:635 # This matches the behavior of os._execvpe().636 executable_list = tuple(637 os.path.join(os.fsencode(dir), executable)638 for dir in os.get_exec_path(env))639 fds_to_keep = set(pass_fds)640 fds_to_keep.add(errpipe_write)641 self.pid = _fork_exec(642 args, executable_list,643 close_fds, tuple(sorted(map(int, fds_to_keep))),644 cwd, env_list,645 p2cread, p2cwrite, c2pread, c2pwrite,646 errread, errwrite,647 errpipe_read, errpipe_write,648 restore_signals, start_new_session,649 process_group, gid, gids, uid, umask,650 preexec_fn)651 self._child_created = True652 finally:653 # be sure the FD is closed no matter what654 os.close(errpipe_write)655 656 self._close_pipe_fds(p2cread, p2cwrite,657 c2pread, c2pwrite,658 errread, errwrite)659 660 # Wait for exec to fail or succeed; possibly raising an661 # exception (limited in size)662 errpipe_data = bytearray()663 while True:664 part = os.read(errpipe_read, 50000)665 errpipe_data += part666 if not part or len(errpipe_data) > 50000:667 break668 finally:669 # be sure the FD is closed no matter what670 os.close(errpipe_read)671 672 if errpipe_data:673 try:674 pid, sts = os.waitpid(self.pid, 0)675 if pid == self.pid:676 self._handle_exitstatus(sts)677 else:678 self.returncode = sys.maxsize679 except ChildProcessError:680 pass681 682 try:683 exception_name, hex_errno, err_msg = (684 errpipe_data.split(b':', 2))685 # The encoding here should match the encoding686 # written in by the subprocess implementations687 # like _posixsubprocess688 err_msg = err_msg.decode()689 except ValueError:690 exception_name = b'SubprocessError'691 hex_errno = b'0'692 err_msg = 'Bad exception data from child: {!r}'.format(693 bytes(errpipe_data))694 child_exception_type = getattr(695 builtins, exception_name.decode('ascii'),696 SubprocessError)697 if issubclass(child_exception_type, OSError) and hex_errno:698 errno_num = int(hex_errno, 16)699 if err_msg == "noexec:chdir":700 err_msg = ""701 # The error must be from chdir(cwd).702 err_filename = cwd703 elif err_msg == "noexec":704 err_msg = ""705 err_filename = None706 else:707 err_filename = orig_executable708 if errno_num != 0:709 err_msg = os.strerror(errno_num)710 if err_filename is not None:711> raise child_exception_type(errno_num, err_msg, err_filename)712E FileNotFoundError: [Errno 2] No such file or directory: 'git'713714/nix/store/4l8r0s2r5fna7src82b5fc2hixdvfyw0-python3-3.14.7/lib/python3.14/subprocess.py:1990: FileNotFoundError715_________ TombstoneTests.test_tombstone_commits_only_the_removed_path __________716717self = <tests.test_skills.TombstoneTests testMethod=test_tombstone_commits_only_the_removed_path>718719 def setUp(self):720 self.tmp = tempfile.TemporaryDirectory()721 self.base = Path(self.tmp.name)722 self.repo = self.base / "repo"723 (self.repo / "skills" / "alpha").mkdir(parents=True)724 (self.repo / "skills" / "alpha" / "SKILL.md").write_text(725 "---\nname: alpha\ndescription: d\n---\n", encoding="utf-8")726 (self.repo / "unrelated.txt").write_text("keep me\n", encoding="utf-8")727> self._git("init")728729tests/test_skills.py:940: 730_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 731tests/test_skills.py:951: in _git732 return subprocess.run(["git", *args], cwd=str(self.repo),733/nix/store/4l8r0s2r5fna7src82b5fc2hixdvfyw0-python3-3.14.7/lib/python3.14/subprocess.py:555: in run734 with Popen(*popenargs, **kwargs) as process:735 ^^^^^^^^^^^^^^^^^^^^^^^^^^^736/nix/store/4l8r0s2r5fna7src82b5fc2hixdvfyw0-python3-3.14.7/lib/python3.14/subprocess.py:1039: in __init__737 self._execute_child(args, executable, preexec_fn, close_fds,738_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 739740self = <Popen: returncode: 255 args: ['git', 'init']>, args = ['git', 'init']741executable = b'git', preexec_fn = None, close_fds = True, pass_fds = ()742cwd = '/nix/var/nix/builds/nix-77679-3945013545/tmpjvwi7llt/repo', env = None743startupinfo = None, creationflags = 0, shell = False, p2cread = -1744p2cwrite = -1, c2pread = 14, c2pwrite = 15, errread = 16, errwrite = 17745restore_signals = True, gid = None, gids = None, uid = None, umask = -1746start_new_session = False, process_group = -1747748 def _execute_child(self, args, executable, preexec_fn, close_fds,749 pass_fds, cwd, env,750 startupinfo, creationflags, shell,751 p2cread, p2cwrite,752 c2pread, c2pwrite,753 errread, errwrite,754 restore_signals,755 gid, gids, uid, umask,756 start_new_session, process_group):757 """Execute program (POSIX version)"""758 759 if isinstance(args, (str, bytes)):760 args = [args]761 elif isinstance(args, os.PathLike):762 if shell:763 raise TypeError('path-like args is not allowed when '764 'shell is true')765 args = [args]766 else:767 args = list(args)768 769 if shell:770 # On Android the default shell is at '/system/bin/sh'.771 unix_shell = ('/system/bin/sh' if772 hasattr(sys, 'getandroidapilevel') else '/nix/store/lb6nd0iyy9x0bm7yfx2fkw0wbjllg4ic-bash-5.3p15/bin/sh')773 args = [unix_shell, "-c"] + args774 if executable:775 args[0] = executable776 777 if executable is None:778 executable = args[0]779 780 sys.audit("subprocess.Popen", executable, args, cwd, env)781 782 if (_USE_POSIX_SPAWN783 and os.path.dirname(executable)784 and preexec_fn is None785 and (not close_fds or _HAVE_POSIX_SPAWN_CLOSEFROM)786 and not pass_fds787 and cwd is None788 and (p2cread == -1 or p2cread > 2)789 and (c2pwrite == -1 or c2pwrite > 2)790 and (errwrite == -1 or errwrite > 2)791 and not start_new_session792 and process_group == -1793 and gid is None794 and gids is None795 and uid is None796 and umask < 0):797 self._posix_spawn(args, executable, env, restore_signals, close_fds,798 p2cread, p2cwrite,799 c2pread, c2pwrite,800 errread, errwrite)801 return802 803 orig_executable = executable804 805 # For transferring possible exec failure from child to parent.806 # Data format: "exception name:hex errno:description"807 # Pickle is not used; it is complex and involves memory allocation.808 errpipe_read, errpipe_write = os.pipe()809 # errpipe_write must not be in the standard io 0, 1, or 2 fd range.810 low_fds_to_close = []811 while errpipe_write < 3:812 low_fds_to_close.append(errpipe_write)813 errpipe_write = os.dup(errpipe_write)814 for low_fd in low_fds_to_close:815 os.close(low_fd)816 try:817 try:818 # We must avoid complex work that could involve819 # malloc or free in the child process to avoid820 # potential deadlocks, thus we do all this here.821 # and pass it to fork_exec()822 823 if env is not None:824 env_list = []825 for k, v in env.items():826 k = os.fsencode(k)827 if b'=' in k:828 raise ValueError("illegal environment variable name")829 env_list.append(k + b'=' + os.fsencode(v))830 else:831 env_list = None # Use execv instead of execve.832 executable = os.fsencode(executable)833 if os.path.dirname(executable):834 executable_list = (executable,)835 else:836 # This matches the behavior of os._execvpe().837 executable_list = tuple(838 os.path.join(os.fsencode(dir), executable)839 for dir in os.get_exec_path(env))840 fds_to_keep = set(pass_fds)841 fds_to_keep.add(errpipe_write)842 self.pid = _fork_exec(843 args, executable_list,844 close_fds, tuple(sorted(map(int, fds_to_keep))),845 cwd, env_list,846 p2cread, p2cwrite, c2pread, c2pwrite,847 errread, errwrite,848 errpipe_read, errpipe_write,849 restore_signals, start_new_session,850 process_group, gid, gids, uid, umask,851 preexec_fn)852 self._child_created = True853 finally:854 # be sure the FD is closed no matter what855 os.close(errpipe_write)856 857 self._close_pipe_fds(p2cread, p2cwrite,858 c2pread, c2pwrite,859 errread, errwrite)860 861 # Wait for exec to fail or succeed; possibly raising an862 # exception (limited in size)863 errpipe_data = bytearray()864 while True:865 part = os.read(errpipe_read, 50000)866 errpipe_data += part867 if not part or len(errpipe_data) > 50000:868 break869 finally:870 # be sure the FD is closed no matter what871 os.close(errpipe_read)872 873 if errpipe_data:874 try:875 pid, sts = os.waitpid(self.pid, 0)876 if pid == self.pid:877 self._handle_exitstatus(sts)878 else:879 self.returncode = sys.maxsize880 except ChildProcessError:881 pass882 883 try:884 exception_name, hex_errno, err_msg = (885 errpipe_data.split(b':', 2))886 # The encoding here should match the encoding887 # written in by the subprocess implementations888 # like _posixsubprocess889 err_msg = err_msg.decode()890 except ValueError:891 exception_name = b'SubprocessError'892 hex_errno = b'0'893 err_msg = 'Bad exception data from child: {!r}'.format(894 bytes(errpipe_data))895 child_exception_type = getattr(896 builtins, exception_name.decode('ascii'),897 SubprocessError)898 if issubclass(child_exception_type, OSError) and hex_errno:899 errno_num = int(hex_errno, 16)900 if err_msg == "noexec:chdir":901 err_msg = ""902 # The error must be from chdir(cwd).903 err_filename = cwd904 elif err_msg == "noexec":905 err_msg = ""906 err_filename = None907 else:908 err_filename = orig_executable909 if errno_num != 0:910 err_msg = os.strerror(errno_num)911 if err_filename is not None:912> raise child_exception_type(errno_num, err_msg, err_filename)913E FileNotFoundError: [Errno 2] No such file or directory: 'git'914915/nix/store/4l8r0s2r5fna7src82b5fc2hixdvfyw0-python3-3.14.7/lib/python3.14/subprocess.py:1990: FileNotFoundError916=========================== short test summary info ============================917FAILED tests/test_skills.py::TombstoneTests::test_removal_uses_the_shared_graveyard_when_given_one - FileNotFoundError: [Errno 2] No such file or directory: 'git'918FAILED tests/test_skills.py::TombstoneTests::test_removal_without_a_repo_still_archives - FileNotFoundError: [Errno 2] No such file or directory: 'git'919FAILED tests/test_skills.py::TombstoneTests::test_tombstone_commits_only_the_removed_path - FileNotFoundError: [Errno 2] No such file or directory: 'git'920============= 3 failed, 1055 passed, 1 skipped in 76.80s (0:01:16) =============