dotfiles/.claude/skills/av-false-positive/SKILL.md
Scan a release on VirusTotal and generate false positive submission instructions for flagged AV vendors.
npx skillsauth add kdeldycke/dotfiles av-false-positiveInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
!gh repo view --json nameWithOwner --jq '.nameWithOwner' 2>/dev/null
!gh release view --json tagName --jq '.tagName' 2>/dev/null
!grep -m1 'license' pyproject.toml 2>/dev/null
!grep -m1 'name' pyproject.toml 2>/dev/null
!grep -A1 '\[project.urls\]' pyproject.toml 2>/dev/null | head -5
Scan release binaries on VirusTotal and generate per-vendor false-positive submission files for any flagged artifacts.
If $ARGUMENTS is empty, use the latest release tag from the context above. Otherwise treat $ARGUMENTS as the version (accept both 6.2.1 and v6.2.1; normalize to bare version for filenames, v-prefixed for tags per CLAUDE.md § Version formatting).
Detect the repository from the context (nameWithOwner). Extract the project name, license, and homepage URL from pyproject.toml.
List all release assets:
$ gh release view v{VERSION} --json assets --jq '.assets[].name'
Use the scan-virustotal CLI command for the upload. But to get per-engine detection details (which the CLI does not expose), also query the VT API directly via Python with the vt library.
The VT API key comes from: $VIRUSTOTAL_API_KEY env var, or ask the user.
For each binary artifact (.bin, .exe):
gh release download.GET /api/v3/files/{sha256} to see if VT already has results.POST /api/v3/files.GET /api/v3/analyses/{id} until status == "completed".For each artifact, record:
https://www.virustotal.com/gui/file/{sha256}Also record the VT report URLs for the clean .whl and .tar.gz source distributions (used as evidence in every submission).
Print a markdown table:
| Artifact | Detections | VT report | Verdict |
| ---------- | ---------- | --------- | -------------------- |
| filename | N/M | [link] | Clean / FP (engines) |
For each vendor in § Vendor definitions, check if any artifacts were flagged by that vendor's engine(s). If so, generate fp-submission-{vendor}.md at the project root.
Only generate a file for a vendor if at least one artifact was flagged by that vendor.
Each submission file must be optimized for copy-paste. The maintainer should be able to work through each submission without scrolling back or cross-referencing. Concretely:
## Submission N section with --- separators.All submission text blocks must derive project details from pyproject.toml and git metadata:
[project] name.[project] license.[project.urls].git config user.name or [project] authors.Microsoft)## Submission N section per flagged binary.category == "malicious". Windows ARM64 binaries are typically not flagged by Microsoft (only by MaxSecure), so check before including.Wacatac variants): include them if detected.| Field | Value |
| -------------------------------------------------------------------- | ------------------------------------------------------------- |
| Microsoft security product used to scan the file | Microsoft Defender Antivirus (Windows 10) or (Windows 11) |
| Company Name | Maintainer name from project metadata |
| Do you have a Microsoft support case number? | No |
| Select the file | Upload the exact filename |
| Should this file be removed from our database at a certain date? | No |
| What do you believe this file is? | Incorrectly detected as malware/malicious |
| Detection name | Exact detection name for this binary |
| Definition version | (leave blank) |
| Additional information | Paste the text below |
.whl and .tar.gz VT links, GitHub release link, project URL, PyPI URL, license, previous FP reference if found.microsoft.com and wdsiprod.westus.cloudapp.azure.com, sign back in, submit immediately. Also check the URL doesn't have a duplicated ?persona=SoftwareDeveloper&persona=SoftwareDeveloper parameter.BitDefender, ALYac, Arcabit, Emsisoft, GData, MicroWorld-eScan, VIPRE)BitDefender engine itself (not downstream).| Field | Value |
| -------------------------------- | ------------------------------------------------------------------ |
| Select the category | False Positive |
| Full Name | Maintainer name from project metadata |
| E-mail | (user's email) |
| Sample type | File |
| Attach a file | Upload the exact filename |
| Detection name | Exact detection name |
| Description | Paste the pre-written text |
| Sensitive files / Screenshot | Screenshot of the VT report page showing the BitDefender detection |
## Submission N section per binary.ESET-NOD32)[email protected]infected).False positive: {detection_name} in {Project Name} {VERSION}Symantec).exe or .bin file uploads. The file upload field only accepts images, logs, and text files (for supporting evidence). Use hash submission instead.Binary 1:, Binary 2:) so the text remains readable even when flattened.Product Details:
| Field | Value |
| --------------------------------- | --------------------------------------------------------------------------------------------------------------------- |
| Which product were you using? | Symantec Endpoint Protection 16.x (avoid "Don't know": it maps to UNKNOWN in their tracking system) |
| When did the detection occur? | When downloading or uploading a file |
| Which type of detection? | Download/File Insight (Reputation Based Detection) (best match for ML.Attribute.* detections; avoid "Don't know") |
| Detection Name | Exact detection name |
Submission Details:
| Field | Value |
| ------------------- | ------------------------------------------ |
| Submission Type | Provide an MD5 or SHA-256 hash of a file |
| File Hash | SHA256 of first binary |
Additional Information (expand the collapsed section):
| Field | Value |
| ----------------------------- | ------------------------- |
| Recurring False Positive? | Yes |
| Business Impact? | Medium |
| Application Type? | Third Party Application |
Then paste the description text listing all binaries with SHA256, VT links, clean source VT links, and GitHub release link.
Your Details:
| Field | Value | | ------------------ | ------------------------------------- | | Contact Name | Maintainer name from project metadata | | Email Address | (user's email) | | Site ID Number | (leave blank) |
Avast, AVG)## Submission N section per binary with all details inline.Sophos)| Field | Value |
| ---------------------------------------- | -------------------------- |
| First Name | Maintainer first name |
| Last Name | Maintainer last name |
| Country | (user's country) |
| Email Address | (user's email) |
| About You | Using a free product |
| Operating System | Windows |
| Why do you want to send this sample? | Paste the pre-written text |
| File | Upload the exact filename |
## Submission N section per binary.Every binary entry in every submission file must include:
https://www.virustotal.com/gui/file/{sha256}).whl and .tar.gz (as comparison evidence)https://github.com/{owner/repo}/releases/tag/v{VERSION})https://github.com/{owner/repo}/releases/download/v{VERSION}/{filename})Pre-written text blocks must mention: Nuitka --onefile compilation, open-source project, GitHub and PyPI URLs, license from pyproject.toml, and the previous FP issue reference if one was found in the repo's GitHub issues.
Sabsik, Wacatac) are the most impactful to fix.Download all artifacts that appear in any submission file to $TMPDIR using gh release download with --pattern flags. These are needed for manual upload to vendor portals.
Print a summary of what was generated:
fp-submission-*.md files were created (and which vendors were skipped because they had no detections)tools
Create or update an upstream contributions page (docs/upstream.md) tracking the project's relationship with its dependencies. Discovers merged PRs, reported issues, workarounds, and declined features.
documentation
Detect stale translations in readme.*.md and contributing.*.md files by comparing structure and content against the English source, then draft updated translations for changed sections.
testing
Two-way comparison and synchronization of Sphinx documentation across sibling projects. Discovers discrepancies in conf.py, install.md, index.md toctree, pyproject.toml docs dependencies, extra-deps sections, readme badges, and static assets. Use when you want to align documentation structure, catch stale dependencies, or push improvements across your Sphinx-enabled repositories.
tools
Optimize GitHub topics for discoverability by analyzing competition on topic pages.