[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M73K6FSWNVJ8RZFBR7QV3991":3,"skill-same:01M73K6FSWNVJ8RZFBR7QV3991":48},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":19,"linkOnly":20,"markdownContent":21,"markdownBody":22,"frontMatter":23,"refName":24,"commitSha":25,"skillDirectory":26,"forksCount":27,"repositoryHtmlUrl":28,"repositoryHomepageUrl":29,"ownerHtmlUrl":30,"ownerBlogUrl":31,"ownerDescription":32,"updatedAt":33,"install":34,"resources":47},"01M73K6FSWNVJ8RZFBR7QV3991","vcf-variant-filtering",null,"Guide to quality filtering raw VCF files before computing summary stats (Ts\u002FTv ratio, variant counts, AF distributions). Covers detecting raw VCFs via FILTER column and QUAL inspection, QUAL-based filtering with bcftools, Ts\u002FTv interpretation, and when NOT to filter. Read before any variant-level QC task. See bcftools-variant-manipulation for advanced filters, gatk-variant-calling for caller config, samtools-bam-processing for upstream alignment QC.","bg-szy\u002FTOP-SKILLS","bg-szy","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F106576190?v=4","01M73A4E8KPV67SFXRY8XZGNBX","ShuZhiyong","01M73A4E96MQ294MHM74TZBVQD",6,"CC-BY-4.0","https:\u002F\u002Fgithub.com\u002Fbg-szy\u002FTOP-SKILLS\u002Fblob\u002Fmaster\u002Fskills\u002Fawesome-skills\u002Fvcf-variant-filtering\u002FSKILL.md",[],[],"2026-11-11 15:11:14",false,"---\nname: vcf-variant-filtering\ndescription: \"Guide to quality filtering raw VCF files before computing summary stats (Ts\u002FTv ratio, variant counts, AF distributions). Covers detecting raw VCFs via FILTER column and QUAL inspection, QUAL-based filtering with bcftools, Ts\u002FTv interpretation, and when NOT to filter. Read before any variant-level QC task. See bcftools-variant-manipulation for advanced filters, gatk-variant-calling for caller config, samtools-bam-processing for upstream alignment QC.\"\nlicense: CC-BY-4.0\n---\n\n# VCF Variant Filtering Guide\n\n## Overview\n\nRaw VCF files produced by variant callers (GATK HaplotypeCaller, bcftools mpileup, DeepVariant, etc.) contain a mixture of true variants and artifacts from sequencing errors, alignment issues, and low-coverage regions. Computing summary statistics -- Ts\u002FTv ratio, variant counts, allele frequency distributions -- on unfiltered data yields unreliable results because false-positive calls disproportionately inflate transversion counts and depress the Ts\u002FTv ratio. This guide covers how to detect whether a VCF is raw, how to apply appropriate quality filters, when filtering is not appropriate, and how to interpret the resulting statistics correctly.\n\n## Key Concepts\n\n### VCF Quality Scores (QUAL Field)\n\nThe QUAL column in a VCF file represents the Phred-scaled probability that the variant site is polymorphic. A QUAL score of 30 means a 1-in-1000 chance the call is wrong; a QUAL of 20 means 1-in-100. Variant callers assign QUAL scores based on read evidence, base qualities, and mapping qualities. Low-QUAL variants (below 20-30) are enriched for sequencing errors and alignment artifacts. Filtering on QUAL is the simplest and most widely used first-pass quality control step.\n\nCommon QUAL thresholds and their interpretation:\n\n| QUAL Score | Error Probability | Typical Use |\n|------------|------------------|-------------|\n| 10 | 1 in 10 | Very permissive; rarely appropriate for final calls |\n| 20 | 1 in 100 | Lenient filtering; useful for somatic calling with supporting evidence |\n| 30 | 1 in 1,000 | Standard default for germline variant filtering |\n| 50 | 1 in 100,000 | Stringent; used in clinical or high-confidence applications |\n| 100+ | Extremely low | Highly supported variants; may over-filter low-coverage regions |\n\nFor GATK-based workflows, VQSR or hard filtering on INFO annotations (QD, FS, MQ, etc.) may supplement or replace QUAL filtering. GATK's recommended hard filters for SNPs include QD \u003C 2.0, FS > 60.0, MQ \u003C 40.0, MQRankSum \u003C -12.5, and ReadPosRankSum \u003C -8.0.\n\n### Ts\u002FTv Ratio Significance\n\nThe transition-to-transversion (Ts\u002FTv) ratio is a key quality metric for variant call sets. Transitions (A\u003C->G, C\u003C->T) are chemically favored over transversions (all other substitutions) due to the molecular structure of nucleotide bases. Expected Ts\u002FTv values serve as benchmarks:\n\n- Whole-genome sequencing (WGS): approximately 2.0-2.1\n- Whole-exome sequencing (WES): approximately 2.8-3.3 (higher due to CpG enrichment in coding regions)\n- Raw\u002Funfiltered call sets: often 1.5-1.8 or lower\n\nA Ts\u002FTv ratio significantly below the expected range indicates contamination by false-positive transversion calls, which are the hallmark of sequencing errors. After proper quality filtering, the Ts\u002FTv ratio should rise to the expected range for the assay type.\n\n### Raw vs Filtered VCFs\n\nA \"raw\" VCF is the direct output of a variant caller before any quality filtering has been applied. A \"filtered\" VCF has had quality thresholds applied, either by hard filtering (QUAL, DP, QD, etc.) or by model-based filtering (GATK VQSR, CNN). Distinguishing between the two is critical because computing statistics on raw data without disclosure leads to incorrect conclusions.\n\nIndicators that a VCF is raw or unfiltered:\n\n- The filename contains \"raw\" (e.g., `sample_raw_variants.vcf`)\n- The FILTER column contains only `.` (missing) for all records\n- A large fraction of variants have QUAL scores below 30\n- The Ts\u002FTv ratio is well below the expected range for the assay type\n\nIndicators that a VCF has already been filtered:\n\n- The FILTER column contains meaningful values (`PASS`, `LowQual`, `VQSRTrancheSNP99.90to100.00`)\n- A filter command is recorded in the VCF header (`##FILTER=` and `##bcftools_viewCommand=` lines)\n\n### FILTER Column Semantics\n\nThe FILTER column in VCF format has specific semantics defined by the VCF specification:\n\n- `.` (dot) -- filter status has not been applied; the variant is unassessed\n- `PASS` -- the variant passed all filters\n- Any other value -- the variant failed the named filter(s); multiple filters are semicolon-separated\n\nA common misconception is that `.` means the variant passed. In reality, `.` means no filter has been evaluated, so the variant's quality is unknown. Another misconception is that `PASS` in every row means the file is unfiltered -- some callers (e.g., DeepVariant) mark all emitted variants as PASS because they only output high-confidence calls.\n\nTo inspect the FILTER column programmatically:\n\n```bash\n# Count occurrences of each FILTER value\nbcftools query -f '%FILTER\\n' input.vcf | sort | uniq -c | sort -rn | head\n\n# Check if any non-'.' FILTER values exist\nbcftools query -f '%FILTER\\n' input.vcf | grep -v '^\\.$' | head\n```\n\nUnderstanding the FILTER column is the first step in any VCF quality assessment. Always inspect it before deciding whether additional filtering is needed.\n\n## Pre-flight Interview\n\nSettle these with the user before writing any analysis code.\n\n```yaml\ndecisions:\n  - id: D1\n    param: analysisGoal\n    kind: required\n    source: user\n    ask: \"What is the filtered call set for - a rare-disease search, a somatic variant list, a population study, or a genotyping panel?\"\n    default: null\n\n  - id: D2\n    param: filteringApproach\n    kind: required\n    source: user\n    depends_on: [D1]\n    ask: \"Fixed hard thresholds, or a recalibration model trained on the cohort?\"\n    default: \"hard filters; recalibration needs a cohort large enough to train on\"\n\n  - id: D3\n    param: qualityThresholds\n    kind: required\n    source: user\n    depends_on: [D2]\n    ask: \"Where should depth, genotype quality, and strand-bias cuts sit?\"\n    default: null\n\n  - id: D4\n    param: frequencyFilter\n    kind: required\n    source: user\n    depends_on: [D1]\n    ask: \"Should variants common in reference populations be removed, and at what frequency?\"\n    default: \"no frequency filter\"\n\n  - id: D5\n    param: consequenceFilter\n    kind: required\n    source: user\n    depends_on: [D1]\n    ask: \"Should the set be restricted by predicted consequence - coding only, high-impact only, or everything?\"\n    default: \"everything\"\n\n  - id: D6\n    param: inheritanceModel\n    kind: optional_conditional\n    source: user\n    depends_on: [D1]\n    ask: \"Is there a family structure to filter on - de novo, recessive, compound heterozygous?\"\n    default: \"none\"\n    skip_if: \"single unrelated sample\"\n```\n\nEvery decision here hangs on D1, and that is the point: there is no generally\ncorrect filter. A rare-disease search removes anything common in the\npopulation; a population-genetics study needs exactly those variants kept.\nApplying a remembered threshold set without asking what the call set is for\nsilently answers a different question.\n\n## Decision Framework\n\n```\nIs the VCF raw or unfiltered?\n├── Yes (FILTER='.', many low-QUAL variants)\n│   ├── Does the user ask for RAW statistics specifically?\n│   │   ├── Yes → Do NOT filter; compute on data as-is, note it is raw\n│   │   └── No → Apply QUAL>=30 filter before computing statistics\n│   └── Does the user specify a custom threshold?\n│       ├── Yes → Use their threshold\n│       └── No → Default to QUAL>=30\n├── No (FILTER has PASS\u002Fother values, filtered header present)\n│   ├── Does the user ask for additional filtering?\n│   │   ├── Yes → Apply requested filter\n│   │   └── No → Compute statistics on existing filtered set\n│   └── Does the Ts\u002FTv ratio look suspicious despite filtering?\n│       └── Yes → Investigate; may need stricter thresholds\n└── Uncertain\n    └── Inspect FILTER column and QUAL distribution to determine status\n```\n\n| Scenario | Action | Rationale |\n|----------|--------|-----------|\n| Raw VCF, general statistics requested | Apply QUAL>=30 before computing | Low-QUAL variants are enriched for errors and bias all statistics |\n| Raw VCF, user explicitly asks for raw stats | Compute as-is, report that data is unfiltered | Respect the user's intent; they may be evaluating caller performance |\n| Raw VCF, user specifies threshold (e.g., QUAL>=50) | Use the user-specified threshold | User has domain-specific requirements |\n| Pre-filtered VCF (FILTER=PASS present) | Compute without additional QUAL filter | Double-filtering may remove true variants unnecessarily |\n| VCF with mixed FILTER values | Filter to PASS-only with `bcftools view -f PASS` | Non-PASS variants were flagged for a reason |\n| VQSR-filtered VCF | Respect existing tranche filtering | VQSR is a more sophisticated filter than simple QUAL thresholds |\n| Small panel or targeted sequencing | Consider lower QUAL threshold (e.g., 20) | Small panels have different error profiles and fewer variants |\n\n## Best Practices\n\n1. **Always inspect the VCF before computing statistics.** Check the FILTER column distribution and QUAL score distribution before running any summary. A 30-second inspection prevents publishing misleading numbers. Use `bcftools query -f '%FILTER\\n' input.vcf | sort | uniq -c | sort -rn | head` to get a quick overview.\n\n2. **Use established CLI tools instead of custom parsers.** bcftools, vcftools, and similar domain-specific tools handle edge cases that custom parsers typically miss: multi-allelic sites, complex variants, missing genotypes, and proper transition\u002Ftransversion classification. Writing a Python parser to count Ts\u002FTv is error-prone and unnecessary.\n\n   ```bash\n   # Preferred: use bcftools for Ts\u002FTv computation\n   bcftools stats input.vcf | grep ^TSTV\n\n   # Preferred: use bcftools for variant counts\n   bcftools stats input.vcf | grep ^SN\n   ```\n\n3. **Report what filtering was applied (or not).** Every time you present VCF summary statistics, state clearly whether the data was filtered, what threshold was used, and how many variants passed. This is essential for reproducibility and for the reader to assess the validity of the results.\n\n4. **Use QUAL>=30 as a sensible default, not a universal rule.** QUAL>=30 (1-in-1000 error rate) is a widely used default for first-pass filtering of germline variant calls. However, different applications may warrant different thresholds: somatic variant calling may use lower thresholds with additional evidence, while clinical applications may demand stricter cutoffs. When in doubt, QUAL>=30 is a defensible starting point.\n\n5. **Combine filtering and statistics in a single pipeline.** Piping the filtered output directly into the statistics command avoids creating intermediate files and ensures you never accidentally compute statistics on the wrong file.\n\n   ```bash\n   # Filter and compute statistics in one pipeline\n   bcftools view -i 'QUAL>=30' input.vcf | bcftools stats - > filtered_stats.txt\n   ```\n\n6. **Validate filtering by checking the Ts\u002FTv ratio.** After filtering, the Ts\u002FTv ratio should be in the expected range for the assay type. If it is still low, consider that the variant caller may have systematic issues, the sample may have quality problems, or a stricter filter is needed.\n\n7. **Preserve the original VCF.** Never overwrite the raw VCF with filtered output. Keep the raw file for auditability and in case you need to re-filter with different parameters.\n\n## Common Pitfalls\n\n1. **Computing statistics on raw VCF files without any filtering.** This is the most common and most consequential mistake. Raw Ts\u002FTv ratios can be 1.5 or lower, suggesting much worse data quality than actually exists, and variant counts will be inflated by thousands of false positives.\n   - *How to avoid*: Always check the FILTER column before computing statistics. If FILTER is `.` for all records, apply QUAL>=30 filtering first.\n\n2. **Assuming FILTER='.' means the variant passed.** The dot in the FILTER column means \"not assessed,\" not \"passed.\" Treating unassessed variants as high-quality leads to inclusion of many false positives.\n   - *How to avoid*: Distinguish between `.` (unassessed), `PASS` (passed all filters), and named filters (failed). Use `bcftools query -f '%FILTER\\n' | sort | uniq -c` to inspect.\n\n3. **Writing custom Python parsers for Ts\u002FTv calculation.** Custom parsers frequently mishandle multi-allelic sites, complex variants, or edge cases in the VCF format. They also tend to be slower than optimized C-based tools.\n   - *How to avoid*: Use `bcftools stats` for Ts\u002FTv computation. It is well-tested, fast, and handles all VCF edge cases correctly.\n\n4. **Double-filtering a VCF that was already filtered.** Applying QUAL>=30 to a VCF that already went through VQSR or hard filtering can remove true variants that were assigned lower QUAL scores by the caller but passed model-based assessment.\n   - *How to avoid*: Inspect the VCF header for filter command records (`##bcftools_viewCommand`, `##GATKCommandLine`) and the FILTER column for non-dot values before adding more filters.\n\n5. **Using the wrong Ts\u002FTv expectation for the assay type.** Comparing a WES Ts\u002FTv of 3.0 against a WGS expectation of 2.1 would incorrectly suggest the data is too good, while comparing a WGS Ts\u002FTv of 2.0 against WES expectations would incorrectly suggest poor quality.\n   - *How to avoid*: Know the expected Ts\u002FTv range for your assay type. WGS: 2.0-2.1; WES: 2.8-3.3; targeted panels: variable depending on target regions.\n\n6. **Forgetting to report the filtering status in results.** Presenting a Ts\u002FTv ratio without stating whether or how the data was filtered makes the number uninterpretable and non-reproducible.\n   - *How to avoid*: Always include a statement like \"Ts\u002FTv computed after QUAL>=30 filtering (N variants passed)\" or \"Ts\u002FTv computed on unfiltered raw calls (N total variants).\"\n\n7. **Filtering on QUAL alone when richer annotations are available.** GATK and other callers provide INFO-level annotations (QD, FS, MQ, SOR, MQRankSum, ReadPosRankSum) that are more informative than QUAL alone. Relying solely on QUAL when these are available leaves quality on the table.\n   - *How to avoid*: Check whether INFO annotations are present. If so, consider GATK hard filtering recommendations or VQSR as a more powerful alternative to simple QUAL filtering.\n\n## Workflow\n\n1. **Inspect the VCF metadata and FILTER column**\n   - Check the VCF header for caller information and existing filter records\n   - Examine the FILTER column distribution\n\n   ```bash\n   # View header for caller and filter information\n   bcftools view -h input.vcf | grep -E '##(FILTER|source|GATKCommandLine|bcftools)'\n\n   # Check FILTER column values\n   bcftools query -f '%FILTER\\n' input.vcf | sort | uniq -c | sort -rn | head\n   ```\n\n2. **Assess QUAL score distribution**\n   - Determine the proportion of low-QUAL variants\n\n   ```bash\n   # Check QUAL distribution\n   bcftools query -f '%QUAL\\n' input.vcf | awk '{if($1\u003C30) low++; else high++} END {print \"QUAL\u003C30:\", low+0, \"QUAL>=30:\", high+0}'\n   ```\n\n   - Decision point: If most variants are QUAL>=30 and FILTER=PASS, skip to Step 4. If FILTER=`.` and many low-QUAL variants exist, proceed to Step 3.\n\n3. **Apply quality filtering**\n   - Use the appropriate threshold (default QUAL>=30 unless otherwise specified)\n\n   ```bash\n   # Apply QUAL>=30 filter\n   bcftools view -i 'QUAL>=30' input.vcf -Oz -o filtered.vcf.gz\n   bcftools index filtered.vcf.gz\n   ```\n\n4. **Compute summary statistics**\n   - Extract Ts\u002FTv ratio, variant counts, and other metrics\n\n   ```bash\n   # Ts\u002FTv ratio from filtered VCF\n   bcftools view -i 'QUAL>=30' input.vcf | bcftools stats - | grep ^TSTV | cut -f5\n\n   # Full summary numbers\n   bcftools view -i 'QUAL>=30' input.vcf | bcftools stats - | grep ^SN\n\n   # Per-sample statistics\n   bcftools stats -s - input.vcf | grep ^PSC\n   ```\n\n5. **Compare before and after filtering**\n   - Count variants before and after to quantify the impact of filtering\n\n   ```bash\n   # Count variants before filtering\n   bcftools view -H input.vcf | wc -l\n\n   # Count variants after filtering\n   bcftools view -i 'QUAL>=30' input.vcf | bcftools view -H | wc -l\n\n   # Compare Ts\u002FTv before and after\n   echo \"=== Before filtering ===\"\n   bcftools stats input.vcf | grep ^TSTV\n   echo \"=== After QUAL>=30 filtering ===\"\n   bcftools view -i 'QUAL>=30' input.vcf | bcftools stats - | grep ^TSTV\n   ```\n\n6. **Validate and report**\n   - Check that Ts\u002FTv is within the expected range for the assay type (WGS: 2.0-2.1, WES: 2.8-3.3)\n   - If Ts\u002FTv is still below expected range after filtering, investigate sample quality or consider stricter thresholds\n   - Report the filtering applied, number of variants before and after, and the resulting statistics\n   - Include the bcftools command used so the analysis is fully reproducible\n\n## Protocol Guidelines\n\n1. **Pre-analysis inspection is non-negotiable.** Before any VCF analysis, run `bcftools query -f '%FILTER\\n'` and examine the QUAL distribution. This takes seconds and prevents hours of wasted analysis on unreliable data.\n\n2. **Default to QUAL>=30 for unlabeled VCFs.** When the filtering status is ambiguous and the user has not specified a threshold, QUAL>=30 is the standard community default. Document this choice explicitly in the output.\n\n3. **Never silently filter.** If you apply filtering, always report it. If you choose not to filter, state why. Transparency in filtering decisions is fundamental to reproducible genomics.\n\n4. **Use piped commands for efficiency.** Chain `bcftools view` and `bcftools stats` in a pipe rather than writing intermediate files. This is faster, uses less disk, and reduces the chance of analyzing the wrong file.\n\n5. **Verify with Ts\u002FTv as a sanity check.** After any filtering operation, compute Ts\u002FTv as a quality control metric. If the ratio does not improve or remains outside the expected range, reassess the filtering strategy or investigate upstream data quality issues.\n\n## Further Reading\n\n- [bcftools documentation](https:\u002F\u002Fsamtools.github.io\u002Fbcftools\u002F) -- Comprehensive reference for bcftools commands, filtering expressions, and statistics output format\n- [VCF specification (v4.3+)](https:\u002F\u002Fsamtools.github.io\u002Fhts-specs\u002FVCFv4.3.pdf) -- Formal definition of VCF format including FILTER column semantics, QUAL field, and INFO annotations\n- [GATK Best Practices for Germline Short Variant Discovery](https:\u002F\u002Fgatk.broadinstitute.org\u002Fhc\u002Fen-us\u002Farticles\u002F360035535932-Germline-short-variant-discovery-SNPs-Indels) -- Recommended filtering strategies including VQSR and hard filtering thresholds for GATK-called variants\n\n## Related Skills\n\n- `bcftools-variant-manipulation` -- Detailed bcftools usage for subsetting, merging, annotating, and manipulating VCF files beyond simple filtering\n- `gatk-variant-calling` -- Upstream variant calling with GATK HaplotypeCaller, including VQSR and hard filtering configuration\n- `samtools-bam-processing` -- BAM file quality control and processing steps that precede variant calling and affect downstream VCF quality\n","# VCF Variant Filtering Guide\n\n## Overview\n\nRaw VCF files produced by variant callers (GATK HaplotypeCaller, bcftools mpileup, DeepVariant, etc.) contain a mixture of true variants and artifacts from sequencing errors, alignment issues, and low-coverage regions. Computing summary statistics -- Ts\u002FTv ratio, variant counts, allele frequency distributions -- on unfiltered data yields unreliable results because false-positive calls disproportionately inflate transversion counts and depress the Ts\u002FTv ratio. This guide covers how to detect whether a VCF is raw, how to apply appropriate quality filters, when filtering is not appropriate, and how to interpret the resulting statistics correctly.\n\n## Key Concepts\n\n### VCF Quality Scores (QUAL Field)\n\nThe QUAL column in a VCF file represents the Phred-scaled probability that the variant site is polymorphic. A QUAL score of 30 means a 1-in-1000 chance the call is wrong; a QUAL of 20 means 1-in-100. Variant callers assign QUAL scores based on read evidence, base qualities, and mapping qualities. Low-QUAL variants (below 20-30) are enriched for sequencing errors and alignment artifacts. Filtering on QUAL is the simplest and most widely used first-pass quality control step.\n\nCommon QUAL thresholds and their interpretation:\n\n| QUAL Score | Error Probability | Typical Use |\n|------------|------------------|-------------|\n| 10 | 1 in 10 | Very permissive; rarely appropriate for final calls |\n| 20 | 1 in 100 | Lenient filtering; useful for somatic calling with supporting evidence |\n| 30 | 1 in 1,000 | Standard default for germline variant filtering |\n| 50 | 1 in 100,000 | Stringent; used in clinical or high-confidence applications |\n| 100+ | Extremely low | Highly supported variants; may over-filter low-coverage regions |\n\nFor GATK-based workflows, VQSR or hard filtering on INFO annotations (QD, FS, MQ, etc.) may supplement or replace QUAL filtering. GATK's recommended hard filters for SNPs include QD \u003C 2.0, FS > 60.0, MQ \u003C 40.0, MQRankSum \u003C -12.5, and ReadPosRankSum \u003C -8.0.\n\n### Ts\u002FTv Ratio Significance\n\nThe transition-to-transversion (Ts\u002FTv) ratio is a key quality metric for variant call sets. Transitions (A\u003C->G, C\u003C->T) are chemically favored over transversions (all other substitutions) due to the molecular structure of nucleotide bases. Expected Ts\u002FTv values serve as benchmarks:\n\n- Whole-genome sequencing (WGS): approximately 2.0-2.1\n- Whole-exome sequencing (WES): approximately 2.8-3.3 (higher due to CpG enrichment in coding regions)\n- Raw\u002Funfiltered call sets: often 1.5-1.8 or lower\n\nA Ts\u002FTv ratio significantly below the expected range indicates contamination by false-positive transversion calls, which are the hallmark of sequencing errors. After proper quality filtering, the Ts\u002FTv ratio should rise to the expected range for the assay type.\n\n### Raw vs Filtered VCFs\n\nA \"raw\" VCF is the direct output of a variant caller before any quality filtering has been applied. A \"filtered\" VCF has had quality thresholds applied, either by hard filtering (QUAL, DP, QD, etc.) or by model-based filtering (GATK VQSR, CNN). Distinguishing between the two is critical because computing statistics on raw data without disclosure leads to incorrect conclusions.\n\nIndicators that a VCF is raw or unfiltered:\n\n- The filename contains \"raw\" (e.g., `sample_raw_variants.vcf`)\n- The FILTER column contains only `.` (missing) for all records\n- A large fraction of variants have QUAL scores below 30\n- The Ts\u002FTv ratio is well below the expected range for the assay type\n\nIndicators that a VCF has already been filtered:\n\n- The FILTER column contains meaningful values (`PASS`, `LowQual`, `VQSRTrancheSNP99.90to100.00`)\n- A filter command is recorded in the VCF header (`##FILTER=` and `##bcftools_viewCommand=` lines)\n\n### FILTER Column Semantics\n\nThe FILTER column in VCF format has specific semantics defined by the VCF specification:\n\n- `.` (dot) -- filter status has not been applied; the variant is unassessed\n- `PASS` -- the variant passed all filters\n- Any other value -- the variant failed the named filter(s); multiple filters are semicolon-separated\n\nA common misconception is that `.` means the variant passed. In reality, `.` means no filter has been evaluated, so the variant's quality is unknown. Another misconception is that `PASS` in every row means the file is unfiltered -- some callers (e.g., DeepVariant) mark all emitted variants as PASS because they only output high-confidence calls.\n\nTo inspect the FILTER column programmatically:\n\n```bash\n# Count occurrences of each FILTER value\nbcftools query -f '%FILTER\\n' input.vcf | sort | uniq -c | sort -rn | head\n\n# Check if any non-'.' FILTER values exist\nbcftools query -f '%FILTER\\n' input.vcf | grep -v '^\\.$' | head\n```\n\nUnderstanding the FILTER column is the first step in any VCF quality assessment. Always inspect it before deciding whether additional filtering is needed.\n\n## Pre-flight Interview\n\nSettle these with the user before writing any analysis code.\n\n```yaml\ndecisions:\n  - id: D1\n    param: analysisGoal\n    kind: required\n    source: user\n    ask: \"What is the filtered call set for - a rare-disease search, a somatic variant list, a population study, or a genotyping panel?\"\n    default: null\n\n  - id: D2\n    param: filteringApproach\n    kind: required\n    source: user\n    depends_on: [D1]\n    ask: \"Fixed hard thresholds, or a recalibration model trained on the cohort?\"\n    default: \"hard filters; recalibration needs a cohort large enough to train on\"\n\n  - id: D3\n    param: qualityThresholds\n    kind: required\n    source: user\n    depends_on: [D2]\n    ask: \"Where should depth, genotype quality, and strand-bias cuts sit?\"\n    default: null\n\n  - id: D4\n    param: frequencyFilter\n    kind: required\n    source: user\n    depends_on: [D1]\n    ask: \"Should variants common in reference populations be removed, and at what frequency?\"\n    default: \"no frequency filter\"\n\n  - id: D5\n    param: consequenceFilter\n    kind: required\n    source: user\n    depends_on: [D1]\n    ask: \"Should the set be restricted by predicted consequence - coding only, high-impact only, or everything?\"\n    default: \"everything\"\n\n  - id: D6\n    param: inheritanceModel\n    kind: optional_conditional\n    source: user\n    depends_on: [D1]\n    ask: \"Is there a family structure to filter on - de novo, recessive, compound heterozygous?\"\n    default: \"none\"\n    skip_if: \"single unrelated sample\"\n```\n\nEvery decision here hangs on D1, and that is the point: there is no generally\ncorrect filter. A rare-disease search removes anything common in the\npopulation; a population-genetics study needs exactly those variants kept.\nApplying a remembered threshold set without asking what the call set is for\nsilently answers a different question.\n\n## Decision Framework\n\n```\nIs the VCF raw or unfiltered?\n├── Yes (FILTER='.', many low-QUAL variants)\n│   ├── Does the user ask for RAW statistics specifically?\n│   │   ├── Yes → Do NOT filter; compute on data as-is, note it is raw\n│   │   └── No → Apply QUAL>=30 filter before computing statistics\n│   └── Does the user specify a custom threshold?\n│       ├── Yes → Use their threshold\n│       └── No → Default to QUAL>=30\n├── No (FILTER has PASS\u002Fother values, filtered header present)\n│   ├── Does the user ask for additional filtering?\n│   │   ├── Yes → Apply requested filter\n│   │   └── No → Compute statistics on existing filtered set\n│   └── Does the Ts\u002FTv ratio look suspicious despite filtering?\n│       └── Yes → Investigate; may need stricter thresholds\n└── Uncertain\n    └── Inspect FILTER column and QUAL distribution to determine status\n```\n\n| Scenario | Action | Rationale |\n|----------|--------|-----------|\n| Raw VCF, general statistics requested | Apply QUAL>=30 before computing | Low-QUAL variants are enriched for errors and bias all statistics |\n| Raw VCF, user explicitly asks for raw stats | Compute as-is, report that data is unfiltered | Respect the user's intent; they may be evaluating caller performance |\n| Raw VCF, user specifies threshold (e.g., QUAL>=50) | Use the user-specified threshold | User has domain-specific requirements |\n| Pre-filtered VCF (FILTER=PASS present) | Compute without additional QUAL filter | Double-filtering may remove true variants unnecessarily |\n| VCF with mixed FILTER values | Filter to PASS-only with `bcftools view -f PASS` | Non-PASS variants were flagged for a reason |\n| VQSR-filtered VCF | Respect existing tranche filtering | VQSR is a more sophisticated filter than simple QUAL thresholds |\n| Small panel or targeted sequencing | Consider lower QUAL threshold (e.g., 20) | Small panels have different error profiles and fewer variants |\n\n## Best Practices\n\n1. **Always inspect the VCF before computing statistics.** Check the FILTER column distribution and QUAL score distribution before running any summary. A 30-second inspection prevents publishing misleading numbers. Use `bcftools query -f '%FILTER\\n' input.vcf | sort | uniq -c | sort -rn | head` to get a quick overview.\n\n2. **Use established CLI tools instead of custom parsers.** bcftools, vcftools, and similar domain-specific tools handle edge cases that custom parsers typically miss: multi-allelic sites, complex variants, missing genotypes, and proper transition\u002Ftransversion classification. Writing a Python parser to count Ts\u002FTv is error-prone and unnecessary.\n\n   ```bash\n   # Preferred: use bcftools for Ts\u002FTv computation\n   bcftools stats input.vcf | grep ^TSTV\n\n   # Preferred: use bcftools for variant counts\n   bcftools stats input.vcf | grep ^SN\n   ```\n\n3. **Report what filtering was applied (or not).** Every time you present VCF summary statistics, state clearly whether the data was filtered, what threshold was used, and how many variants passed. This is essential for reproducibility and for the reader to assess the validity of the results.\n\n4. **Use QUAL>=30 as a sensible default, not a universal rule.** QUAL>=30 (1-in-1000 error rate) is a widely used default for first-pass filtering of germline variant calls. However, different applications may warrant different thresholds: somatic variant calling may use lower thresholds with additional evidence, while clinical applications may demand stricter cutoffs. When in doubt, QUAL>=30 is a defensible starting point.\n\n5. **Combine filtering and statistics in a single pipeline.** Piping the filtered output directly into the statistics command avoids creating intermediate files and ensures you never accidentally compute statistics on the wrong file.\n\n   ```bash\n   # Filter and compute statistics in one pipeline\n   bcftools view -i 'QUAL>=30' input.vcf | bcftools stats - > filtered_stats.txt\n   ```\n\n6. **Validate filtering by checking the Ts\u002FTv ratio.** After filtering, the Ts\u002FTv ratio should be in the expected range for the assay type. If it is still low, consider that the variant caller may have systematic issues, the sample may have quality problems, or a stricter filter is needed.\n\n7. **Preserve the original VCF.** Never overwrite the raw VCF with filtered output. Keep the raw file for auditability and in case you need to re-filter with different parameters.\n\n## Common Pitfalls\n\n1. **Computing statistics on raw VCF files without any filtering.** This is the most common and most consequential mistake. Raw Ts\u002FTv ratios can be 1.5 or lower, suggesting much worse data quality than actually exists, and variant counts will be inflated by thousands of false positives.\n   - *How to avoid*: Always check the FILTER column before computing statistics. If FILTER is `.` for all records, apply QUAL>=30 filtering first.\n\n2. **Assuming FILTER='.' means the variant passed.** The dot in the FILTER column means \"not assessed,\" not \"passed.\" Treating unassessed variants as high-quality leads to inclusion of many false positives.\n   - *How to avoid*: Distinguish between `.` (unassessed), `PASS` (passed all filters), and named filters (failed). Use `bcftools query -f '%FILTER\\n' | sort | uniq -c` to inspect.\n\n3. **Writing custom Python parsers for Ts\u002FTv calculation.** Custom parsers frequently mishandle multi-allelic sites, complex variants, or edge cases in the VCF format. They also tend to be slower than optimized C-based tools.\n   - *How to avoid*: Use `bcftools stats` for Ts\u002FTv computation. It is well-tested, fast, and handles all VCF edge cases correctly.\n\n4. **Double-filtering a VCF that was already filtered.** Applying QUAL>=30 to a VCF that already went through VQSR or hard filtering can remove true variants that were assigned lower QUAL scores by the caller but passed model-based assessment.\n   - *How to avoid*: Inspect the VCF header for filter command records (`##bcftools_viewCommand`, `##GATKCommandLine`) and the FILTER column for non-dot values before adding more filters.\n\n5. **Using the wrong Ts\u002FTv expectation for the assay type.** Comparing a WES Ts\u002FTv of 3.0 against a WGS expectation of 2.1 would incorrectly suggest the data is too good, while comparing a WGS Ts\u002FTv of 2.0 against WES expectations would incorrectly suggest poor quality.\n   - *How to avoid*: Know the expected Ts\u002FTv range for your assay type. WGS: 2.0-2.1; WES: 2.8-3.3; targeted panels: variable depending on target regions.\n\n6. **Forgetting to report the filtering status in results.** Presenting a Ts\u002FTv ratio without stating whether or how the data was filtered makes the number uninterpretable and non-reproducible.\n   - *How to avoid*: Always include a statement like \"Ts\u002FTv computed after QUAL>=30 filtering (N variants passed)\" or \"Ts\u002FTv computed on unfiltered raw calls (N total variants).\"\n\n7. **Filtering on QUAL alone when richer annotations are available.** GATK and other callers provide INFO-level annotations (QD, FS, MQ, SOR, MQRankSum, ReadPosRankSum) that are more informative than QUAL alone. Relying solely on QUAL when these are available leaves quality on the table.\n   - *How to avoid*: Check whether INFO annotations are present. If so, consider GATK hard filtering recommendations or VQSR as a more powerful alternative to simple QUAL filtering.\n\n## Workflow\n\n1. **Inspect the VCF metadata and FILTER column**\n   - Check the VCF header for caller information and existing filter records\n   - Examine the FILTER column distribution\n\n   ```bash\n   # View header for caller and filter information\n   bcftools view -h input.vcf | grep -E '##(FILTER|source|GATKCommandLine|bcftools)'\n\n   # Check FILTER column values\n   bcftools query -f '%FILTER\\n' input.vcf | sort | uniq -c | sort -rn | head\n   ```\n\n2. **Assess QUAL score distribution**\n   - Determine the proportion of low-QUAL variants\n\n   ```bash\n   # Check QUAL distribution\n   bcftools query -f '%QUAL\\n' input.vcf | awk '{if($1\u003C30) low++; else high++} END {print \"QUAL\u003C30:\", low+0, \"QUAL>=30:\", high+0}'\n   ```\n\n   - Decision point: If most variants are QUAL>=30 and FILTER=PASS, skip to Step 4. If FILTER=`.` and many low-QUAL variants exist, proceed to Step 3.\n\n3. **Apply quality filtering**\n   - Use the appropriate threshold (default QUAL>=30 unless otherwise specified)\n\n   ```bash\n   # Apply QUAL>=30 filter\n   bcftools view -i 'QUAL>=30' input.vcf -Oz -o filtered.vcf.gz\n   bcftools index filtered.vcf.gz\n   ```\n\n4. **Compute summary statistics**\n   - Extract Ts\u002FTv ratio, variant counts, and other metrics\n\n   ```bash\n   # Ts\u002FTv ratio from filtered VCF\n   bcftools view -i 'QUAL>=30' input.vcf | bcftools stats - | grep ^TSTV | cut -f5\n\n   # Full summary numbers\n   bcftools view -i 'QUAL>=30' input.vcf | bcftools stats - | grep ^SN\n\n   # Per-sample statistics\n   bcftools stats -s - input.vcf | grep ^PSC\n   ```\n\n5. **Compare before and after filtering**\n   - Count variants before and after to quantify the impact of filtering\n\n   ```bash\n   # Count variants before filtering\n   bcftools view -H input.vcf | wc -l\n\n   # Count variants after filtering\n   bcftools view -i 'QUAL>=30' input.vcf | bcftools view -H | wc -l\n\n   # Compare Ts\u002FTv before and after\n   echo \"=== Before filtering ===\"\n   bcftools stats input.vcf | grep ^TSTV\n   echo \"=== After QUAL>=30 filtering ===\"\n   bcftools view -i 'QUAL>=30' input.vcf | bcftools stats - | grep ^TSTV\n   ```\n\n6. **Validate and report**\n   - Check that Ts\u002FTv is within the expected range for the assay type (WGS: 2.0-2.1, WES: 2.8-3.3)\n   - If Ts\u002FTv is still below expected range after filtering, investigate sample quality or consider stricter thresholds\n   - Report the filtering applied, number of variants before and after, and the resulting statistics\n   - Include the bcftools command used so the analysis is fully reproducible\n\n## Protocol Guidelines\n\n1. **Pre-analysis inspection is non-negotiable.** Before any VCF analysis, run `bcftools query -f '%FILTER\\n'` and examine the QUAL distribution. This takes seconds and prevents hours of wasted analysis on unreliable data.\n\n2. **Default to QUAL>=30 for unlabeled VCFs.** When the filtering status is ambiguous and the user has not specified a threshold, QUAL>=30 is the standard community default. Document this choice explicitly in the output.\n\n3. **Never silently filter.** If you apply filtering, always report it. If you choose not to filter, state why. Transparency in filtering decisions is fundamental to reproducible genomics.\n\n4. **Use piped commands for efficiency.** Chain `bcftools view` and `bcftools stats` in a pipe rather than writing intermediate files. This is faster, uses less disk, and reduces the chance of analyzing the wrong file.\n\n5. **Verify with Ts\u002FTv as a sanity check.** After any filtering operation, compute Ts\u002FTv as a quality control metric. If the ratio does not improve or remains outside the expected range, reassess the filtering strategy or investigate upstream data quality issues.\n\n## Further Reading\n\n- [bcftools documentation](https:\u002F\u002Fsamtools.github.io\u002Fbcftools\u002F) -- Comprehensive reference for bcftools commands, filtering expressions, and statistics output format\n- [VCF specification (v4.3+)](https:\u002F\u002Fsamtools.github.io\u002Fhts-specs\u002FVCFv4.3.pdf) -- Formal definition of VCF format including FILTER column semantics, QUAL field, and INFO annotations\n- [GATK Best Practices for Germline Short Variant Discovery](https:\u002F\u002Fgatk.broadinstitute.org\u002Fhc\u002Fen-us\u002Farticles\u002F360035535932-Germline-short-variant-discovery-SNPs-Indels) -- Recommended filtering strategies including VQSR and hard filtering thresholds for GATK-called variants\n\n## Related Skills\n\n- `bcftools-variant-manipulation` -- Detailed bcftools usage for subsetting, merging, annotating, and manipulating VCF files beyond simple filtering\n- `gatk-variant-calling` -- Upstream variant calling with GATK HaplotypeCaller, including VQSR and hard filtering configuration\n- `samtools-bam-processing` -- BAM file quality control and processing steps that precede variant calling and affect downstream VCF quality\n",{"name":5,"license":15,"description":7},"master","fd76f882a04e445e899d5cfb2732f2105ea054ee","skills\u002Fawesome-skills\u002Fvcf-variant-filtering",0,"https:\u002F\u002Fgithub.com\u002Fbg-szy\u002FTOP-SKILLS","https:\u002F\u002Fbg-szy.github.io\u002FTOP-SKILLS\u002F","https:\u002F\u002Fgithub.com\u002Fbg-szy","https:\u002F\u002Fwww.ecust.edu.cn\u002F","a student of East China University of Science and Technology","2026-11-15 03:38:02",{"source":8,"skillName":5,"commands":35,"prompt":45,"zipAvailable":46},[36,39,42],{"tool":37,"command":38},"npx","npx skills add bg-szy\u002FTOP-SKILLS --skill vcf-variant-filtering",{"tool":40,"command":41},"bunx","bunx skills add bg-szy\u002FTOP-SKILLS --skill vcf-variant-filtering",{"tool":43,"command":44},"pnpm","pnpm dlx skills add bg-szy\u002FTOP-SKILLS --skill vcf-variant-filtering","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fbg-szy\u002FTOP-SKILLS\u002Fblob\u002Fmaster\u002Fskills\u002Fawesome-skills\u002Fvcf-variant-filtering\u002FSKILL.md",true,[],[49,59,67,75,84,91],{"skillNo":50,"name":51,"nameZh":6,"description":52,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":53,"licenseFileUrl":54,"sourceHtmlUrl":55,"categories":56,"keywords":57,"publishedAt":58},"01M748668J70YKWKS2VFVZ0ZRF","xlsx","Use this skill any time a spreadsheet file is the primary input or output. This means any task where the user wants to: open, read, edit, or fix an existing .xlsx, .xlsm, .xltx, .csv, or .tsv file (e.g., adding columns, computing formulas, formatting, charting, cleaning messy data); create a new spreadsheet from scratch or from other data sources; or convert between tabular file formats. Trigger especially when the user references a spreadsheet file by name or path — even casually (like \"the xlsx in my downloads\") — and wants something done to it or produced from it. Also trigger for cleaning or restructuring messy tabular data files (malformed rows, misplaced headers, junk data) into proper spreadsheets. The deliverable must be a spreadsheet file. Do NOT trigger when the primary deliverable is a Word document, HTML report, standalone Python script, database pipeline, or Google Sheets API integration, even if tabular data is involved.","Apache-2.0","https:\u002F\u002Fgithub.com\u002Fbg-szy\u002FTOP-SKILLS\u002Fblob\u002Fmaster\u002Fskills\u002Fskills\u002Fxlsx\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fbg-szy\u002FTOP-SKILLS\u002Fblob\u002Fmaster\u002Fskills\u002Fskills\u002Fxlsx\u002FSKILL.md",[],[],"2026-11-12 13:55:43",{"skillNo":60,"name":61,"nameZh":6,"description":62,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":53,"licenseFileUrl":63,"sourceHtmlUrl":64,"categories":65,"keywords":66,"publishedAt":58},"01M747X09GNGYJ7V4YE3NGGH7A","pptx","Use this skill any time a .pptx or .potx file is involved in any way — as input, output, or both. This includes: creating slide decks, pitch decks, or presentations; reading, parsing, or extracting text from any .pptx or .potx file (even if the extracted content will be used elsewhere, like in an email or summary); editing, modifying, or updating existing presentations; combining or splitting slide files; working with templates (.potx), layouts, speaker notes, or comments. Trigger whenever the user mentions \"deck,\" \"slides,\" \"presentation,\" or references a .pptx or .potx filename, regardless of what they plan to do with the content afterward. If a .pptx or .potx file needs to be opened, created, or touched, use this skill.","https:\u002F\u002Fgithub.com\u002Fbg-szy\u002FTOP-SKILLS\u002Fblob\u002Fmaster\u002Fskills\u002Fskills\u002Fpptx\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fbg-szy\u002FTOP-SKILLS\u002Fblob\u002Fmaster\u002Fskills\u002Fskills\u002Fpptx\u002FSKILL.md",[],[],{"skillNo":68,"name":69,"nameZh":6,"description":70,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":53,"licenseFileUrl":71,"sourceHtmlUrl":72,"categories":73,"keywords":74,"publishedAt":58},"01M747QR3VN12KXYDZGRXETTGS","docx","Use this skill whenever the user wants to create, read, edit, or manipulate Word documents (.docx files) or Word templates (.dotx files). Triggers include: any mention of 'Word doc', 'word document', '.docx', '.dotx', or requests to produce professional documents with formatting like tables of contents, headings, page numbers, or letterheads. Also use when extracting or reorganizing content from .docx or .dotx files, inserting or replacing images in documents, performing find-and-replace in Word files, working with tracked changes or comments, or converting content into a polished Word document. If the user asks for a 'report', 'memo', 'letter', 'template', or similar deliverable as a Word or .docx file, use this skill. Do NOT use for PDFs, spreadsheets, Google Docs, or general coding tasks unrelated to document generation.","https:\u002F\u002Fgithub.com\u002Fbg-szy\u002FTOP-SKILLS\u002Fblob\u002Fmaster\u002Fskills\u002Fskills\u002Fdocx\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fbg-szy\u002FTOP-SKILLS\u002Fblob\u002Fmaster\u002Fskills\u002Fskills\u002Fdocx\u002FSKILL.md",[],[],{"skillNo":76,"name":77,"nameZh":6,"description":78,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":79,"licenseFileUrl":80,"sourceHtmlUrl":81,"categories":82,"keywords":83,"publishedAt":58},"01M76KTXGSTXVVDC7YSBM41ZZS","wxpusher-integration","Use when（适用场景）：用户明确询问、指定或上下文已选定 WxPusher，需要了解、接入或排查通知（含微信 ClawBot\u002FiLink、appToken、UID、Topic、SPT）；仅说“微信通知”、未选服务商，或只出现通用 UID\u002FTopic 时不触发。","MIT","https:\u002F\u002Fgithub.com\u002Fbg-szy\u002FTOP-SKILLS\u002Fblob\u002Fmaster\u002Fskills\u002Fmarketplace\u002Fwxpusher-integration\u002FLICENSE.md","https:\u002F\u002Fgithub.com\u002Fbg-szy\u002FTOP-SKILLS\u002Fblob\u002Fmaster\u002Fskills\u002Fmarketplace\u002Fwxpusher-integration\u002FSKILL.md",[],[],{"skillNo":85,"name":86,"nameZh":6,"description":87,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":79,"licenseFileUrl":6,"sourceHtmlUrl":88,"categories":89,"keywords":90,"publishedAt":19},"01M748C5DS5BQBVBMG22FCGG34","branding","When the user wants to define, audit, or apply brand strategy—purpose, values, positioning, storytelling, voice, narrative (not only visuals). Also use when the user mentions \"brand strategy\", \"brand story\", \"brand storytelling\" or \"brand voice\". For typography, colors, design tokens, and frontend visuals, use brand-visual-generator.","https:\u002F\u002Fgithub.com\u002Fbg-szy\u002FTOP-SKILLS\u002Fblob\u002Fmaster\u002Fskills\u002Fsuperskills\u002Fbranding\u002FSKILL.md",[],[],{"skillNo":92,"name":93,"nameZh":6,"description":94,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":79,"licenseFileUrl":6,"sourceHtmlUrl":95,"categories":96,"keywords":97,"publishedAt":19},"01M748C1GXJ9WRKP18X45DKP6G","brand-visual-generator","When the user wants to define, audit, or apply visual identity (typography, colors, spacing, design tokens, frontend aesthetics). Also use when the user mentions \"brand style guide\", \"visual identity\", \"design system\" or \"typography\". For brand story, positioning, and voice, use branding.","https:\u002F\u002Fgithub.com\u002Fbg-szy\u002FTOP-SKILLS\u002Fblob\u002Fmaster\u002Fskills\u002Fsuperskills\u002Fbrand-visual-generator\u002FSKILL.md",[],[]]