[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71CF8S3MDCGP2RK81HNGECX":3,"skill-same:01M71CF8S3MDCGP2RK81HNGECX":320},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":22,"publishedAt":43,"linkOnly":44,"markdownContent":45,"markdownBody":46,"frontMatter":47,"refName":67,"commitSha":68,"skillDirectory":69,"forksCount":70,"repositoryHtmlUrl":71,"repositoryHomepageUrl":6,"ownerHtmlUrl":72,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":73,"install":74,"resources":86},"01M71CF8S3MDCGP2RK81HNGECX","best-practices-python",null,"Repo-specific Python best practices for agentic coding: Loguru + Typer + uv + pyproject.toml, httpx over requests, functions-first, module docstrings, max 800 LOC per file, and non-mocked sanity tests.","cateyephotos\u002Fagent-skills","cateyephotos","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F110843613?v=4","01M71CCSDD8VJ7CZ4V1QQGBMA7","01M71CCSE1VRT329KB810CRC0V",0,"MIT","https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-python\u002FSKILL.md",[17],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000007","代码审查","SCENARIO","使用场景",[23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42],"python","best practices","best practices python","agentic coding","toml","python conventions","repo","for","httpx","pyproject.toml","python best practices","coding","max","python code","sanity","review","code","agentic","uv","code review","2026-11-10 10:12:30",false,"---\nname: best-practices-python\ndescription: >\n  Repo-specific Python best practices for agentic coding: Loguru + Typer + uv + pyproject.toml,\n  httpx over requests, functions-first, module docstrings, max 800 LOC per file, and non-mocked sanity tests.\ntriggers:\n  - best practices python\n  - python conventions\n  - loguru\n  - typer\n  - httpx\n  - python code review\nlicense: MIT\nmetadata:\n  language: python\n  python_versions: [\"3.11+\", \"3.12+\"]\n  defaults:\n    logging: loguru\n    cli: typer\n    http: httpx\n    packaging: uv + pyproject.toml\n    style:\n      max_lines_per_file: 800\n      module_docstring: required\n      functions_over_classes: true\n    testing:\n      include_sanity_tests: true\n\nprovides:\n  - best-practices-python\ncomposes:\n  - task-monitor\n---\n\n# Python Best Practices (Project Skill)\n\nThis skill is a curated set of atomic rules for writing and refactoring Python in *this* repo.\n\n## Project Defaults (apply unless explicitly overridden)\n\n- **Logging:** Loguru (`from loguru import logger`)\n- **CLI:** Typer (thin CLI; logic in functions)\n- **HTTP:** httpx (not requests)\n- **Packaging:** uv + pyproject.toml\n- **Structure:** functions over classes unless state is required\n- **Files:** no Python file over **800** lines\n- **Docs:** every module begins with a **clear module docstring** describing purpose, inputs, outputs, and failure modes\n- **Tests:** include **non-mocked sanity tests** in addition to unit tests\n\n## Package Reference\n\nSee **[PACKAGES.md](docs\u002FPACKAGES.md)** for the full Python package reference — mandatory standards, standard toolkit (80+ packages across 15 categories), and anti-patterns. Generated from 1,414 pyproject.toml files. Also available via `\u002Fmemory recall \"python packages\"`.\n\n## When to Apply\n\nUse this skill whenever you:\n- create or refactor Python modules, CLIs, services, or pipelines\n- add network calls, subprocess calls, or IO\n- change packaging\u002Ftooling (uv, pyproject)\n- add tests or fix bugs\u002Fflakiness\n\n## Categories (priority order)\n\n1. Correctness (CRITICAL\u002FHIGH): `correctness-`\n2. Security (CRITICAL\u002FHIGH): `security-`\n3. Conventions (HIGH): `conventions-`\n4. Testing & Sanity (HIGH\u002FMEDIUM): `testing-`\n5. Async & Concurrency (HIGH\u002FMEDIUM): `async-`\n6. Performance (MEDIUM): `perf-`\n7. Packaging (MEDIUM): `packaging-`\n8. Logging & Observability (MEDIUM): `logging-`\n9. Style & Maintainability (MEDIUM\u002FLOW): `style-`\n\n## Quick Reference (house rules)\n\n- `style-max-800-lines`\n- `style-module-docstring`\n- `style-thin-init-py`\n- `conventions-loguru`\n- `conventions-typer-cli`\n- `conventions-httpx`\n- `conventions-uv-pyproject`\n- `conventions-functions-over-classes`\n- `conventions-pyproject-deps-complete`\n- `testing-non-mocked-sanity`\n\n## Thin `__init__.py` in Packages (NON-NEGOTIABLE)\n\n**`__init__.py` files must contain only re-exports and package metadata — never business logic.**\n\n### Rule: `style-thin-init-py`\n\nWhen logic is hidden in `__init__.py`, agents (and humans) searching for `module_name.py` won't find it. This causes misdiagnosis — an agent sees `from probes import run_probes`, looks for `probes.py`, doesn't find it, and concludes the module is missing. The logic is actually in `probes\u002F__init__.py` but invisible to file-based search.\n\n**Correct pattern:**\n```\nmypackage\u002F\n  __init__.py          # Only re-exports: from .registry import run_probes, ProbeResult\n  registry.py          # Actual logic lives here (discoverable by name)\n  tier0.py\n  tier1.py\n```\n\n**Anti-pattern:**\n```\nmypackage\u002F\n  __init__.py          # 120 lines of logic, registries, runner functions\n  tier0.py\n  tier1.py\n```\n\n### What belongs in `__init__.py`:\n- `__all__` list\n- Re-exports: `from .submodule import ClassName`\n- Package-level constants (version, etc.)\n- Max ~20 lines\n\n### What does NOT belong:\n- Functions with business logic\n- Class definitions with methods\n- Registry patterns (register\u002Flookup)\n- Anything an agent would look for by name\n\n**Incident**: On 2026-03-16, an agent misdiagnosed `monitor-taxonomy` as broken (\"missing probes.py glue module\") because `run_probes()` lived in `probes\u002F__init__.py` (122 lines) instead of a named module. The code worked fine — but was invisible to agents doing file-based search.\n\n---\n\n## pyproject.toml Dependency Completeness (NON-NEGOTIABLE)\n\n**Every `import` in a skill's `.py` files MUST have a corresponding entry in `pyproject.toml` `[project.dependencies]`.**\n\nThis is a hard gate. Missing dependencies cause `ModuleNotFoundError` at runtime after `uv sync` in a clean venv — a silent regression that only surfaces when the skill is invoked by another agent or in CI.\n\n### Rule: `conventions-pyproject-deps-complete`\n\nWhen creating or modifying a Python skill with a `pyproject.toml`:\n\n1. **Scan all `.py` files** in the skill for `import` and `from X import` statements\n2. **Cross-reference** each top-level import against `[project.dependencies]`\n3. **Add any missing** third-party packages to dependencies\n4. **Run `uv sync`** after adding to verify resolution\n\n### Common offenders (imports that look stdlib but aren't)\n\n| Import | Package needed in pyproject.toml |\n|--------|----------------------------------|\n| `from loguru import logger` | `loguru>=0.7.0` |\n| `import typer` | `typer>=0.9.0` |\n| `import httpx` | `httpx>=0.24.0` |\n| `from rich import ...` | `rich>=13.0.0` |\n| `import pydantic` | `pydantic>=2.0` |\n| `from dotenv import ...` | `python-dotenv>=1.0.0` |\n| `import pytz` | `pytz` |\n| `import tenacity` | `tenacity>=8.0` |\n\n### Verification pattern\n\n```bash\n# After any pyproject.toml change:\ncd \u002Fpath\u002Fto\u002Fskill && uv sync && uv run python -c \"import \u003Cevery_module>\"\n```\n\n### Why this matters\n\nThe ops-chutes skill broke (Feb 2026) because `loguru` was imported by 3 files but\nmissing from `pyproject.toml`. After `uv sync` recreated the venv, `loguru` vanished\nand every downstream skill that called ops-chutes got `ModuleNotFoundError`. This was\na silent regression — the skill worked in the shared system venv but failed in isolation.\n\n---\n\n## uv Isolation in run.sh (NON-NEGOTIABLE)\n\n**If a skill has `pyproject.toml`, ALL Python invocations in `run.sh` MUST use `uv run --project \"$SCRIPT_DIR\" python` — never bare `python3`.**\n\n### Rule: `conventions-uv-run-in-runsh`\n\nBare `python3` uses the system Python, which picks up stale packages from `~\u002F.local\u002Flib\u002Fpython3.12\u002Fsite-packages\u002F`. The skill's `.venv` (managed by `uv sync`) has the correct pinned versions. Using bare `python3` bypasses it entirely.\n\n**The `alias python3='uv run ...'` pattern is acceptable** IF `shopt -s expand_aliases` is set at the top of `run.sh`. But aliases do NOT expand inside `nohup`, `env`, `xargs`, or `$()` — those contexts MUST use explicit `uv run --project`.\n\n**Incident**: 2026-03-17 — `\u002Forchestrate` failed with anyio version mismatch because `run.sh` called bare `python3 structured_execute.py`. System python3 had anyio 3.x from `~\u002F.local\u002F`, but httpx 0.28+ requires anyio 4.x which was only in the skill's `.venv`.\n\n### Correct:\n```bash\nuv run --project \"$SCRIPT_DIR\" python \"$SCRIPT_DIR\u002Fstructured_execute.py\" run plan.yaml\n```\n\n### Wrong:\n```bash\npython3 \"$SCRIPT_DIR\u002Fstructured_execute.py\" run plan.yaml  # system python, wrong deps\nnohup python3 \"$SCRIPT_DIR\u002Fworker.py\" &                    # alias doesn't expand in nohup\n```\n\n## Common Mistakes\n\n### WRONG: Using `import logging` instead of loguru\n```python\nimport logging\nlogger = logging.getLogger(__name__)\n```\n\n### RIGHT: Always use loguru\n```python\nfrom loguru import logger\n```\n\n### WRONG: Using `import requests` for HTTP calls\n```python\nimport requests\nresp = requests.get(\"https:\u002F\u002Fapi.example.com\")\n```\n\n### RIGHT: Use httpx\n```python\nimport httpx\nresp = httpx.get(\"https:\u002F\u002Fapi.example.com\")\n```\n\n### WRONG: Using bare `python3` in run.sh when pyproject.toml exists\n```bash\npython3 \"$SCRIPT_DIR\u002Fmain.py\"\n```\n\n### RIGHT: Use uv run for proper dependency isolation\n```bash\nuv run --project \"$SCRIPT_DIR\" python \"$SCRIPT_DIR\u002Fmain.py\"\n```\n\n### WRONG: Missing dependency in pyproject.toml that the code imports\n```python\nfrom loguru import logger  # imported but not in pyproject.toml dependencies\n```\n\n### RIGHT: Every import has a matching pyproject.toml entry\n```toml\n[project]\ndependencies = [\"loguru>=0.7.0\"]\n```\n\n---\n\n## Docker Skills Must Have docker-compose.yml\n\n**If a skill launches a persistent Docker container (`docker run -d`), it MUST have a `docker-compose.yml`.**\n\n### Rule: `conventions-docker-compose`\n\nContainer specs buried in `docker run` flags across 10+ lines of shell are:\n- Unreadable by agents (who has to grep run.sh to understand the container config)\n- Error-prone (one missing flag = broken container)\n- Non-declarative (can't diff container changes across commits)\n\nThe compose file is the canonical spec. `run.sh` handles dynamic lifecycle (port allocation, multi-instance, health checks) on top of it.\n\n### Enforced by: `\u002Fskills-ci` scanner `runtime.docker_no_compose`\n\n---\n\n## No Silent Fallbacks in Exception Handlers (NON-NEGOTIABLE)\n\n**Every `except` block MUST log at `logger.error`, NOT `logger.debug`.** `logger.debug` is invisible in production — failures silently disappear.\n\n### Rule: `correctness-no-silent-fallback`\n\n```python\n# WRONG — silent in production, hides failures\nexcept Exception as exc:\n    logger.debug(\"search failed: {}\", exc)\n    return []\n\n# WRONG — bare except with no logging at all\nexcept Exception:\n    pass\n\n# RIGHT — visible in production logs\nexcept Exception as exc:\n    logger.error(\"search failed: {}\", exc)\n    return []\n```\n\n**Exceptions:**\n- `dotenv` imports at module top (line 1-10) — genuinely optional\n- Optional dependency imports (`sentence_transformers`, `torch`) — log at WARNING\n- Health check retry loops — `continue` is acceptable\n\n**Everything else MUST use `logger.error`.** This includes:\n- ArangoDB queries, view searches, collection operations\n- Embedding service calls\n- Entity extraction, taxonomy lookups\n- Graph traversal, relationship scoring\n- Edge creation, document upserts\n\nCross-ref: `\u002Fbest-practices-arangodb` rule `arango-no-silent-fallback`.\n\nEnforced by: `\u002Fmonitor-codebase` scanner and `\u002Fcodex` review gate.\n\n---\n\n## No sync subprocess in async code\n\n**If a Python file uses `asyncio`, it MUST NOT import `subprocess` or call `subprocess.run()`.** Use `asyncio.create_subprocess_exec()` or `asyncio.create_subprocess_shell()` instead.\n\n### Rule: `async-no-sync-subprocess`\n\nSync `subprocess.run()` blocks the entire event loop. In an async executor, this freezes ALL concurrent tasks — cancel signals, watchdog polling, other lanes — until the subprocess finishes.\n\n### Correct:\n```python\nproc = await asyncio.create_subprocess_shell(cmd, stdout=asyncio.subprocess.PIPE)\nstdout, stderr = await proc.communicate()\n```\n\n### Wrong:\n```python\nresult = subprocess.run(cmd, capture_output=True)  # blocks event loop\n```\n","# Python Best Practices (Project Skill)\n\nThis skill is a curated set of atomic rules for writing and refactoring Python in *this* repo.\n\n## Project Defaults (apply unless explicitly overridden)\n\n- **Logging:** Loguru (`from loguru import logger`)\n- **CLI:** Typer (thin CLI; logic in functions)\n- **HTTP:** httpx (not requests)\n- **Packaging:** uv + pyproject.toml\n- **Structure:** functions over classes unless state is required\n- **Files:** no Python file over **800** lines\n- **Docs:** every module begins with a **clear module docstring** describing purpose, inputs, outputs, and failure modes\n- **Tests:** include **non-mocked sanity tests** in addition to unit tests\n\n## Package Reference\n\nSee **[PACKAGES.md](docs\u002FPACKAGES.md)** for the full Python package reference — mandatory standards, standard toolkit (80+ packages across 15 categories), and anti-patterns. Generated from 1,414 pyproject.toml files. Also available via `\u002Fmemory recall \"python packages\"`.\n\n## When to Apply\n\nUse this skill whenever you:\n- create or refactor Python modules, CLIs, services, or pipelines\n- add network calls, subprocess calls, or IO\n- change packaging\u002Ftooling (uv, pyproject)\n- add tests or fix bugs\u002Fflakiness\n\n## Categories (priority order)\n\n1. Correctness (CRITICAL\u002FHIGH): `correctness-`\n2. Security (CRITICAL\u002FHIGH): `security-`\n3. Conventions (HIGH): `conventions-`\n4. Testing & Sanity (HIGH\u002FMEDIUM): `testing-`\n5. Async & Concurrency (HIGH\u002FMEDIUM): `async-`\n6. Performance (MEDIUM): `perf-`\n7. Packaging (MEDIUM): `packaging-`\n8. Logging & Observability (MEDIUM): `logging-`\n9. Style & Maintainability (MEDIUM\u002FLOW): `style-`\n\n## Quick Reference (house rules)\n\n- `style-max-800-lines`\n- `style-module-docstring`\n- `style-thin-init-py`\n- `conventions-loguru`\n- `conventions-typer-cli`\n- `conventions-httpx`\n- `conventions-uv-pyproject`\n- `conventions-functions-over-classes`\n- `conventions-pyproject-deps-complete`\n- `testing-non-mocked-sanity`\n\n## Thin `__init__.py` in Packages (NON-NEGOTIABLE)\n\n**`__init__.py` files must contain only re-exports and package metadata — never business logic.**\n\n### Rule: `style-thin-init-py`\n\nWhen logic is hidden in `__init__.py`, agents (and humans) searching for `module_name.py` won't find it. This causes misdiagnosis — an agent sees `from probes import run_probes`, looks for `probes.py`, doesn't find it, and concludes the module is missing. The logic is actually in `probes\u002F__init__.py` but invisible to file-based search.\n\n**Correct pattern:**\n```\nmypackage\u002F\n  __init__.py          # Only re-exports: from .registry import run_probes, ProbeResult\n  registry.py          # Actual logic lives here (discoverable by name)\n  tier0.py\n  tier1.py\n```\n\n**Anti-pattern:**\n```\nmypackage\u002F\n  __init__.py          # 120 lines of logic, registries, runner functions\n  tier0.py\n  tier1.py\n```\n\n### What belongs in `__init__.py`:\n- `__all__` list\n- Re-exports: `from .submodule import ClassName`\n- Package-level constants (version, etc.)\n- Max ~20 lines\n\n### What does NOT belong:\n- Functions with business logic\n- Class definitions with methods\n- Registry patterns (register\u002Flookup)\n- Anything an agent would look for by name\n\n**Incident**: On 2026-03-16, an agent misdiagnosed `monitor-taxonomy` as broken (\"missing probes.py glue module\") because `run_probes()` lived in `probes\u002F__init__.py` (122 lines) instead of a named module. The code worked fine — but was invisible to agents doing file-based search.\n\n---\n\n## pyproject.toml Dependency Completeness (NON-NEGOTIABLE)\n\n**Every `import` in a skill's `.py` files MUST have a corresponding entry in `pyproject.toml` `[project.dependencies]`.**\n\nThis is a hard gate. Missing dependencies cause `ModuleNotFoundError` at runtime after `uv sync` in a clean venv — a silent regression that only surfaces when the skill is invoked by another agent or in CI.\n\n### Rule: `conventions-pyproject-deps-complete`\n\nWhen creating or modifying a Python skill with a `pyproject.toml`:\n\n1. **Scan all `.py` files** in the skill for `import` and `from X import` statements\n2. **Cross-reference** each top-level import against `[project.dependencies]`\n3. **Add any missing** third-party packages to dependencies\n4. **Run `uv sync`** after adding to verify resolution\n\n### Common offenders (imports that look stdlib but aren't)\n\n| Import | Package needed in pyproject.toml |\n|--------|----------------------------------|\n| `from loguru import logger` | `loguru>=0.7.0` |\n| `import typer` | `typer>=0.9.0` |\n| `import httpx` | `httpx>=0.24.0` |\n| `from rich import ...` | `rich>=13.0.0` |\n| `import pydantic` | `pydantic>=2.0` |\n| `from dotenv import ...` | `python-dotenv>=1.0.0` |\n| `import pytz` | `pytz` |\n| `import tenacity` | `tenacity>=8.0` |\n\n### Verification pattern\n\n```bash\n# After any pyproject.toml change:\ncd \u002Fpath\u002Fto\u002Fskill && uv sync && uv run python -c \"import \u003Cevery_module>\"\n```\n\n### Why this matters\n\nThe ops-chutes skill broke (Feb 2026) because `loguru` was imported by 3 files but\nmissing from `pyproject.toml`. After `uv sync` recreated the venv, `loguru` vanished\nand every downstream skill that called ops-chutes got `ModuleNotFoundError`. This was\na silent regression — the skill worked in the shared system venv but failed in isolation.\n\n---\n\n## uv Isolation in run.sh (NON-NEGOTIABLE)\n\n**If a skill has `pyproject.toml`, ALL Python invocations in `run.sh` MUST use `uv run --project \"$SCRIPT_DIR\" python` — never bare `python3`.**\n\n### Rule: `conventions-uv-run-in-runsh`\n\nBare `python3` uses the system Python, which picks up stale packages from `~\u002F.local\u002Flib\u002Fpython3.12\u002Fsite-packages\u002F`. The skill's `.venv` (managed by `uv sync`) has the correct pinned versions. Using bare `python3` bypasses it entirely.\n\n**The `alias python3='uv run ...'` pattern is acceptable** IF `shopt -s expand_aliases` is set at the top of `run.sh`. But aliases do NOT expand inside `nohup`, `env`, `xargs`, or `$()` — those contexts MUST use explicit `uv run --project`.\n\n**Incident**: 2026-03-17 — `\u002Forchestrate` failed with anyio version mismatch because `run.sh` called bare `python3 structured_execute.py`. System python3 had anyio 3.x from `~\u002F.local\u002F`, but httpx 0.28+ requires anyio 4.x which was only in the skill's `.venv`.\n\n### Correct:\n```bash\nuv run --project \"$SCRIPT_DIR\" python \"$SCRIPT_DIR\u002Fstructured_execute.py\" run plan.yaml\n```\n\n### Wrong:\n```bash\npython3 \"$SCRIPT_DIR\u002Fstructured_execute.py\" run plan.yaml  # system python, wrong deps\nnohup python3 \"$SCRIPT_DIR\u002Fworker.py\" &                    # alias doesn't expand in nohup\n```\n\n## Common Mistakes\n\n### WRONG: Using `import logging` instead of loguru\n```python\nimport logging\nlogger = logging.getLogger(__name__)\n```\n\n### RIGHT: Always use loguru\n```python\nfrom loguru import logger\n```\n\n### WRONG: Using `import requests` for HTTP calls\n```python\nimport requests\nresp = requests.get(\"https:\u002F\u002Fapi.example.com\")\n```\n\n### RIGHT: Use httpx\n```python\nimport httpx\nresp = httpx.get(\"https:\u002F\u002Fapi.example.com\")\n```\n\n### WRONG: Using bare `python3` in run.sh when pyproject.toml exists\n```bash\npython3 \"$SCRIPT_DIR\u002Fmain.py\"\n```\n\n### RIGHT: Use uv run for proper dependency isolation\n```bash\nuv run --project \"$SCRIPT_DIR\" python \"$SCRIPT_DIR\u002Fmain.py\"\n```\n\n### WRONG: Missing dependency in pyproject.toml that the code imports\n```python\nfrom loguru import logger  # imported but not in pyproject.toml dependencies\n```\n\n### RIGHT: Every import has a matching pyproject.toml entry\n```toml\n[project]\ndependencies = [\"loguru>=0.7.0\"]\n```\n\n---\n\n## Docker Skills Must Have docker-compose.yml\n\n**If a skill launches a persistent Docker container (`docker run -d`), it MUST have a `docker-compose.yml`.**\n\n### Rule: `conventions-docker-compose`\n\nContainer specs buried in `docker run` flags across 10+ lines of shell are:\n- Unreadable by agents (who has to grep run.sh to understand the container config)\n- Error-prone (one missing flag = broken container)\n- Non-declarative (can't diff container changes across commits)\n\nThe compose file is the canonical spec. `run.sh` handles dynamic lifecycle (port allocation, multi-instance, health checks) on top of it.\n\n### Enforced by: `\u002Fskills-ci` scanner `runtime.docker_no_compose`\n\n---\n\n## No Silent Fallbacks in Exception Handlers (NON-NEGOTIABLE)\n\n**Every `except` block MUST log at `logger.error`, NOT `logger.debug`.** `logger.debug` is invisible in production — failures silently disappear.\n\n### Rule: `correctness-no-silent-fallback`\n\n```python\n# WRONG — silent in production, hides failures\nexcept Exception as exc:\n    logger.debug(\"search failed: {}\", exc)\n    return []\n\n# WRONG — bare except with no logging at all\nexcept Exception:\n    pass\n\n# RIGHT — visible in production logs\nexcept Exception as exc:\n    logger.error(\"search failed: {}\", exc)\n    return []\n```\n\n**Exceptions:**\n- `dotenv` imports at module top (line 1-10) — genuinely optional\n- Optional dependency imports (`sentence_transformers`, `torch`) — log at WARNING\n- Health check retry loops — `continue` is acceptable\n\n**Everything else MUST use `logger.error`.** This includes:\n- ArangoDB queries, view searches, collection operations\n- Embedding service calls\n- Entity extraction, taxonomy lookups\n- Graph traversal, relationship scoring\n- Edge creation, document upserts\n\nCross-ref: `\u002Fbest-practices-arangodb` rule `arango-no-silent-fallback`.\n\nEnforced by: `\u002Fmonitor-codebase` scanner and `\u002Fcodex` review gate.\n\n---\n\n## No sync subprocess in async code\n\n**If a Python file uses `asyncio`, it MUST NOT import `subprocess` or call `subprocess.run()`.** Use `asyncio.create_subprocess_exec()` or `asyncio.create_subprocess_shell()` instead.\n\n### Rule: `async-no-sync-subprocess`\n\nSync `subprocess.run()` blocks the entire event loop. In an async executor, this freezes ALL concurrent tasks — cancel signals, watchdog polling, other lanes — until the subprocess finishes.\n\n### Correct:\n```python\nproc = await asyncio.create_subprocess_shell(cmd, stdout=asyncio.subprocess.PIPE)\nstdout, stderr = await proc.communicate()\n```\n\n### Wrong:\n```python\nresult = subprocess.run(cmd, capture_output=True)  # blocks event loop\n```\n",{"name":5,"license":14,"composes":48,"metadata":50,"provides":63,"triggers":64,"description":66},[49],"task-monitor",{"defaults":51,"language":23,"python_versions":60},{"cli":52,"http":31,"style":53,"logging":57,"testing":58,"packaging":59},"typer",{"module_docstring":54,"max_lines_per_file":55,"functions_over_classes":56},"required",800,true,"loguru",{"include_sanity_tests":56},"uv + pyproject.toml",[61,62],"3.11+","3.12+",[5],[25,28,57,52,31,65],"python code review","Repo-specific Python best practices for agentic coding: Loguru + Typer + uv + pyproject.toml, httpx over requests, functions-first, module docstrings, max 800 LOC per file, and non-mocked sanity tests.\n","main","92d3cf5de96f8f7e1668e121e82a95faaa78a995","skills.pre-symlink-1776435493\u002Fbest-practices-python",2,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills","https:\u002F\u002Fgithub.com\u002Fcateyephotos","2026-06-13 12:05:20",{"source":8,"skillName":5,"commands":75,"prompt":85,"zipAvailable":56},[76,79,82],{"tool":77,"command":78},"npx","npx skills add cateyephotos\u002Fagent-skills --skill best-practices-python",{"tool":80,"command":81},"bunx","bunx skills add cateyephotos\u002Fagent-skills --skill best-practices-python",{"tool":83,"command":84},"pnpm","pnpm dlx skills add cateyephotos\u002Fagent-skills --skill best-practices-python","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-python\u002FSKILL.md",[87,93,99,105,109,112,116,120,124,129,133,137,141,145,149,153,157,161,165,169,173,177,181,185,189,193,197,201,205,209,212,216,220,224,228,232,236,240,244,248,251,255,259,263,267,271,275,279,283,286,289,293,297,301,304,308,312,316],{"path":88,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":91,"sourceHtmlUrl":92},"AGENTS.md","REFERENCE","参考文档",38584,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-python\u002FAGENTS.md",{"path":94,"resourceType":95,"resourceTypeDesc":96,"sizeBytes":97,"sourceHtmlUrl":98},"analyze_packages.py","SCRIPT","脚本",6963,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-python\u002Fanalyze_packages.py",{"path":100,"resourceType":101,"resourceTypeDesc":102,"sizeBytes":103,"sourceHtmlUrl":104},"assets\u002Fpyproject.snippet.toml","ASSET","资产文件",356,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-python\u002Fassets\u002Fpyproject.snippet.toml",{"path":106,"resourceType":101,"resourceTypeDesc":102,"sizeBytes":107,"sourceHtmlUrl":108},"assets\u002Fruff-docstrings-hint.toml",253,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-python\u002Fassets\u002Fruff-docstrings-hint.toml",{"path":110,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":91,"sourceHtmlUrl":111},"docs\u002FAGENTS.md","https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-python\u002Fdocs\u002FAGENTS.md",{"path":113,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":114,"sourceHtmlUrl":115},"docs\u002FPACKAGES.md",7508,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-python\u002Fdocs\u002FPACKAGES.md",{"path":117,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":118,"sourceHtmlUrl":119},"docs\u002FREADME.md",1093,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-python\u002Fdocs\u002FREADME.md",{"path":121,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":122,"sourceHtmlUrl":123},"docs\u002Fresearch\u002F01_IDEA.md",1464,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-python\u002Fdocs\u002Fresearch\u002F01_IDEA.md",{"path":32,"resourceType":125,"resourceTypeDesc":126,"sizeBytes":127,"sourceHtmlUrl":128},"OTHER","其他",317,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-python\u002Fpyproject.toml",{"path":130,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":131,"sourceHtmlUrl":132},"rules\u002F_sections.md",1107,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-python\u002Frules\u002F_sections.md",{"path":134,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":135,"sourceHtmlUrl":136},"rules\u002F_template.md",334,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-python\u002Frules\u002F_template.md",{"path":138,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":139,"sourceHtmlUrl":140},"rules\u002Fasync-limit-concurrency.md",664,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-python\u002Frules\u002Fasync-limit-concurrency.md",{"path":142,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":143,"sourceHtmlUrl":144},"rules\u002Fasync-no-blocking-in-event-loop.md",1851,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-python\u002Frules\u002Fasync-no-blocking-in-event-loop.md",{"path":146,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":147,"sourceHtmlUrl":148},"rules\u002Fasync-prefer-asyncclient.md",651,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-python\u002Frules\u002Fasync-prefer-asyncclient.md",{"path":150,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":151,"sourceHtmlUrl":152},"rules\u002Fasync-single-asyncio-run.md",1929,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-python\u002Frules\u002Fasync-single-asyncio-run.md",{"path":154,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":155,"sourceHtmlUrl":156},"rules\u002Fasync-timeouts-cancellation.md",548,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-python\u002Frules\u002Fasync-timeouts-cancellation.md",{"path":158,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":159,"sourceHtmlUrl":160},"rules\u002Fconventions-dotenv-required.md",2755,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-python\u002Frules\u002Fconventions-dotenv-required.md",{"path":162,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":163,"sourceHtmlUrl":164},"rules\u002Fconventions-functions-over-classes.md",744,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-python\u002Frules\u002Fconventions-functions-over-classes.md",{"path":166,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":167,"sourceHtmlUrl":168},"rules\u002Fconventions-httpx.md",623,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-python\u002Frules\u002Fconventions-httpx.md",{"path":170,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":171,"sourceHtmlUrl":172},"rules\u002Fconventions-loguru.md",2497,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-python\u002Frules\u002Fconventions-loguru.md",{"path":174,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":175,"sourceHtmlUrl":176},"rules\u002Fconventions-module-docstring-required.md",689,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-python\u002Frules\u002Fconventions-module-docstring-required.md",{"path":178,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":179,"sourceHtmlUrl":180},"rules\u002Fconventions-no-print.md",433,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-python\u002Frules\u002Fconventions-no-print.md",{"path":182,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":183,"sourceHtmlUrl":184},"rules\u002Fconventions-typer-cli.md",694,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-python\u002Frules\u002Fconventions-typer-cli.md",{"path":186,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":187,"sourceHtmlUrl":188},"rules\u002Fconventions-uv-pyproject.md",536,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-python\u002Frules\u002Fconventions-uv-pyproject.md",{"path":190,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":191,"sourceHtmlUrl":192},"rules\u002Fcorrectness-avoid-mutable-defaults.md",528,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-python\u002Frules\u002Fcorrectness-avoid-mutable-defaults.md",{"path":194,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":195,"sourceHtmlUrl":196},"rules\u002Fcorrectness-guard-invariants.md",515,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-python\u002Frules\u002Fcorrectness-guard-invariants.md",{"path":198,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":199,"sourceHtmlUrl":200},"rules\u002Fcorrectness-no-bare-except.md",650,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-python\u002Frules\u002Fcorrectness-no-bare-except.md",{"path":202,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":203,"sourceHtmlUrl":204},"rules\u002Fcorrectness-no-implicit-global-state.md",532,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-python\u002Frules\u002Fcorrectness-no-implicit-global-state.md",{"path":206,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":207,"sourceHtmlUrl":208},"rules\u002Fcorrectness-no-placeholder-error-handling.md",3928,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-python\u002Frules\u002Fcorrectness-no-placeholder-error-handling.md",{"path":210,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":191,"sourceHtmlUrl":211},"rules\u002Fcorrectness-raise-from.md","https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-python\u002Frules\u002Fcorrectness-raise-from.md",{"path":213,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":214,"sourceHtmlUrl":215},"rules\u002Fcorrectness-return-types.md",659,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-python\u002Frules\u002Fcorrectness-return-types.md",{"path":217,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":218,"sourceHtmlUrl":219},"rules\u002Flogging-bind-context.md",462,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-python\u002Frules\u002Flogging-bind-context.md",{"path":221,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":222,"sourceHtmlUrl":223},"rules\u002Flogging-no-giant-payloads.md",503,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-python\u002Frules\u002Flogging-no-giant-payloads.md",{"path":225,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":226,"sourceHtmlUrl":227},"rules\u002Flogging-use-exception.md",563,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-python\u002Frules\u002Flogging-use-exception.md",{"path":229,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":230,"sourceHtmlUrl":231},"rules\u002Fpackaging-pin-major-deps.md",410,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-python\u002Frules\u002Fpackaging-pin-major-deps.md",{"path":233,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":234,"sourceHtmlUrl":235},"rules\u002Fpackaging-pyproject-central.md",475,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-python\u002Frules\u002Fpackaging-pyproject-central.md",{"path":237,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":238,"sourceHtmlUrl":239},"rules\u002Fpackaging-uv-lockfile.md",432,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-python\u002Frules\u002Fpackaging-uv-lockfile.md",{"path":241,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":242,"sourceHtmlUrl":243},"rules\u002Fperf-avoid-n2.md",642,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-python\u002Frules\u002Fperf-avoid-n2.md",{"path":245,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":246,"sourceHtmlUrl":247},"rules\u002Fperf-cache-pure.md",603,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-python\u002Frules\u002Fperf-cache-pure.md",{"path":249,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":203,"sourceHtmlUrl":250},"rules\u002Fperf-stream-large-files.md","https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-python\u002Frules\u002Fperf-stream-large-files.md",{"path":252,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":253,"sourceHtmlUrl":254},"rules\u002Fsecurity-no-eval-exec.md",598,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-python\u002Frules\u002Fsecurity-no-eval-exec.md",{"path":256,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":257,"sourceHtmlUrl":258},"rules\u002Fsecurity-no-shell-true.md",520,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-python\u002Frules\u002Fsecurity-no-shell-true.md",{"path":260,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":261,"sourceHtmlUrl":262},"rules\u002Fsecurity-redact-secrets.md",493,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-python\u002Frules\u002Fsecurity-redact-secrets.md",{"path":264,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":265,"sourceHtmlUrl":266},"rules\u002Fsecurity-validate-untrusted-input.md",549,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-python\u002Frules\u002Fsecurity-validate-untrusted-input.md",{"path":268,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":269,"sourceHtmlUrl":270},"rules\u002Fsecurity-xml-safe-parsing.md",473,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-python\u002Frules\u002Fsecurity-xml-safe-parsing.md",{"path":272,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":273,"sourceHtmlUrl":274},"rules\u002Fstyle-max-800-lines.md",2268,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-python\u002Frules\u002Fstyle-max-800-lines.md",{"path":276,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":277,"sourceHtmlUrl":278},"rules\u002Fstyle-module-docstring.md",2143,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-python\u002Frules\u002Fstyle-module-docstring.md",{"path":280,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":281,"sourceHtmlUrl":282},"rules\u002Fstyle-pathlib.md",411,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-python\u002Frules\u002Fstyle-pathlib.md",{"path":284,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":226,"sourceHtmlUrl":285},"rules\u002Fstyle-small-functions.md","https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-python\u002Frules\u002Fstyle-small-functions.md",{"path":287,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":257,"sourceHtmlUrl":288},"rules\u002Ftesting-arrange-act-assert.md","https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-python\u002Frules\u002Ftesting-arrange-act-assert.md",{"path":290,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":291,"sourceHtmlUrl":292},"rules\u002Ftesting-deterministic-time.md",553,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-python\u002Frules\u002Ftesting-deterministic-time.md",{"path":294,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":295,"sourceHtmlUrl":296},"rules\u002Ftesting-no-network-by-default.md",571,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-python\u002Frules\u002Ftesting-no-network-by-default.md",{"path":298,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":299,"sourceHtmlUrl":300},"rules\u002Ftesting-non-mocked-sanity.md",693,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-python\u002Frules\u002Ftesting-non-mocked-sanity.md",{"path":302,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":253,"sourceHtmlUrl":303},"rules\u002Ftesting-sanity-fixtures.md","https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-python\u002Frules\u002Ftesting-sanity-fixtures.md",{"path":305,"resourceType":95,"resourceTypeDesc":96,"sizeBytes":306,"sourceHtmlUrl":307},"sanity.sh",2250,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-python\u002Fsanity.sh",{"path":309,"resourceType":95,"resourceTypeDesc":96,"sizeBytes":310,"sourceHtmlUrl":311},"sanity\u002Flint_dotenv.sh",3645,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-python\u002Fsanity\u002Flint_dotenv.sh",{"path":313,"resourceType":95,"resourceTypeDesc":96,"sizeBytes":314,"sourceHtmlUrl":315},"scripts\u002Fcheck_file_limits.py",1082,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-python\u002Fscripts\u002Fcheck_file_limits.py",{"path":317,"resourceType":95,"resourceTypeDesc":96,"sizeBytes":318,"sourceHtmlUrl":319},"scripts\u002Fcompile_agents.py",1798,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills.pre-symlink-1776435493\u002Fbest-practices-python\u002Fscripts\u002Fcompile_agents.py",[321,345,373,395,420,438],{"skillNo":322,"name":323,"nameZh":6,"description":324,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":325,"categories":326,"keywords":327,"publishedAt":43},"01M71DBADHWPBVJWYQT9VAD1XE","best-practices-streamdeck","Project-specific best practices for the Stream Deck control suite: icon format constraints, socket vs config boundaries, widget button lifecycle, page creation via build_page, ArangoDB fallback patterns, and NVIS palette compliance.","https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills\u002Fbest-practices-streamdeck\u002FSKILL.md",[],[24,328,329,30,330,331,332,333,334,335,336,52,337,338,339,340,341,342,343,344],"best practices streamdeck","creation","project","page","static","deck","socket","lifecycle","monitor","best-practices","icon","task","palette","control","native","via","build",{"skillNo":346,"name":347,"nameZh":6,"description":348,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":349,"categories":350,"keywords":354,"publishedAt":43},"01M71DARX9YN0QEXS6EM2C6E4X","best-practices-scillm","Error recovery and anti-patterns for scillm LLM proxy. Load this when scillm calls fail, timeout, or return unexpected results. Covers batch sizing, header requirements, model selection, and debugging workflow.","https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills\u002Fbest-practices-scillm\u002FSKILL.md",[351],{"categoryNo":352,"categoryName":353,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000023","Skill与智能体开发",[355,24,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,30],"best practices scillm","scillm","error","processing","model","selection","model selection","error recovery","debugging","when","workflow","batch","anti-patterns","rate","rate limit","patterns","limit","proxy",{"skillNo":374,"name":375,"nameZh":6,"description":376,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":377,"categories":378,"keywords":380,"publishedAt":43},"01M71DAMV3PAAPBADP5EY1N61S","best-practices-rust","Repo-specific Rust best practices for agentic coding: thiserror + anyhow error handling, tokio async runtime, tracing for observability, clap for CLI, axum for HTTP, serde patterns, cargo workspace conventions, ownership and lifetimes, and idiomatic Rust 2024 edition patterns.","https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills\u002Fbest-practices-rust\u002FSKILL.md",[379],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},[381,382,24,357,383,384,385,42,386,40,39,38,387,388,389,390,391,392,393,394],"rust","best practices rust","async runtime","tokio","performance","2024","resilience","server","cli","axum","rust error handling","polars","rust best practices","tracing",{"skillNo":396,"name":397,"nameZh":6,"description":398,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":399,"categories":400,"keywords":404,"publishedAt":43},"01M71DACXQ43RCTYYCB8WB1KPG","react-native-skills","React Native and Expo best practices for building performant mobile apps. Use when building React Native components, optimizing list performance, implementing animations, or working with native modules. Triggers on tasks involving React Native, Expo, mobile performance, or native platform APIs.","https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills\u002Fbest-practices-react\u002Fskills\u002Freact-native-skills\u002FSKILL.md",[401],{"categoryNo":402,"categoryName":403,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000009","前端开发",[405,406,342,407,408,409,410,30,385,411,412,413,414,415,416,364,24,417,418,419],"react","react native","react native skills","modules","platform","animations","vercel","implementing","triggers","use","react native components","apps","tasks","components","with",{"skillNo":421,"name":422,"nameZh":6,"description":423,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":424,"categories":425,"keywords":427,"publishedAt":43},"01M71DA9YZ05NTRPEK9JAX283K","react-best-practices","React and Next.js performance optimization guidelines from Vercel Engineering. This skill should be used when writing, reviewing, or refactoring React\u002FNext.js code to ensure optimal performance patterns. Triggers on tasks involving React components, Next.js pages, data fetching, bundle optimization, or performance improvements.","https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills\u002Fbest-practices-react\u002Fskills\u002Freact-best-practices\u002FSKILL.md",[426],{"categoryNo":402,"categoryName":403,"taxonomyType":20,"taxonomyTypeDesc":21},[405,428,24,385,429,364,39,417,418,430,431,432,433,434,370,435,411,436,413,437],"react best practices","writing","data fetching","react components","next","refactoring","data","Optimization","guidelines","pages",{"skillNo":439,"name":440,"nameZh":6,"description":441,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":442,"categories":443,"keywords":445,"publishedAt":43},"01M71DA77CYKDT0Q7VAXG4Y9QW","composition-patterns","React composition patterns that scale. Use when refactoring components with boolean prop proliferation, building flexible component libraries, or designing reusable APIs. Triggers on tasks involving compound components, render props, context providers, or component architecture. Includes React 19 API changes.","https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills\u002Fbest-practices-react\u002Fskills\u002Fcomposition-patterns\u002FSKILL.md",[444],{"categoryNo":402,"categoryName":403,"taxonomyType":20,"taxonomyTypeDesc":21},[446,447,370,448,449,411,450,413,451,452,414,364,453,417,418,454,455,456,405,419],"Composition","composition patterns","react composition patterns","react 19","render","boolean","component architecture","reusable","architecture","react composition","api"]