[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M7BY74NPA71XYXBR5ABC7C3N":3,"skill-same:01M7BY74NPA71XYXBR5ABC7C3N":45},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":19,"linkOnly":20,"markdownContent":21,"markdownBody":22,"frontMatter":23,"refName":24,"commitSha":25,"skillDirectory":26,"forksCount":27,"repositoryHtmlUrl":28,"repositoryHomepageUrl":6,"ownerHtmlUrl":29,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":30,"install":31,"resources":44},"01M7BY74NPA71XYXBR5ABC7C3N","testing-python",null,"Write and evaluate effective Python tests using pytest, and reproduce\u002Ffix build failures against the project's own declared test runner (tox, nox, make, uv, pytest). Use when writing tests, reviewing test code, debugging test failures, fixing failed builds, or improving test coverage. Covers test design, fixtures, parameterization, mocking, async testing, and verifier-parity reproduction of CI\u002Fbuild failures.","linyouxue\u002Fskill-repair-benchmark","linyouxue","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F216151464?v=4","01M7BJEVCXKD74KH6FG9CBVSQB","林宥学","01M7BJEVE02NP217V93BKZFC0J",0,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Flinyouxue\u002Fskill-repair-benchmark\u002Fblob\u002Fmain\u002Fevaluation\u002Fresults\u002FSkillAxe-Opus47-Gold15-20260921\u002Ftasks\u002Ffix-build-agentops\u002Frepaired_run\u002Finputs\u002Fskills\u002Ftesting-python\u002FSKILL.md",[],[],"2026-11-15 14:19:17",false,"---\nname: testing-python\ndescription: Write and evaluate effective Python tests using pytest, and reproduce\u002Ffix build failures against the project's own declared test runner (tox, nox, make, uv, pytest). Use when writing tests, reviewing test code, debugging test failures, fixing failed builds, or improving test coverage. Covers test design, fixtures, parameterization, mocking, async testing, and verifier-parity reproduction of CI\u002Fbuild failures.\n---\n\n# Writing Effective Python Tests\n\n## Core Principles\n\nEvery test should be **atomic**, **self-contained**, and test **single functionality**. A test that tests multiple things is harder to debug and maintain.\n\n## Reproducing Build \u002F CI Failures (read this first when fixing a failed build)\n\nWhen the task is \"fix the build\" or \"make CI pass\", the definition of success is **the project's own declared runner exits 0**, not `pytest` from an ad-hoc venv. Before editing anything, and again before declaring the task done, reproduce the failure using the same runner the verifier\u002FCI uses.\n\n### Runner discovery checklist\n\nInspect the repo root for the authoritative runner, in this order:\n\n1. `tox.ini` or `[tool.tox]` in `pyproject.toml` → run `tox` (or `tox -e \u003Cenv>`). The `envlist` defines every environment that must pass.\n2. `noxfile.py` → run `nox`.\n3. `Makefile` targets like `test`, `check`, `ci` → run those.\n4. `.github\u002Fworkflows\u002F*.yml` → read the exact command the CI job runs (`run:` steps). Mirror it locally.\n5. `pyproject.toml` `[tool.pytest.ini_options]` or `pytest.ini` → only fall back to bare `pytest` if nothing above exists.\n\nIf you only run bare `pytest` against a hand-picked interpreter, you can miss:\n- Environments in the tox `envlist` whose Python interpreter is not installed (e.g. `py37: could not find python interpreter matching any of the specs py37`). These count as build failures.\n- Plugins loaded only inside the tox env (e.g. `pytest-asyncio`, `requests_mock`) that change which tests are collected, skipped, or executed.\n- Version-pinned dependencies in `[testenv].deps` or `install_package_deps` that produce different behavior than your interactive venv.\n\n### Verifier-parity rules\n\n- **Do not classify any failing test as \"pre-existing\" or \"out of scope\" for a build-fix task.** If the runner exits non-zero, the build is failing and the task is not done. Investigate the failure and fix it in code or configuration (skip markers, xfail with reason, dependency pin, environment guard, or a real code fix — pick the minimal correct option).\n- **Reproduce with the same interpreter matrix the runner uses.** If `tox -l` lists `py37,py38,py39,py310,py311,py312` and only 3.10\u002F3.11\u002F3.12 are installed on the runner, either install the missing interpreters or narrow `envlist`\u002Fuse `tox --skip-missing-interpreters=true` — whichever matches how the verifier is configured. Read the CI workflow to decide; do not guess.\n- **Do not stop at \"tests collect successfully\".** Collection succeeding is necessary but not sufficient. The runner must exit 0.\n- **Beware of silently-skipped tests.** A test that is skipped in your local venv (e.g. `async def` skipped because `pytest-asyncio` is not installed) will run and can fail under tox where the plugin is declared. Always match the plugin set from `[testenv].deps`.\n\n### Failure-triage order (build-fix tasks)\n\n1. Run the declared runner, capture full output.\n2. For each failing environment, categorize the failure:\n   - **Environment\u002Fconfig**: missing interpreter, missing dependency, wrong pin, wrong build backend. Fix in `tox.ini`, `pyproject.toml`, workflow file, or by installing the interpreter.\n   - **Import-time failure**: optional dependency imported unconditionally. Guard with `try\u002Fexcept ImportError` at the import site, or move the import into the extra's own module and only expose it when installed.\n   - **Real test logic failure**: fix the underlying code (or, if the test itself is wrong and the runner is authoritative, fix the test). Do not merely mask with `@pytest.mark.skip` unless justified in a comment and matched by CI expectations.\n3. After each edit, rerun the declared runner (not bare pytest) and confirm exit 0 across the full env matrix.\n\n### Common concrete patterns\n\n- **Optional import at package `__init__`**: wrap in `try\u002Fexcept ImportError` so the base package imports without the extra, but keep the symbol exported when the extra is installed.\n- **`tox` cannot find `py37`\u002F`py38`\u002F`py39` on modern runners**: either (a) add `skip_missing_interpreters = true` to `[tox]` if the CI job also sets it, (b) trim `envlist` to the interpreters actually available in the CI image, or (c) install the missing interpreters via `actions\u002Fsetup-python` matrix \u002F `uv python install`. Match the CI workflow's real intent.\n- **Timestamp \u002F timing tests that assert `init_timestamp != end_timestamp`**: these fail deterministically when the timestamp helper truncates to millisecond precision and the event constructor + `record()` land in the same millisecond. Fix the helper (higher precision, monotonic sequence, or explicit sleep in `record()`), not the test — the test encodes the real invariant.\n\n## Test Structure\n\n### Atomic unit tests\n\nEach test should verify a single behavior. The test name should tell you what's broken when it fails. Multiple assertions are fine when they all verify the same behavior.\n\n```python\n# Good: Name tells you what's broken\ndef test_user_creation_sets_defaults():\n    user = User(name=\"Alice\")\n    assert user.role == \"member\"\n    assert user.id is not None\n    assert user.created_at is not None\n\n# Bad: If this fails, what behavior is broken?\ndef test_user():\n    user = User(name=\"Alice\")\n    assert user.role == \"member\"\n    user.promote()\n    assert user.role == \"admin\"\n    assert user.can_delete_others()\n```\n\n### Use parameterization for variations of the same concept\n\n```python\nimport pytest\n\n@pytest.mark.parametrize(\"input,expected\", [\n    (\"hello\", \"HELLO\"),\n    (\"World\", \"WORLD\"),\n    (\"\", \"\"),\n    (\"123\", \"123\"),\n])\ndef test_uppercase_conversion(input, expected):\n    assert input.upper() == expected\n```\n\n### Use separate tests for different functionality\n\nDon't parameterize unrelated behaviors. If the test logic differs, write separate tests.\n\n## Project-Specific Rules\n\nThese rules apply when the project you are working on declares them (e.g. via `pyproject.toml`, contribution docs, or fixture setup). They are not universal — read the target project's conventions first.\n\n### `asyncio_mode = \"auto\"`\n\nIf the project sets `asyncio_mode = \"auto\"` globally, write async tests without decorators:\n\n```python\n# Correct (when asyncio_mode = \"auto\")\nasync def test_async_operation():\n    result = await some_async_function()\n    assert result == expected\n\n# Wrong under asyncio_mode = \"auto\"\n@pytest.mark.asyncio\nasync def test_async_operation():\n    ...\n```\n\nIf the project does NOT set auto mode, `pytest-asyncio` requires `@pytest.mark.asyncio` (or install a compatible plugin). An async test with neither is silently skipped by plain pytest — do not mistake that skip for success.\n\n### Imports at module level\n\nPut ALL imports at the top of the file:\n\n```python\n# Correct\nimport pytest\nfrom fastmcp import FastMCP\nfrom fastmcp.client import Client\n\nasync def test_something():\n    mcp = FastMCP(\"test\")\n    ...\n```\n\n### Use in-memory transport for testing (fastmcp-style projects)\n\nPass FastMCP servers directly to clients:\n\n```python\nfrom fastmcp import FastMCP\nfrom fastmcp.client import Client\n\nmcp = FastMCP(\"TestServer\")\n\n@mcp.tool\ndef greet(name: str) -> str:\n    return f\"Hello, {name}!\"\n\nasync def test_greet_tool():\n    async with Client(mcp) as client:\n        result = await client.call_tool(\"greet\", {\"name\": \"World\"})\n        assert result[0].text == \"Hello, World!\"\n```\n\nOnly use HTTP transport when explicitly testing network features.\n\n### Inline snapshots for complex data\n\nUse `inline-snapshot` for testing JSON schemas and complex structures:\n\n```python\nfrom inline_snapshot import snapshot\n\ndef test_schema_generation():\n    schema = generate_schema(MyModel)\n    assert schema == snapshot()  # Will auto-populate on first run\n```\n\nCommands:\n- `pytest --inline-snapshot=create` - populate empty snapshots\n- `pytest --inline-snapshot=fix` - update after intentional changes\n\n## Fixtures\n\n### Prefer function-scoped fixtures\n\n```python\n@pytest.fixture\ndef client():\n    return Client()\n\nasync def test_with_client(client):\n    result = await client.ping()\n    assert result is not None\n```\n\n### Use `tmp_path` for file operations\n\n```python\ndef test_file_writing(tmp_path):\n    file = tmp_path \u002F \"test.txt\"\n    file.write_text(\"content\")\n    assert file.read_text() == \"content\"\n```\n\n## Mocking\n\n### Mock at the boundary\n\n```python\nfrom unittest.mock import patch, AsyncMock\n\nasync def test_external_api_call():\n    with patch(\"mymodule.external_client.fetch\", new_callable=AsyncMock) as mock:\n        mock.return_value = {\"data\": \"test\"}\n        result = await my_function()\n        assert result == {\"data\": \"test\"}\n```\n\n### Don't mock what you own\n\nTest your code with real implementations when possible. Mock external services, not internal classes.\n\n## Test Naming\n\nUse descriptive names that explain the scenario:\n\n```python\n# Good\ndef test_login_fails_with_invalid_password():\ndef test_user_can_update_own_profile():\ndef test_admin_can_delete_any_user():\n\n# Bad\ndef test_login():\ndef test_update():\ndef test_delete():\n```\n\n## Error Testing\n\n```python\nimport pytest\n\ndef test_raises_on_invalid_input():\n    with pytest.raises(ValueError, match=\"must be positive\"):\n        calculate(-1)\n\nasync def test_async_raises():\n    with pytest.raises(ConnectionError):\n        await connect_to_invalid_host()\n```\n\n## Running Tests\n\nPrefer the project's declared runner. Common invocations:\n\n```bash\n# Project uses tox — this is the source of truth for CI\ntox                                # run full envlist\ntox -e py311                       # single env\ntox -l                             # list envs the project declares\ntox --skip-missing-interpreters=true  # if CI also skips missing\n\n# Project uses nox\nnox\nnox -s tests\n\n# Project uses uv\nuv run pytest\nuv sync --all-extras --dev && uv run pytest\n\n# Bare pytest (only when the project has no higher-level runner)\npytest -n auto              # Run all tests in parallel\npytest -n auto -x           # Stop on first failure\npytest path\u002Fto\u002Ftest.py      # Run specific file\npytest -k \"test_name\"       # Run tests matching pattern\npytest -m \"not integration\" # Exclude integration tests\n```\n\nAlways read `.github\u002Fworkflows\u002F*.yml` to confirm the exact command CI runs, and mirror it locally before declaring a build-fix task complete.\n\n## Checklist\n\nBefore submitting tests:\n- [ ] Each test tests one thing\n- [ ] Async decorator matches project's `asyncio_mode` setting\n- [ ] Imports at module level\n- [ ] Descriptive test names\n- [ ] Parameterization for variations of same behavior\n- [ ] Separate tests for different behaviors\n\nBefore declaring a build-fix task done:\n- [ ] Identified the project's real test runner (tox \u002F nox \u002F make \u002F uv \u002F pytest)\n- [ ] Ran that runner and captured the failing envs\n- [ ] Every env in the runner's matrix exits 0 (not just \"pytest passes on my venv\")\n- [ ] No failure was dismissed as \"pre-existing\" or \"out of scope\" without a code-level fix, a justified skip\u002Fxfail, or a config change that matches CI\n- [ ] Missing interpreters in the tox matrix are either installed or excluded in a way consistent with the CI workflow\n","# Writing Effective Python Tests\n\n## Core Principles\n\nEvery test should be **atomic**, **self-contained**, and test **single functionality**. A test that tests multiple things is harder to debug and maintain.\n\n## Reproducing Build \u002F CI Failures (read this first when fixing a failed build)\n\nWhen the task is \"fix the build\" or \"make CI pass\", the definition of success is **the project's own declared runner exits 0**, not `pytest` from an ad-hoc venv. Before editing anything, and again before declaring the task done, reproduce the failure using the same runner the verifier\u002FCI uses.\n\n### Runner discovery checklist\n\nInspect the repo root for the authoritative runner, in this order:\n\n1. `tox.ini` or `[tool.tox]` in `pyproject.toml` → run `tox` (or `tox -e \u003Cenv>`). The `envlist` defines every environment that must pass.\n2. `noxfile.py` → run `nox`.\n3. `Makefile` targets like `test`, `check`, `ci` → run those.\n4. `.github\u002Fworkflows\u002F*.yml` → read the exact command the CI job runs (`run:` steps). Mirror it locally.\n5. `pyproject.toml` `[tool.pytest.ini_options]` or `pytest.ini` → only fall back to bare `pytest` if nothing above exists.\n\nIf you only run bare `pytest` against a hand-picked interpreter, you can miss:\n- Environments in the tox `envlist` whose Python interpreter is not installed (e.g. `py37: could not find python interpreter matching any of the specs py37`). These count as build failures.\n- Plugins loaded only inside the tox env (e.g. `pytest-asyncio`, `requests_mock`) that change which tests are collected, skipped, or executed.\n- Version-pinned dependencies in `[testenv].deps` or `install_package_deps` that produce different behavior than your interactive venv.\n\n### Verifier-parity rules\n\n- **Do not classify any failing test as \"pre-existing\" or \"out of scope\" for a build-fix task.** If the runner exits non-zero, the build is failing and the task is not done. Investigate the failure and fix it in code or configuration (skip markers, xfail with reason, dependency pin, environment guard, or a real code fix — pick the minimal correct option).\n- **Reproduce with the same interpreter matrix the runner uses.** If `tox -l` lists `py37,py38,py39,py310,py311,py312` and only 3.10\u002F3.11\u002F3.12 are installed on the runner, either install the missing interpreters or narrow `envlist`\u002Fuse `tox --skip-missing-interpreters=true` — whichever matches how the verifier is configured. Read the CI workflow to decide; do not guess.\n- **Do not stop at \"tests collect successfully\".** Collection succeeding is necessary but not sufficient. The runner must exit 0.\n- **Beware of silently-skipped tests.** A test that is skipped in your local venv (e.g. `async def` skipped because `pytest-asyncio` is not installed) will run and can fail under tox where the plugin is declared. Always match the plugin set from `[testenv].deps`.\n\n### Failure-triage order (build-fix tasks)\n\n1. Run the declared runner, capture full output.\n2. For each failing environment, categorize the failure:\n   - **Environment\u002Fconfig**: missing interpreter, missing dependency, wrong pin, wrong build backend. Fix in `tox.ini`, `pyproject.toml`, workflow file, or by installing the interpreter.\n   - **Import-time failure**: optional dependency imported unconditionally. Guard with `try\u002Fexcept ImportError` at the import site, or move the import into the extra's own module and only expose it when installed.\n   - **Real test logic failure**: fix the underlying code (or, if the test itself is wrong and the runner is authoritative, fix the test). Do not merely mask with `@pytest.mark.skip` unless justified in a comment and matched by CI expectations.\n3. After each edit, rerun the declared runner (not bare pytest) and confirm exit 0 across the full env matrix.\n\n### Common concrete patterns\n\n- **Optional import at package `__init__`**: wrap in `try\u002Fexcept ImportError` so the base package imports without the extra, but keep the symbol exported when the extra is installed.\n- **`tox` cannot find `py37`\u002F`py38`\u002F`py39` on modern runners**: either (a) add `skip_missing_interpreters = true` to `[tox]` if the CI job also sets it, (b) trim `envlist` to the interpreters actually available in the CI image, or (c) install the missing interpreters via `actions\u002Fsetup-python` matrix \u002F `uv python install`. Match the CI workflow's real intent.\n- **Timestamp \u002F timing tests that assert `init_timestamp != end_timestamp`**: these fail deterministically when the timestamp helper truncates to millisecond precision and the event constructor + `record()` land in the same millisecond. Fix the helper (higher precision, monotonic sequence, or explicit sleep in `record()`), not the test — the test encodes the real invariant.\n\n## Test Structure\n\n### Atomic unit tests\n\nEach test should verify a single behavior. The test name should tell you what's broken when it fails. Multiple assertions are fine when they all verify the same behavior.\n\n```python\n# Good: Name tells you what's broken\ndef test_user_creation_sets_defaults():\n    user = User(name=\"Alice\")\n    assert user.role == \"member\"\n    assert user.id is not None\n    assert user.created_at is not None\n\n# Bad: If this fails, what behavior is broken?\ndef test_user():\n    user = User(name=\"Alice\")\n    assert user.role == \"member\"\n    user.promote()\n    assert user.role == \"admin\"\n    assert user.can_delete_others()\n```\n\n### Use parameterization for variations of the same concept\n\n```python\nimport pytest\n\n@pytest.mark.parametrize(\"input,expected\", [\n    (\"hello\", \"HELLO\"),\n    (\"World\", \"WORLD\"),\n    (\"\", \"\"),\n    (\"123\", \"123\"),\n])\ndef test_uppercase_conversion(input, expected):\n    assert input.upper() == expected\n```\n\n### Use separate tests for different functionality\n\nDon't parameterize unrelated behaviors. If the test logic differs, write separate tests.\n\n## Project-Specific Rules\n\nThese rules apply when the project you are working on declares them (e.g. via `pyproject.toml`, contribution docs, or fixture setup). They are not universal — read the target project's conventions first.\n\n### `asyncio_mode = \"auto\"`\n\nIf the project sets `asyncio_mode = \"auto\"` globally, write async tests without decorators:\n\n```python\n# Correct (when asyncio_mode = \"auto\")\nasync def test_async_operation():\n    result = await some_async_function()\n    assert result == expected\n\n# Wrong under asyncio_mode = \"auto\"\n@pytest.mark.asyncio\nasync def test_async_operation():\n    ...\n```\n\nIf the project does NOT set auto mode, `pytest-asyncio` requires `@pytest.mark.asyncio` (or install a compatible plugin). An async test with neither is silently skipped by plain pytest — do not mistake that skip for success.\n\n### Imports at module level\n\nPut ALL imports at the top of the file:\n\n```python\n# Correct\nimport pytest\nfrom fastmcp import FastMCP\nfrom fastmcp.client import Client\n\nasync def test_something():\n    mcp = FastMCP(\"test\")\n    ...\n```\n\n### Use in-memory transport for testing (fastmcp-style projects)\n\nPass FastMCP servers directly to clients:\n\n```python\nfrom fastmcp import FastMCP\nfrom fastmcp.client import Client\n\nmcp = FastMCP(\"TestServer\")\n\n@mcp.tool\ndef greet(name: str) -> str:\n    return f\"Hello, {name}!\"\n\nasync def test_greet_tool():\n    async with Client(mcp) as client:\n        result = await client.call_tool(\"greet\", {\"name\": \"World\"})\n        assert result[0].text == \"Hello, World!\"\n```\n\nOnly use HTTP transport when explicitly testing network features.\n\n### Inline snapshots for complex data\n\nUse `inline-snapshot` for testing JSON schemas and complex structures:\n\n```python\nfrom inline_snapshot import snapshot\n\ndef test_schema_generation():\n    schema = generate_schema(MyModel)\n    assert schema == snapshot()  # Will auto-populate on first run\n```\n\nCommands:\n- `pytest --inline-snapshot=create` - populate empty snapshots\n- `pytest --inline-snapshot=fix` - update after intentional changes\n\n## Fixtures\n\n### Prefer function-scoped fixtures\n\n```python\n@pytest.fixture\ndef client():\n    return Client()\n\nasync def test_with_client(client):\n    result = await client.ping()\n    assert result is not None\n```\n\n### Use `tmp_path` for file operations\n\n```python\ndef test_file_writing(tmp_path):\n    file = tmp_path \u002F \"test.txt\"\n    file.write_text(\"content\")\n    assert file.read_text() == \"content\"\n```\n\n## Mocking\n\n### Mock at the boundary\n\n```python\nfrom unittest.mock import patch, AsyncMock\n\nasync def test_external_api_call():\n    with patch(\"mymodule.external_client.fetch\", new_callable=AsyncMock) as mock:\n        mock.return_value = {\"data\": \"test\"}\n        result = await my_function()\n        assert result == {\"data\": \"test\"}\n```\n\n### Don't mock what you own\n\nTest your code with real implementations when possible. Mock external services, not internal classes.\n\n## Test Naming\n\nUse descriptive names that explain the scenario:\n\n```python\n# Good\ndef test_login_fails_with_invalid_password():\ndef test_user_can_update_own_profile():\ndef test_admin_can_delete_any_user():\n\n# Bad\ndef test_login():\ndef test_update():\ndef test_delete():\n```\n\n## Error Testing\n\n```python\nimport pytest\n\ndef test_raises_on_invalid_input():\n    with pytest.raises(ValueError, match=\"must be positive\"):\n        calculate(-1)\n\nasync def test_async_raises():\n    with pytest.raises(ConnectionError):\n        await connect_to_invalid_host()\n```\n\n## Running Tests\n\nPrefer the project's declared runner. Common invocations:\n\n```bash\n# Project uses tox — this is the source of truth for CI\ntox                                # run full envlist\ntox -e py311                       # single env\ntox -l                             # list envs the project declares\ntox --skip-missing-interpreters=true  # if CI also skips missing\n\n# Project uses nox\nnox\nnox -s tests\n\n# Project uses uv\nuv run pytest\nuv sync --all-extras --dev && uv run pytest\n\n# Bare pytest (only when the project has no higher-level runner)\npytest -n auto              # Run all tests in parallel\npytest -n auto -x           # Stop on first failure\npytest path\u002Fto\u002Ftest.py      # Run specific file\npytest -k \"test_name\"       # Run tests matching pattern\npytest -m \"not integration\" # Exclude integration tests\n```\n\nAlways read `.github\u002Fworkflows\u002F*.yml` to confirm the exact command CI runs, and mirror it locally before declaring a build-fix task complete.\n\n## Checklist\n\nBefore submitting tests:\n- [ ] Each test tests one thing\n- [ ] Async decorator matches project's `asyncio_mode` setting\n- [ ] Imports at module level\n- [ ] Descriptive test names\n- [ ] Parameterization for variations of same behavior\n- [ ] Separate tests for different behaviors\n\nBefore declaring a build-fix task done:\n- [ ] Identified the project's real test runner (tox \u002F nox \u002F make \u002F uv \u002F pytest)\n- [ ] Ran that runner and captured the failing envs\n- [ ] Every env in the runner's matrix exits 0 (not just \"pytest passes on my venv\")\n- [ ] No failure was dismissed as \"pre-existing\" or \"out of scope\" without a code-level fix, a justified skip\u002Fxfail, or a config change that matches CI\n- [ ] Missing interpreters in the tox matrix are either installed or excluded in a way consistent with the CI workflow\n",{"name":5,"description":7},"main","cdcb6d230f3b15c3c33f8a2bdd16439f43602cbe","evaluation\u002Fresults\u002FSkillAxe-Opus47-Gold15-20260921\u002Ftasks\u002Ffix-build-agentops\u002Frepaired_run\u002Finputs\u002Fskills\u002Ftesting-python",1,"https:\u002F\u002Fgithub.com\u002Flinyouxue\u002Fskill-repair-benchmark","https:\u002F\u002Fgithub.com\u002Flinyouxue","2026-11-14 20:28:35",{"source":8,"skillName":5,"commands":32,"prompt":42,"zipAvailable":43},[33,36,39],{"tool":34,"command":35},"npx","npx skills add linyouxue\u002Fskill-repair-benchmark --skill testing-python",{"tool":37,"command":38},"bunx","bunx skills add linyouxue\u002Fskill-repair-benchmark --skill testing-python",{"tool":40,"command":41},"pnpm","pnpm dlx skills add linyouxue\u002Fskill-repair-benchmark --skill testing-python","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Flinyouxue\u002Fskill-repair-benchmark\u002Fblob\u002Fmain\u002Fevaluation\u002Fresults\u002FSkillAxe-Opus47-Gold15-20260921\u002Ftasks\u002Ffix-build-agentops\u002Frepaired_run\u002Finputs\u002Fskills\u002Ftesting-python\u002FSKILL.md",true,[],[46,53,60,67,72,77],{"skillNo":47,"name":48,"nameZh":6,"description":49,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":50,"categories":51,"keywords":52,"publishedAt":19},"01M7E1HGVRY73NBJ022CJG13X6","video-frame-extraction","Extract frames from video files and save them as images using OpenCV","https:\u002F\u002Fgithub.com\u002Flinyouxue\u002Fskill-repair-benchmark\u002Fblob\u002Fmain\u002Fjpg-ocr-stat\u002Fresult\u002Fskilltta-claude4.7\u002Fgroup_03\u002Frun_03\u002Finputs\u002Fskills\u002Fvideo-frame-extraction\u002FSKILL.md",[],[],{"skillNo":54,"name":55,"nameZh":6,"description":56,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":57,"categories":58,"keywords":59,"publishedAt":19},"01M7E1HAG5R7CJ9C8NYJS771MB","openai-vision","Analyze images and multi-frame sequences using OpenAI GPT vision models","https:\u002F\u002Fgithub.com\u002Flinyouxue\u002Fskill-repair-benchmark\u002Fblob\u002Fmain\u002Fjpg-ocr-stat\u002Fresult\u002Fskilltta-claude4.7\u002Fgroup_03\u002Frun_03\u002Finputs\u002Fskills\u002Fopenai-vision\u002FSKILL.md",[],[],{"skillNo":61,"name":62,"nameZh":6,"description":63,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":64,"categories":65,"keywords":66,"publishedAt":19},"01M7E1H7DADKB6QBWKC2KQ63SZ","image-ocr","Extract text content from images using Tesseract OCR via Python, including structured field extraction from receipts and forms","https:\u002F\u002Fgithub.com\u002Flinyouxue\u002Fskill-repair-benchmark\u002Fblob\u002Fmain\u002Fjpg-ocr-stat\u002Fresult\u002Fskilltta-claude4.7\u002Fgroup_03\u002Frun_03\u002Finputs\u002Fskills\u002Fimage-ocr\u002FSKILL.md",[],[],{"skillNo":68,"name":48,"nameZh":6,"description":49,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":69,"categories":70,"keywords":71,"publishedAt":19},"01M7E1H0WBNT43TENGQY7AVZHD","https:\u002F\u002Fgithub.com\u002Flinyouxue\u002Fskill-repair-benchmark\u002Fblob\u002Fmain\u002Fjpg-ocr-stat\u002Fresult\u002Fskilltta-claude4.7\u002Fgroup_03\u002Frun_02\u002Finputs\u002Fskills\u002Fvideo-frame-extraction\u002FSKILL.md",[],[],{"skillNo":73,"name":55,"nameZh":6,"description":56,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":74,"categories":75,"keywords":76,"publishedAt":19},"01M7E1GTC7D4N4Q2EF03875J9E","https:\u002F\u002Fgithub.com\u002Flinyouxue\u002Fskill-repair-benchmark\u002Fblob\u002Fmain\u002Fjpg-ocr-stat\u002Fresult\u002Fskilltta-claude4.7\u002Fgroup_03\u002Frun_02\u002Finputs\u002Fskills\u002Fopenai-vision\u002FSKILL.md",[],[],{"skillNo":78,"name":62,"nameZh":6,"description":63,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":79,"categories":80,"keywords":81,"publishedAt":19},"01M7E1GQ92CWFMGH53KSSE4WER","https:\u002F\u002Fgithub.com\u002Flinyouxue\u002Fskill-repair-benchmark\u002Fblob\u002Fmain\u002Fjpg-ocr-stat\u002Fresult\u002Fskilltta-claude4.7\u002Fgroup_03\u002Frun_02\u002Finputs\u002Fskills\u002Fimage-ocr\u002FSKILL.md",[],[]]