[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6ACKVJSNMT7YDTXEFJNZMY3":3,"skill-same:01M6ACKVJSNMT7YDTXEFJNZMY3":52},{"skillNo":4,"name":5,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":22,"publishedAt":24,"linkOnly":25,"markdownContent":26,"markdownBody":27,"frontMatter":28,"refName":29,"commitSha":30,"skillDirectory":31,"forksCount":32,"repositoryHtmlUrl":33,"repositoryHomepageUrl":34,"ownerHtmlUrl":35,"ownerBlogUrl":36,"ownerDescription":6,"updatedAt":37,"install":38,"resources":51},"01M6ACKVJSNMT7YDTXEFJNZMY3","audit-skill-md",null,"apache\u002Fdatafusion-python","apache","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F47359?v=4","01M6AC83E6K4FDKK7HZ8WNMQKE","The Apache Software Foundation","01M6ACKST0XJWJESE0ZMQG0W2M",613,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Fapache\u002Fdatafusion-python\u002Fblob\u002Fmain\u002F.ai\u002Fskills\u002Faudit-skill-md\u002FSKILL.md",[17],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[23],"audit skill md","2026-11-10 10:12:30",false,"---\nname: audit-skill-md\ndescription: Audit the user-facing skill at skills\u002Fdatafusion_python\u002FSKILL.md against the current public Python API. Find new APIs that should be documented, stale mentions of removed\u002Frenamed APIs, examples that drifted from current idiomatic style, and places that need a \"requires datafusion-python NN or newer\" note. Run after upstream syncs and before each release.\nargument-hint: [scope] (e.g., \"session-context\", \"dataframe\", \"expr\", \"functions\", \"patterns\", \"pitfalls\", \"version-notes\", \"all\")\n---\n\n\u003C!---\n  Licensed to the Apache Software Foundation (ASF) under one\n  or more contributor license agreements.  See the NOTICE file\n  distributed with this work for additional information\n  regarding copyright ownership.  The ASF licenses this file\n  to you under the Apache License, Version 2.0 (the\n  \"License\"); you may not use this file except in compliance\n  with the License.  You may obtain a copy of the License at\n\n    http:\u002F\u002Fwww.apache.org\u002Flicenses\u002FLICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing,\n  software distributed under the License is distributed on an\n  \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n  KIND, either express or implied.  See the License for the\n  specific language governing permissions and limitations\n  under the License.\n-->\n\n# Audit `skills\u002Fdatafusion_python\u002FSKILL.md`\n\nYou are auditing the user-facing skill at\n[`skills\u002Fdatafusion_python\u002FSKILL.md`](..\u002F..\u002Fskills\u002Fdatafusion_python\u002FSKILL.md)\nagainst the current state of the Python API. The skill is the source of truth\nfor how AI coding assistants are taught to write `datafusion-python` code, so\nit must match what the project actually ships. This skill identifies gaps\ncaused by upstream syncs, refactors, or renames, and (if asked) applies the\nedits directly to `SKILL.md`.\n\nThe skill is most usefully run **after** the `check-upstream` step of an\nupstream sync (see `dev\u002Frelease\u002Fupstream-sync.md`) — once any new APIs are\nexposed, this skill makes sure they get documented.\n\n## What the skill covers\n\nThe user-facing `SKILL.md` documents these public surfaces. This list is not\nexhaustive — if a new top-level area is added (e.g., a new `Catalog` API\nexposed at the package root), include it.\n\n| Surface | Module | Sections in SKILL.md |\n|---|---|---|\n| `SessionContext` | `python\u002Fdatafusion\u002Fcontext.py` | \"Data Loading\" |\n| `DataFrame` | `python\u002Fdatafusion\u002Fdataframe.py` | \"DataFrame Operations Quick Reference\", \"Executing and Collecting Results\", \"Idiomatic Patterns\" |\n| `Expr` | `python\u002Fdatafusion\u002Fexpr.py` | \"Expression Building\", \"Common Pitfalls\" |\n| `functions` | `python\u002Fdatafusion\u002Ffunctions\u002F__init__.py` | \"Available Functions (Categorized)\", scattered uses throughout |\n| `functions.spark` | `python\u002Fdatafusion\u002Ffunctions\u002Fspark.py` | \"Available Functions (Categorized)\" → \"Spark-Compatible Functions\" subsection |\n| Top-level helpers (`col`, `lit`, `WindowFrame`, ...) | `python\u002Fdatafusion\u002F__init__.py` | \"Import Conventions\", \"Core Abstractions\" |\n\n## Scope argument\n\nThe user may specify a scope via `$ARGUMENTS` to limit the audit. If no scope\nis given or `all` is specified, audit every area.\n\n| Scope | Audit target |\n|---|---|\n| `session-context` | `SessionContext` methods and the \"Data Loading\" section |\n| `dataframe` | `DataFrame` methods and the operations \u002F executing \u002F patterns sections |\n| `expr` | `Expr` methods\u002Foperators and the \"Expression Building\" section |\n| `functions` | `functions\u002F__init__.py` `__all__` and the \"Available Functions (Categorized)\" section |\n| `spark-functions` | `functions\u002Fspark.py` `__all__`, the \"Spark-Compatible Functions\" subsection, and the divergent-semantics table |\n| `patterns` | \"Idiomatic Patterns\" section — confirm patterns still match recommended style |\n| `pitfalls` | \"Common Pitfalls\" — confirm each pitfall still reproduces, drop ones fixed upstream |\n| `version-notes` | Cross-check version annotations (see below) |\n| `all` | Everything above |\n\n## Inputs to read\n\nBefore producing the report:\n\n1. `skills\u002Fdatafusion_python\u002FSKILL.md` — the document being audited.\n2. The relevant Python module(s) for the chosen scope. Public surface is the\n   `__all__` list (where defined) plus `class` and `def` symbols not prefixed\n   with `_`.\n3. `Cargo.toml` (root) for the current `datafusion-python` version — read\n   the `version` field under `[workspace.package]` (format `NN.0.0`). The\n   major version always matches the upstream `datafusion` crate, so a\n   single `datafusion-python` version expresses both.\n   `python\u002Fdatafusion\u002F__init__.py`'s `__version__` is the same value\n   exposed at runtime.\n4. Recent commits touching the relevant module(s) for context on what\n   changed since the last sync:\n   ```bash\n   git log --oneline -- python\u002Fdatafusion\u002Fdataframe.py | head -20\n   ```\n\n## What to look for\n\nWalk through each scoped area and flag four kinds of issues.\n\n### 1. New APIs not mentioned\n\nFor each public symbol in the module's `__all__` (or each public class\nmethod), check whether it appears anywhere in `SKILL.md`. A symbol is\n\"covered\" if it shows up in:\n\n- A code block (the strongest signal — it's demonstrated).\n- The \"Available Functions (Categorized)\" list.\n- The SQL-to-DataFrame Reference table.\n\n**Decide whether each missing symbol deserves an entry.** Not every public\nsymbol belongs in `SKILL.md` — the skill is curated for the patterns users\nhit daily, not exhaustive API reference. Use these heuristics:\n\n- **Add it** if it replaces or supersedes something already in the skill\n  (e.g., a new operation that is the idiomatic alternative to a documented\n  workaround).\n- **Add it** if it fits a category already present (a new aggregate function\n  goes in the aggregate list; a new join type goes in the joining section).\n- **Add it** if it changes how a documented pattern should be written.\n- **Skip it** if it is genuinely niche \u002F advanced \u002F experimental.\n- **Skip it** if it is internal plumbing exposed for FFI but not user-facing.\n\nWhen you flag a missing symbol, include a one-line proposed insertion point\n(which section \u002F which table row) so a reviewer can decide quickly.\n\n### 2. Stale mentions\n\nFor each function name, method name, or import shown in `SKILL.md`, verify it\nstill exists in the current API:\n\n- Function names mentioned in prose or in the categorized list should appear\n  in `python\u002Fdatafusion\u002Ffunctions\u002F__init__.py`'s `__all__`.\n- Spark function names mentioned in the \"Spark-Compatible Functions\"\n  subsection should appear in `python\u002Fdatafusion\u002Ffunctions\u002Fspark.py`'s\n  `__all__`. Also confirm the divergent-semantics table still matches the\n  current spark vs. main signatures.\n- Method calls in code blocks should resolve against the current class.\n- Imports (`from datafusion import ...`) should succeed against the current\n  `__init__.py`.\n\nA quick way to check imports without running them:\n\n```bash\npython -c \"from datafusion import SessionContext, col, lit; from datafusion import functions as F; print('ok')\"\n```\n\nFor each stale mention, propose either:\n- a rename to the current name, or\n- removal if the API is gone with no replacement.\n\n### 3. Examples that drifted from idiomatic style\n\nThe skill teaches a Pythonic style: prefer plain strings to `col(...)` when a\ncolumn reference is all you need; prefer raw Python values to `lit(...)`\nwhere auto-wrapping applies. Recent refactors (see the `make-pythonic`\nskill) keep moving more functions toward accepting native types.\n\nFor each code example in `SKILL.md`, check:\n\n- Does it use `lit(value)` where a raw value would work? Comparison RHS,\n  arithmetic with a column, etc. all auto-wrap. (Reserve `lit()` for the\n  cases listed in pitfall #2.)\n- Does it use `col(\"name\")` where a plain string would work? `select(...)`,\n  `aggregate([keys], ...)`, `sort(...)`, `sort_by(...)` all accept plain\n  name strings.\n- Do `functions.py` calls match the current pythonic signature for that\n  function? If `make-pythonic` recently changed a signature (e.g.,\n  `repeat(string, n: Expr | int)`), the example should pass `3` rather than\n  `lit(3)`.\n- Does any example use a deprecated or removed parameter name?\n\nFor drift, propose the updated snippet. If the change is purely stylistic\nand the older form still works, mark the suggestion as **non-blocking**.\n\n### 4. Missing or stale version notes\n\nWhen an API depends on a specific version, the skill should say so —\notherwise an agent referencing the skill in an older project will write\ncode that fails at import or at runtime.\n\n`datafusion-python` shares its major version number with the upstream\n`datafusion` crate (e.g., `datafusion-python 53.x` tracks upstream\n`datafusion 53`). Always express version requirements in terms of\n`datafusion-python` only — there is no need to call out upstream and\npackage versions separately.\n\nAdd a version note when:\n\n- A method or function shown in the skill was added in a specific release\n  (e.g., a new `DataFrame` method that didn't exist before 53).\n- A breaking change altered behavior in a specific release (signature\n  change, default-value change, new required argument).\n- A pitfall was fixed in a specific release. Either annotate the pitfall\n  block with \"fixed in datafusion-python NN, kept here for users on older\n  versions\" or remove it once the supported floor moves past that version.\n\nFormat for version notes (inline, italicized):\n\n```markdown\n*Requires datafusion-python 53 or newer.*\n```\n\nFor each missing\u002Fstale version note, propose the exact line and where it\nbelongs.\n\n## How to discover changes since the last audit\n\nIf the user supplies a previous version or commit SHA where the audit was\nlast run, diff against it:\n\n```bash\n# Public-API-relevant changes since SHA \u003Cprev>\ngit log --oneline \u003Cprev>..HEAD -- python\u002Fdatafusion\u002F\n\n# Whose signatures actually moved\ngit diff \u003Cprev>..HEAD -- python\u002Fdatafusion\u002Ffunctions.py | grep '^[+-]def '\n```\n\nIf no prior audit point is given, fall back to \"since the last upstream\nsync\" by inspecting commits that touch `Cargo.toml`'s `datafusion` pin:\n\n```bash\ngit log --oneline -- Cargo.toml | grep -i datafusion | head -5\n```\n\n## Output Format\n\nProduce a report grouped by scope. Each finding is one bullet with a\nproposed action, so a maintainer can review the list quickly and apply\nedits in order.\n\n```\n## SKILL.md Audit (scope: \u003Cscope>)\n\nAudited against:\n- skills\u002Fdatafusion_python\u002FSKILL.md @ \u003Cgit SHA \u002F \"working tree\">\n- datafusion-python \u003Cversion>\n\n### New APIs to cover\n- `DataFrame.foo()` — added in datafusion-python 53. Insert in \"DataFrame Operations Quick Reference\" under \u003Csubsection>.\n  Proposed snippet:\n  ```python\n  df.foo(...)\n  ```\n\n### Stale mentions\n- \"old_function_name\" referenced in the categorized list (line N) — renamed to \"new_function_name\". Replace.\n\n### Drifted examples\n- \"Filtering\" section, `df.filter(col(\"a\") > lit(10))` — drop `lit(10)`, auto-wrap applies. (non-blocking)\n- \"Aggregation\" section, `df.aggregate([col(\"region\")], ...)` — pass `\"region\"` as a plain string per \"Projection\" guidance.\n\n### Version notes\n- `DataFrame.foo()` block needs *Requires datafusion-python 53 or newer.*\n- \"Common Pitfalls\" #N — fixed in datafusion-python 53; remove the pitfall and update the SQL-to-DataFrame row to no longer flag the workaround.\n\n### No-change confirmed\n- `SessionContext` data-loading section — all entries match current API.\n```\n\nIf asked to apply the changes, edit `skills\u002Fdatafusion_python\u002FSKILL.md`\ndirectly with `Edit` tool calls, one finding at a time, and re-run the\nrelevant doctest sanity check at the end:\n\n```bash\npytest --doctest-modules python\u002Fdatafusion -q\n```\n\n## What NOT to flag\n\n- **Internal helpers \u002F underscored names.** Private symbols are not part of\n  the user-facing surface.\n- **Functions intentionally omitted.** Niche \u002F advanced APIs (custom\n  catalogs, raw FFI plumbing, low-level execution plan accessors) live in\n  the API reference, not the skill. If an omission was deliberate and a\n  comment \u002F commit explains why, leave it out.\n- **Style nits inside explanatory prose.** The skill mixes example code and\n  prose; only enforce the pythonic style on actual code blocks.\n- **Function-by-function coverage of every `functions.py` symbol.** The\n  \"Available Functions (Categorized)\" list is curated by category, not\n  exhaustive. Adding a single new aggregate to the aggregate list is\n  enough — the user follows the pointer to the API reference for the rest.\n\n## Coordination with other skills\n\n- Run `\u002Fcheck-upstream` first to expose any missing upstream APIs into the\n  Python layer. Without that, this skill cannot recommend documenting\n  something that is not yet exposed.\n- Run `\u002Fmake-pythonic` before this skill if a Pythonic-signature pass is\n  planned for a release — that way this skill can update examples to the\n  final signature in one shot rather than churning them twice.\n- The order during an upstream sync (PR 3 of `dev\u002Frelease\u002Fupstream-sync.md`)\n  is therefore: `\u002Fcheck-upstream` → `\u002Fmake-pythonic` (optional) →\n  `\u002Faudit-skill-md`.\n","\u003C!---\n  Licensed to the Apache Software Foundation (ASF) under one\n  or more contributor license agreements.  See the NOTICE file\n  distributed with this work for additional information\n  regarding copyright ownership.  The ASF licenses this file\n  to you under the Apache License, Version 2.0 (the\n  \"License\"); you may not use this file except in compliance\n  with the License.  You may obtain a copy of the License at\n\n    http:\u002F\u002Fwww.apache.org\u002Flicenses\u002FLICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing,\n  software distributed under the License is distributed on an\n  \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n  KIND, either express or implied.  See the License for the\n  specific language governing permissions and limitations\n  under the License.\n-->\n\n# Audit `skills\u002Fdatafusion_python\u002FSKILL.md`\n\nYou are auditing the user-facing skill at\n[`skills\u002Fdatafusion_python\u002FSKILL.md`](..\u002F..\u002Fskills\u002Fdatafusion_python\u002FSKILL.md)\nagainst the current state of the Python API. The skill is the source of truth\nfor how AI coding assistants are taught to write `datafusion-python` code, so\nit must match what the project actually ships. This skill identifies gaps\ncaused by upstream syncs, refactors, or renames, and (if asked) applies the\nedits directly to `SKILL.md`.\n\nThe skill is most usefully run **after** the `check-upstream` step of an\nupstream sync (see `dev\u002Frelease\u002Fupstream-sync.md`) — once any new APIs are\nexposed, this skill makes sure they get documented.\n\n## What the skill covers\n\nThe user-facing `SKILL.md` documents these public surfaces. This list is not\nexhaustive — if a new top-level area is added (e.g., a new `Catalog` API\nexposed at the package root), include it.\n\n| Surface | Module | Sections in SKILL.md |\n|---|---|---|\n| `SessionContext` | `python\u002Fdatafusion\u002Fcontext.py` | \"Data Loading\" |\n| `DataFrame` | `python\u002Fdatafusion\u002Fdataframe.py` | \"DataFrame Operations Quick Reference\", \"Executing and Collecting Results\", \"Idiomatic Patterns\" |\n| `Expr` | `python\u002Fdatafusion\u002Fexpr.py` | \"Expression Building\", \"Common Pitfalls\" |\n| `functions` | `python\u002Fdatafusion\u002Ffunctions\u002F__init__.py` | \"Available Functions (Categorized)\", scattered uses throughout |\n| `functions.spark` | `python\u002Fdatafusion\u002Ffunctions\u002Fspark.py` | \"Available Functions (Categorized)\" → \"Spark-Compatible Functions\" subsection |\n| Top-level helpers (`col`, `lit`, `WindowFrame`, ...) | `python\u002Fdatafusion\u002F__init__.py` | \"Import Conventions\", \"Core Abstractions\" |\n\n## Scope argument\n\nThe user may specify a scope via `$ARGUMENTS` to limit the audit. If no scope\nis given or `all` is specified, audit every area.\n\n| Scope | Audit target |\n|---|---|\n| `session-context` | `SessionContext` methods and the \"Data Loading\" section |\n| `dataframe` | `DataFrame` methods and the operations \u002F executing \u002F patterns sections |\n| `expr` | `Expr` methods\u002Foperators and the \"Expression Building\" section |\n| `functions` | `functions\u002F__init__.py` `__all__` and the \"Available Functions (Categorized)\" section |\n| `spark-functions` | `functions\u002Fspark.py` `__all__`, the \"Spark-Compatible Functions\" subsection, and the divergent-semantics table |\n| `patterns` | \"Idiomatic Patterns\" section — confirm patterns still match recommended style |\n| `pitfalls` | \"Common Pitfalls\" — confirm each pitfall still reproduces, drop ones fixed upstream |\n| `version-notes` | Cross-check version annotations (see below) |\n| `all` | Everything above |\n\n## Inputs to read\n\nBefore producing the report:\n\n1. `skills\u002Fdatafusion_python\u002FSKILL.md` — the document being audited.\n2. The relevant Python module(s) for the chosen scope. Public surface is the\n   `__all__` list (where defined) plus `class` and `def` symbols not prefixed\n   with `_`.\n3. `Cargo.toml` (root) for the current `datafusion-python` version — read\n   the `version` field under `[workspace.package]` (format `NN.0.0`). The\n   major version always matches the upstream `datafusion` crate, so a\n   single `datafusion-python` version expresses both.\n   `python\u002Fdatafusion\u002F__init__.py`'s `__version__` is the same value\n   exposed at runtime.\n4. Recent commits touching the relevant module(s) for context on what\n   changed since the last sync:\n   ```bash\n   git log --oneline -- python\u002Fdatafusion\u002Fdataframe.py | head -20\n   ```\n\n## What to look for\n\nWalk through each scoped area and flag four kinds of issues.\n\n### 1. New APIs not mentioned\n\nFor each public symbol in the module's `__all__` (or each public class\nmethod), check whether it appears anywhere in `SKILL.md`. A symbol is\n\"covered\" if it shows up in:\n\n- A code block (the strongest signal — it's demonstrated).\n- The \"Available Functions (Categorized)\" list.\n- The SQL-to-DataFrame Reference table.\n\n**Decide whether each missing symbol deserves an entry.** Not every public\nsymbol belongs in `SKILL.md` — the skill is curated for the patterns users\nhit daily, not exhaustive API reference. Use these heuristics:\n\n- **Add it** if it replaces or supersedes something already in the skill\n  (e.g., a new operation that is the idiomatic alternative to a documented\n  workaround).\n- **Add it** if it fits a category already present (a new aggregate function\n  goes in the aggregate list; a new join type goes in the joining section).\n- **Add it** if it changes how a documented pattern should be written.\n- **Skip it** if it is genuinely niche \u002F advanced \u002F experimental.\n- **Skip it** if it is internal plumbing exposed for FFI but not user-facing.\n\nWhen you flag a missing symbol, include a one-line proposed insertion point\n(which section \u002F which table row) so a reviewer can decide quickly.\n\n### 2. Stale mentions\n\nFor each function name, method name, or import shown in `SKILL.md`, verify it\nstill exists in the current API:\n\n- Function names mentioned in prose or in the categorized list should appear\n  in `python\u002Fdatafusion\u002Ffunctions\u002F__init__.py`'s `__all__`.\n- Spark function names mentioned in the \"Spark-Compatible Functions\"\n  subsection should appear in `python\u002Fdatafusion\u002Ffunctions\u002Fspark.py`'s\n  `__all__`. Also confirm the divergent-semantics table still matches the\n  current spark vs. main signatures.\n- Method calls in code blocks should resolve against the current class.\n- Imports (`from datafusion import ...`) should succeed against the current\n  `__init__.py`.\n\nA quick way to check imports without running them:\n\n```bash\npython -c \"from datafusion import SessionContext, col, lit; from datafusion import functions as F; print('ok')\"\n```\n\nFor each stale mention, propose either:\n- a rename to the current name, or\n- removal if the API is gone with no replacement.\n\n### 3. Examples that drifted from idiomatic style\n\nThe skill teaches a Pythonic style: prefer plain strings to `col(...)` when a\ncolumn reference is all you need; prefer raw Python values to `lit(...)`\nwhere auto-wrapping applies. Recent refactors (see the `make-pythonic`\nskill) keep moving more functions toward accepting native types.\n\nFor each code example in `SKILL.md`, check:\n\n- Does it use `lit(value)` where a raw value would work? Comparison RHS,\n  arithmetic with a column, etc. all auto-wrap. (Reserve `lit()` for the\n  cases listed in pitfall #2.)\n- Does it use `col(\"name\")` where a plain string would work? `select(...)`,\n  `aggregate([keys], ...)`, `sort(...)`, `sort_by(...)` all accept plain\n  name strings.\n- Do `functions.py` calls match the current pythonic signature for that\n  function? If `make-pythonic` recently changed a signature (e.g.,\n  `repeat(string, n: Expr | int)`), the example should pass `3` rather than\n  `lit(3)`.\n- Does any example use a deprecated or removed parameter name?\n\nFor drift, propose the updated snippet. If the change is purely stylistic\nand the older form still works, mark the suggestion as **non-blocking**.\n\n### 4. Missing or stale version notes\n\nWhen an API depends on a specific version, the skill should say so —\notherwise an agent referencing the skill in an older project will write\ncode that fails at import or at runtime.\n\n`datafusion-python` shares its major version number with the upstream\n`datafusion` crate (e.g., `datafusion-python 53.x` tracks upstream\n`datafusion 53`). Always express version requirements in terms of\n`datafusion-python` only — there is no need to call out upstream and\npackage versions separately.\n\nAdd a version note when:\n\n- A method or function shown in the skill was added in a specific release\n  (e.g., a new `DataFrame` method that didn't exist before 53).\n- A breaking change altered behavior in a specific release (signature\n  change, default-value change, new required argument).\n- A pitfall was fixed in a specific release. Either annotate the pitfall\n  block with \"fixed in datafusion-python NN, kept here for users on older\n  versions\" or remove it once the supported floor moves past that version.\n\nFormat for version notes (inline, italicized):\n\n```markdown\n*Requires datafusion-python 53 or newer.*\n```\n\nFor each missing\u002Fstale version note, propose the exact line and where it\nbelongs.\n\n## How to discover changes since the last audit\n\nIf the user supplies a previous version or commit SHA where the audit was\nlast run, diff against it:\n\n```bash\n# Public-API-relevant changes since SHA \u003Cprev>\ngit log --oneline \u003Cprev>..HEAD -- python\u002Fdatafusion\u002F\n\n# Whose signatures actually moved\ngit diff \u003Cprev>..HEAD -- python\u002Fdatafusion\u002Ffunctions.py | grep '^[+-]def '\n```\n\nIf no prior audit point is given, fall back to \"since the last upstream\nsync\" by inspecting commits that touch `Cargo.toml`'s `datafusion` pin:\n\n```bash\ngit log --oneline -- Cargo.toml | grep -i datafusion | head -5\n```\n\n## Output Format\n\nProduce a report grouped by scope. Each finding is one bullet with a\nproposed action, so a maintainer can review the list quickly and apply\nedits in order.\n\n```\n## SKILL.md Audit (scope: \u003Cscope>)\n\nAudited against:\n- skills\u002Fdatafusion_python\u002FSKILL.md @ \u003Cgit SHA \u002F \"working tree\">\n- datafusion-python \u003Cversion>\n\n### New APIs to cover\n- `DataFrame.foo()` — added in datafusion-python 53. Insert in \"DataFrame Operations Quick Reference\" under \u003Csubsection>.\n  Proposed snippet:\n  ```python\n  df.foo(...)\n  ```\n\n### Stale mentions\n- \"old_function_name\" referenced in the categorized list (line N) — renamed to \"new_function_name\". Replace.\n\n### Drifted examples\n- \"Filtering\" section, `df.filter(col(\"a\") > lit(10))` — drop `lit(10)`, auto-wrap applies. (non-blocking)\n- \"Aggregation\" section, `df.aggregate([col(\"region\")], ...)` — pass `\"region\"` as a plain string per \"Projection\" guidance.\n\n### Version notes\n- `DataFrame.foo()` block needs *Requires datafusion-python 53 or newer.*\n- \"Common Pitfalls\" #N — fixed in datafusion-python 53; remove the pitfall and update the SQL-to-DataFrame row to no longer flag the workaround.\n\n### No-change confirmed\n- `SessionContext` data-loading section — all entries match current API.\n```\n\nIf asked to apply the changes, edit `skills\u002Fdatafusion_python\u002FSKILL.md`\ndirectly with `Edit` tool calls, one finding at a time, and re-run the\nrelevant doctest sanity check at the end:\n\n```bash\npytest --doctest-modules python\u002Fdatafusion -q\n```\n\n## What NOT to flag\n\n- **Internal helpers \u002F underscored names.** Private symbols are not part of\n  the user-facing surface.\n- **Functions intentionally omitted.** Niche \u002F advanced APIs (custom\n  catalogs, raw FFI plumbing, low-level execution plan accessors) live in\n  the API reference, not the skill. If an omission was deliberate and a\n  comment \u002F commit explains why, leave it out.\n- **Style nits inside explanatory prose.** The skill mixes example code and\n  prose; only enforce the pythonic style on actual code blocks.\n- **Function-by-function coverage of every `functions.py` symbol.** The\n  \"Available Functions (Categorized)\" list is curated by category, not\n  exhaustive. Adding a single new aggregate to the aggregate list is\n  enough — the user follows the pointer to the API reference for the rest.\n\n## Coordination with other skills\n\n- Run `\u002Fcheck-upstream` first to expose any missing upstream APIs into the\n  Python layer. Without that, this skill cannot recommend documenting\n  something that is not yet exposed.\n- Run `\u002Fmake-pythonic` before this skill if a Pythonic-signature pass is\n  planned for a release — that way this skill can update examples to the\n  final signature in one shot rather than churning them twice.\n- The order during an upstream sync (PR 3 of `dev\u002Frelease\u002Fupstream-sync.md`)\n  is therefore: `\u002Fcheck-upstream` → `\u002Fmake-pythonic` (optional) →\n  `\u002Faudit-skill-md`.\n",{},"main","878e5d3b8d373bca19671af43e49dfb1890f8da2",".ai\u002Fskills\u002Faudit-skill-md",184,"https:\u002F\u002Fgithub.com\u002Fapache\u002Fdatafusion-python","https:\u002F\u002Fdatafusion.apache.org\u002Fpython","https:\u002F\u002Fgithub.com\u002Fapache","https:\u002F\u002Fwww.apache.org\u002F","2026-11-09 03:42:43",{"source":7,"skillName":5,"commands":39,"prompt":49,"zipAvailable":50},[40,43,46],{"tool":41,"command":42},"npx","npx skills add apache\u002Fdatafusion-python --skill audit-skill-md",{"tool":44,"command":45},"bunx","bunx skills add apache\u002Fdatafusion-python --skill audit-skill-md",{"tool":47,"command":48},"pnpm","pnpm dlx skills add apache\u002Fdatafusion-python --skill audit-skill-md","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fapache\u002Fdatafusion-python\u002Fblob\u002Fmain\u002F.ai\u002Fskills\u002Faudit-skill-md\u002FSKILL.md",true,[],[53,82,89,100],{"skillNo":54,"name":55,"nameZh":6,"description":56,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":57,"categories":58,"keywords":73,"publishedAt":24},"01M6ACM3GXZHMNHNE4DHDBBXVK","datafusion-python","Use when the user is writing datafusion-python (Apache DataFusion Python bindings) DataFrame or SQL code. Covers imports, data loading, DataFrame operations, expression building, SQL-to-DataFrame mappings, idiomatic patterns, and common pitfalls.","https:\u002F\u002Fgithub.com\u002Fapache\u002Fdatafusion-python\u002Fblob\u002Fmain\u002Fskills\u002Fdatafusion_python\u002FSKILL.md",[59,62,65,70],{"categoryNo":60,"categoryName":61,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000010","后端与接口",{"categoryNo":63,"categoryName":64,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000018","写作与文案",{"categoryNo":66,"categoryName":67,"taxonomyType":68,"taxonomyTypeDesc":69},"01JBSEEDCAT000000000000033","数据分析师","PROFESSION","适用职业",{"categoryNo":71,"categoryName":72,"taxonomyType":68,"taxonomyTypeDesc":69},"01JBSEEDCAT000000000000036","内容创作者",[74,75,76,77,78,8,79,80,81],"datafusion python","datafusion","python","writing","dataframe","data loading","code","sql",{"skillNo":83,"name":84,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":85,"categories":86,"keywords":87,"publishedAt":24},"01M6ACM17FMWAHVBVMWQZ816NF","make-pythonic","https:\u002F\u002Fgithub.com\u002Fapache\u002Fdatafusion-python\u002Fblob\u002Fmain\u002F.ai\u002Fskills\u002Fmake-pythonic\u002FSKILL.md",[],[88],"make pythonic",{"skillNo":90,"name":91,"nameZh":6,"description":92,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":93,"categories":94,"keywords":95,"publishedAt":24},"01M6ACKZ12QZPH2YSN7ENQW13J","ffi-capsule-protocol","TRIGGER — read before adding, changing, or reviewing any __datafusion_*__ capsule getter, any FFI_* export that asks for a TaskContextProvider or an extension codec, or any code that calls FFI_QueryPlanner::new \u002F FFI_TableProvider::new \u002F FFI_{Logical,Physical}ExtensionCodec::new. These methods are one protocol with a settled convention. Do not design it fresh; do not construct a SessionContext inside an extension library.","https:\u002F\u002Fgithub.com\u002Fapache\u002Fdatafusion-python\u002Fblob\u002Fmain\u002F.ai\u002Fskills\u002Fffi-capsule-protocol\u002FSKILL.md",[],[96,97,75,80,98,99],"protocol","ffi capsule protocol","review","design",{"skillNo":101,"name":102,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":103,"categories":104,"keywords":105,"publishedAt":24},"01M6ACKX5JQ505Q8YX7BJTGQBM","check-upstream","https:\u002F\u002Fgithub.com\u002Fapache\u002Fdatafusion-python\u002Fblob\u002Fmain\u002F.ai\u002Fskills\u002Fcheck-upstream\u002FSKILL.md",[],[106],"check upstream"]