[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6BZP0175YZ7YWH7TVDFMH3B":3,"skill-same:01M6BZP0175YZ7YWH7TVDFMH3B":73},{"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":22,"linkOnly":23,"markdownContent":24,"markdownBody":25,"frontMatter":26,"refName":27,"commitSha":28,"skillDirectory":29,"forksCount":30,"repositoryHtmlUrl":31,"repositoryHomepageUrl":32,"ownerHtmlUrl":33,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":34,"install":35,"resources":48},"01M6BZP0175YZ7YWH7TVDFMH3B","pytest.fix_local_tests",null,"Analyze and fix failure of local tests","causify-ai\u002Fhelpers","causify-ai","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F121828442?v=4","01M6BZFTHW2MQR7FWK8CDW0DRA","Causify.AI","01M6BZFTPJ193AB5N089Z82HQG",155,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Fcausify-ai\u002Fhelpers\u002Fblob\u002Fmaster\u002F.claude\u002Fskills\u002Fpytest.fix_local_tests\u002FSKILL.md",[],[19,20,21],"pytest fix local tests","analyze","haiku","2026-11-10 10:12:30",false,"---\ndescription: Analyze and fix failure of local tests\nmodel: haiku\n---\n\n# Goal\n- Given information about failed tests `\u003CFAILURE_INFO>` run the tests, understand what\n  is the root cause, and fix them\n\n# Workflow\n\n## Run Tests\n- The input `\u003CFAILURE_INFO>` can be:\n  - A failing test in pytest\n    - E.g., `dev_scripts_helpers\u002Fdocumentation\u002Ftest\u002Ftest_notes_to_pdf.py`\n  - A repro generated by `pytest_failed_multi_build.py`\n    - E.g., `tmp.pytest_failed_multi_build.repro.sh`\n\n- Gather information about the failing tests by:\n  - Reading the code\n  - Inspecting the content of `\u003CFAILURE_INFO>`\n  - Running the tests locally, if needed\n    - E.g.,\n      ```bash\n      > pytest_log `\u003CFAILURE_INFO>`\n      > tmp.pytest_failed_multi_build.repro.sh\n      ```\n\n## Analyze Failures\n- Read `.claude\u002Fskills\u002Fpytest.rules.md` about how to diagnose issues\n\n- Collect the failing tests from the run\n  ```bash\n  > i pytest_failed\n  ...\n  Failed tests: 25\u002F7\n  dev_scripts_helpers\u002Fdocumentation\u002Ftest\u002Ftest_notes_to_pdf.py::Test_notes_to_pdf_actions::test1\n  dev_scripts_helpers\u002Fdocumentation\u002Ftest\u002Ftest_notes_to_pdf.py::Test_notes_to_pdf_actions::test2\n  dev_scripts_helpers\u002Fdocumentation\u002Ftest\u002Ftest_notes_to_pdf.py::Test_notes_to_pdf_edge_cases::test1\n  dev_scripts_helpers\u002Fdocumentation\u002Ftest\u002Ftest_notes_to_pdf.py::Test_notes_to_pdf_edge_cases::test2\n  dev_scripts_helpers\u002Fdocumentation\u002Ftest\u002Ftest_notes_to_pdf.py::Test_notes_to_pdf_edge_cases::test3\n  dev_scripts_helpers\u002Fdocumentation\u002Ftest\u002Ftest_notes_to_pdf.py::Test_notes_to_pdf_edge_cases::test4\n  dev_scripts_helpers\u002Fdocumentation\u002Ftest\u002Ftest_notes_to_pdf.py::Test_notes_to_pdf_filters::test1\n  dev_scripts_helpers\u002Fdocumentation\u002Ftest\u002Ftest_notes_to_pdf.py::Test_notes_to_pdf_filters::test2\n  dev_scripts_helpers\u002Fdocumentation\u002Ftest\u002Ftest_notes_to_pdf.py::Test_notes_to_pdf_filters::test3\n  dev_scripts_helpers\u002Fdocumentation\u002Ftest\u002Ftest_notes_to_pdf.py::Test_notes_to_pdf_filters::test4\n  dev_scripts_helpers\u002Fdocumentation\u002Ftest\u002Ftest_notes_to_pdf.py::Test_notes_to_pdf_filters::test5\n  ...\n  13:07:36 - WARN  lib_tasks_pytest.py pytest_failed:1745                 To run the failed tests run: tmp.pytest_failed.sh\n  ...\n  ```\n\n- For the tests that involve running Docker \u002F Apple containers run the same tests\n  with different builds, as per `## Analyze the Effect of Container Builds`\n  in `.claude\u002Fskills\u002Fpytest.rules.md`\n\n- Carefully consider if the root cause and the solution is the same for all the 3\n  builds\n\n## Prepare A Plan to Fix Failures\n- Prepare a plan following `# Format for Unit Test Fixing Plan` from\n  `.claude\u002Fskills\u002Fpytest.rules.md`\n- Save it in the file `plan-pytest.fix_local_tests.md` in the current dir\n- Do not print anything on screen\n\n## Implement and Verify the Fix\n- If the root cause and the fix are clear, implement the fixes directly\n- If the root cause or the correct fix is unclear, stop and ask the user before\n  implementing anything\n- Verify that the fixes work correctly as per `# Verification of the Fix` from\n  `.claude\u002Fskills\u002Fpytest.rules.md`\n\n# Verification\n\n- [ ] `plan-pytest.fix_local_tests.md` lists a fix for every failing test\n- [ ] Every fix follows `# Verification of the Fix` in\n      `.claude\u002Fskills\u002Fpytest.rules.md`\n- [ ] The failing tests pass locally after the fix\n","# Goal\n- Given information about failed tests `\u003CFAILURE_INFO>` run the tests, understand what\n  is the root cause, and fix them\n\n# Workflow\n\n## Run Tests\n- The input `\u003CFAILURE_INFO>` can be:\n  - A failing test in pytest\n    - E.g., `dev_scripts_helpers\u002Fdocumentation\u002Ftest\u002Ftest_notes_to_pdf.py`\n  - A repro generated by `pytest_failed_multi_build.py`\n    - E.g., `tmp.pytest_failed_multi_build.repro.sh`\n\n- Gather information about the failing tests by:\n  - Reading the code\n  - Inspecting the content of `\u003CFAILURE_INFO>`\n  - Running the tests locally, if needed\n    - E.g.,\n      ```bash\n      > pytest_log `\u003CFAILURE_INFO>`\n      > tmp.pytest_failed_multi_build.repro.sh\n      ```\n\n## Analyze Failures\n- Read `.claude\u002Fskills\u002Fpytest.rules.md` about how to diagnose issues\n\n- Collect the failing tests from the run\n  ```bash\n  > i pytest_failed\n  ...\n  Failed tests: 25\u002F7\n  dev_scripts_helpers\u002Fdocumentation\u002Ftest\u002Ftest_notes_to_pdf.py::Test_notes_to_pdf_actions::test1\n  dev_scripts_helpers\u002Fdocumentation\u002Ftest\u002Ftest_notes_to_pdf.py::Test_notes_to_pdf_actions::test2\n  dev_scripts_helpers\u002Fdocumentation\u002Ftest\u002Ftest_notes_to_pdf.py::Test_notes_to_pdf_edge_cases::test1\n  dev_scripts_helpers\u002Fdocumentation\u002Ftest\u002Ftest_notes_to_pdf.py::Test_notes_to_pdf_edge_cases::test2\n  dev_scripts_helpers\u002Fdocumentation\u002Ftest\u002Ftest_notes_to_pdf.py::Test_notes_to_pdf_edge_cases::test3\n  dev_scripts_helpers\u002Fdocumentation\u002Ftest\u002Ftest_notes_to_pdf.py::Test_notes_to_pdf_edge_cases::test4\n  dev_scripts_helpers\u002Fdocumentation\u002Ftest\u002Ftest_notes_to_pdf.py::Test_notes_to_pdf_filters::test1\n  dev_scripts_helpers\u002Fdocumentation\u002Ftest\u002Ftest_notes_to_pdf.py::Test_notes_to_pdf_filters::test2\n  dev_scripts_helpers\u002Fdocumentation\u002Ftest\u002Ftest_notes_to_pdf.py::Test_notes_to_pdf_filters::test3\n  dev_scripts_helpers\u002Fdocumentation\u002Ftest\u002Ftest_notes_to_pdf.py::Test_notes_to_pdf_filters::test4\n  dev_scripts_helpers\u002Fdocumentation\u002Ftest\u002Ftest_notes_to_pdf.py::Test_notes_to_pdf_filters::test5\n  ...\n  13:07:36 - WARN  lib_tasks_pytest.py pytest_failed:1745                 To run the failed tests run: tmp.pytest_failed.sh\n  ...\n  ```\n\n- For the tests that involve running Docker \u002F Apple containers run the same tests\n  with different builds, as per `## Analyze the Effect of Container Builds`\n  in `.claude\u002Fskills\u002Fpytest.rules.md`\n\n- Carefully consider if the root cause and the solution is the same for all the 3\n  builds\n\n## Prepare A Plan to Fix Failures\n- Prepare a plan following `# Format for Unit Test Fixing Plan` from\n  `.claude\u002Fskills\u002Fpytest.rules.md`\n- Save it in the file `plan-pytest.fix_local_tests.md` in the current dir\n- Do not print anything on screen\n\n## Implement and Verify the Fix\n- If the root cause and the fix are clear, implement the fixes directly\n- If the root cause or the correct fix is unclear, stop and ask the user before\n  implementing anything\n- Verify that the fixes work correctly as per `# Verification of the Fix` from\n  `.claude\u002Fskills\u002Fpytest.rules.md`\n\n# Verification\n\n- [ ] `plan-pytest.fix_local_tests.md` lists a fix for every failing test\n- [ ] Every fix follows `# Verification of the Fix` in\n      `.claude\u002Fskills\u002Fpytest.rules.md`\n- [ ] The failing tests pass locally after the fix\n",{"model":21,"description":7},"master","39143a859859181eff7e774457997b5278fd9e99",".claude\u002Fskills\u002Fpytest.fix_local_tests",170,"https:\u002F\u002Fgithub.com\u002Fcausify-ai\u002Fhelpers","https:\u002F\u002Fcausify.ai","https:\u002F\u002Fgithub.com\u002Fcausify-ai","2026-11-02 02:09:15",{"source":8,"skillName":5,"commands":36,"prompt":46,"zipAvailable":47},[37,40,43],{"tool":38,"command":39},"npx","npx skills add causify-ai\u002Fhelpers --skill pytest.fix_local_tests",{"tool":41,"command":42},"bunx","bunx skills add causify-ai\u002Fhelpers --skill pytest.fix_local_tests",{"tool":44,"command":45},"pnpm","pnpm dlx skills add causify-ai\u002Fhelpers --skill pytest.fix_local_tests","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fcausify-ai\u002Fhelpers\u002Fblob\u002Fmaster\u002F.claude\u002Fskills\u002Fpytest.fix_local_tests\u002FSKILL.md",true,[49,55,59,63,69],{"path":50,"resourceType":51,"resourceTypeDesc":52,"sizeBytes":53,"sourceHtmlUrl":54},"questions-academic.md","REFERENCE","参考文档",8114,"https:\u002F\u002Fgithub.com\u002Fyodem\u002Facademic-writer\u002Fblob\u002Fmain\u002Fsrc\u002Fskills\u002Fvoice\u002Fquestions-academic.md",{"path":56,"resourceType":51,"resourceTypeDesc":52,"sizeBytes":57,"sourceHtmlUrl":58},"references\u002Fcheckpoint-schema.md",7472,"https:\u002F\u002Fgithub.com\u002Fyodem\u002Facademic-writer\u002Fblob\u002Fmain\u002Fsrc\u002Fskills\u002Fvoice\u002Freferences\u002Fcheckpoint-schema.md",{"path":60,"resourceType":51,"resourceTypeDesc":52,"sizeBytes":61,"sourceHtmlUrl":62},"references\u002Fstub-definition.md",3697,"https:\u002F\u002Fgithub.com\u002Fyodem\u002Facademic-writer\u002Fblob\u002Fmain\u002Fsrc\u002Fskills\u002Fvoice\u002Freferences\u002Fstub-definition.md",{"path":64,"resourceType":65,"resourceTypeDesc":66,"sizeBytes":67,"sourceHtmlUrl":68},"voice-migrate.sh","SCRIPT","脚本",6662,"https:\u002F\u002Fgithub.com\u002Fyodem\u002Facademic-writer\u002Fblob\u002Fmain\u002Fsrc\u002Fskills\u002Fvoice\u002Fvoice-migrate.sh",{"path":70,"resourceType":65,"resourceTypeDesc":66,"sizeBytes":71,"sourceHtmlUrl":72},"voice-sync.sh",963,"https:\u002F\u002Fgithub.com\u002Fyodem\u002Facademic-writer\u002Fblob\u002Fmain\u002Fsrc\u002Fskills\u002Fvoice\u002Fvoice-sync.sh",[74,92,109,120,129,138],{"skillNo":75,"name":76,"nameZh":6,"description":77,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":78,"categories":79,"keywords":85,"publishedAt":22},"01M6C9ZMM0XSXCHHABMJ9XB1JB","tutorial_in_60_mins.propagate_docker_changes","Sync tutorial and class-project Docker files to match project_template","https:\u002F\u002Fgithub.com\u002Fcausify-ai\u002Fhelpers\u002Fblob\u002Fmaster\u002F.claude\u002Fskills\u002Ftutorial_in_60_mins.propagate_docker_changes\u002FSKILL.md",[80],{"categoryNo":81,"categoryName":82,"taxonomyType":83,"taxonomyTypeDesc":84},"01JBSEEDCAT000000000000011","运维与部署","SCENARIO","使用场景",[86,87,88,89,21,90,91],"tutorial in 60 mins propagate docker changes","tutorial","docker","files","template","sync",{"skillNo":93,"name":94,"nameZh":6,"description":95,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":96,"categories":97,"keywords":101,"publishedAt":22},"01M6C9ZJK8QJ9FNCY39WVF3GMG","tutorial_in_60_mins.merge_markdown","Merge the content of a markdown file into a Jupyter notebook","https:\u002F\u002Fgithub.com\u002Fcausify-ai\u002Fhelpers\u002Fblob\u002Fmaster\u002F.claude\u002Fskills\u002Ftutorial_in_60_mins.merge_markdown\u002FSKILL.md",[98],{"categoryNo":99,"categoryName":100,"taxonomyType":83,"taxonomyTypeDesc":84},"01JBSEEDCAT000000000000002","文档处理",[102,103,87,104,105,21,106,107,108],"merge","tutorial in 60 mins merge markdown","markdown","jupyter","file","content","jupyter notebook",{"skillNo":110,"name":111,"nameZh":6,"description":112,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":113,"categories":114,"keywords":115,"publishedAt":22},"01M6C9ZFYK13ZCT1E8BEEC4NG4","tutorial_in_60_mins.format","Format a directory to follow the \"Learn X in 60 Minutes\" tutorial conventions","https:\u002F\u002Fgithub.com\u002Fcausify-ai\u002Fhelpers\u002Fblob\u002Fmaster\u002F.claude\u002Fskills\u002Ftutorial_in_60_mins.format\u002FSKILL.md",[],[116,87,117,118,119,21],"tutorial in 60 mins format","format","directory","learn",{"skillNo":121,"name":122,"nameZh":6,"description":123,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":124,"categories":125,"keywords":126,"publishedAt":22},"01M6C9ZDKXSBKNKX7M3X4W38G5","tutorial_in_60_mins.create","Create a tutorial directory for the Learn X in 60 Minutes conventions","https:\u002F\u002Fgithub.com\u002Fcausify-ai\u002Fhelpers\u002Fblob\u002Fmaster\u002F.claude\u002Fskills\u002Ftutorial_in_60_mins.create\u002FSKILL.md",[],[127,87,128,118,119],"tutorial in 60 mins create","create",{"skillNo":130,"name":131,"nameZh":6,"description":132,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":133,"categories":134,"keywords":135,"publishedAt":22},"01M6BZS5Z0QE03WRS1TM3XJEY9","todo.reorg_in_progress","Reorganize ai_task_queue.md so in-progress tasks, not-started tasks, and mislabeled topic headers sit under the right H1 stage","https:\u002F\u002Fgithub.com\u002Fcausify-ai\u002Fhelpers\u002Fblob\u002Fmaster\u002F.claude\u002Fskills\u002Ftodo.reorg_in_progress\u002FSKILL.md",[],[136,137],"todo reorg in progress","tasks",{"skillNo":139,"name":140,"nameZh":6,"description":141,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":142,"categories":143,"keywords":144,"publishedAt":22},"01M6BZS4CQZ6KK2KQ26SVB7QCS","todo.reorg_headers","Reorganize ai_task_queue.md .md so every H2 topic matches ALL TOPICS and every H3 task sits under the right topic, keeping its H1 stage","https:\u002F\u002Fgithub.com\u002Fcausify-ai\u002Fhelpers\u002Fblob\u002Fmaster\u002F.claude\u002Fskills\u002Ftodo.reorg_headers\u002FSKILL.md",[],[145],"todo reorg headers"]