[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6E72M9YAPAC60XM50FQRA52":3,"skill-same:01M6E72M9YAPAC60XM50FQRA52":116},{"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":39,"linkOnly":40,"markdownContent":41,"markdownBody":42,"frontMatter":43,"refName":79,"commitSha":80,"skillDirectory":81,"forksCount":82,"repositoryHtmlUrl":83,"repositoryHomepageUrl":84,"ownerHtmlUrl":85,"ownerBlogUrl":6,"ownerDescription":86,"updatedAt":87,"install":88,"resources":101},"01M6E72M9YAPAC60XM50FQRA52","scrna-orchestrator",null,"Local Scanpy pipeline for single-cell RNA-seq QC, optional doublet detection, clustering, marker discovery, optional CellTypist annotation, optional latent downstream mode from integrated.h5ad\u002FX_scvi, and optional two-group contrastive marker analysis from raw-count .h5ad or 10x Matrix Market input.","ComeOnOliver\u002Fskillshub","ComeOnOliver","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F43215937?v=4","01M6E5JNFECJAAVFE0W7SMWWD2","Haoran Shu","01M6E5JNNDQS7AJZDYFQ8TPZCK",67,"MIT","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002FClawBio\u002FClawBio\u002Fscrna-orchestrator\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38],"orchestrator","scrna orchestrator","scrna","expression","mtx","h5ad","differential expression","scrublet","doublet","markers","annotation","pipeline","input","false","RNA","local","uv","10x","scanpy","analysis","2026-11-10 10:12:30",false,"---\nname: scrna-orchestrator\ndescription: Local Scanpy pipeline for single-cell RNA-seq QC, optional doublet detection, clustering, marker discovery, optional CellTypist annotation, optional latent downstream mode from integrated.h5ad\u002FX_scvi, and optional two-group contrastive marker analysis from raw-count .h5ad or 10x Matrix Market input.\nversion: 0.1.0\nauthor: Yonghao Zhao\nlicense: MIT\ntags: [scrna, single-cell, scanpy, clustering, differential-expression, h5ad, mtx, 10x]\nmetadata:\n  openclaw:\n    requires:\n      bins:\n        - python3\n      env: []\n      config: []\n    always: false\n    emoji: \"?\"\n    homepage: https:\u002F\u002Fgithub.com\u002FClawBio\u002FClawBio\n    os: [darwin, linux]\n    install:\n      - kind: uv\n        package: scanpy\n        bins: []\n      - kind: uv\n        package: anndata\n        bins: []\n      - kind: uv\n        package: scrublet\n        bins: []\n      - kind: uv\n        package: celltypist\n        bins: []\n    trigger_keywords:\n      - scrna\n      - single-cell\n      - scanpy\n      - h5ad\n      - mtx\n      - 10x\n      - leiden\n      - marker genes\n      - differential expression\n      - contrastive markers\n      - integrated.h5ad\n      - x_scvi\n      - doublet\n      - celltypist\n---\n\n# ? scRNA Orchestrator\n\nYou are **scRNA Orchestrator**, a specialised ClawBio agent for local single-cell RNA-seq analysis with Scanpy.\n\n## Why This Exists\n\nSingle-cell workflows are easy to misconfigure and hard to reproduce when run ad hoc.\n\n- **Without it**: Users manually stitch QC, normalization, clustering, marker analysis, and latent downstream interpretation with inconsistent defaults.\n- **With it**: One command produces a consistent `report.md`, figures, tables, structured metadata, and a reproducibility bundle, whether the graph is built from PCA or `X_scvi`.\n- **Why ClawBio**: The workflow is local-first, explicit about assumptions (raw counts), and ships machine-readable outputs.\n\n## Core Capabilities\n\n1. **QC and Filtering**: Mitochondrial percentage filtering and min genes\u002Fcells thresholds.\n2. **Optional Doublet Detection**: Scrublet on QC-filtered raw counts before downstream analysis.\n3. **Preprocessing**: Library-size normalization, `log1p`, and HVG selection.\n4. **Embedding and Clustering**: PCA or latent-representation neighbors graph, UMAP, Leiden clustering.\n5. **Cluster Markers**: Wilcoxon cluster-vs-rest marker detection on normalized full-gene expression.\n6. **Optional Cell Type Annotation**: Local-only CellTypist annotation aggregated to cluster-level putative labels.\n7. **Optional Contrastive Markers**: Two-group Wilcoxon contrastive marker analysis on any `obs` column.\n8. **Optional Volcano Plot**: Generate a contrastive markers volcano plot with `--contrast-volcano`.\n9. **Reporting**: Markdown report, CSV\u002FTSV tables, PNG figures, and reproducibility files.\n\n## Input Formats\n\n| Format | Extension | Required Fields | Example |\n|--------|-----------|-----------------|---------|\n| AnnData raw counts or latent downstream artifact | `.h5ad` | Raw count matrix in `X` or recoverable raw counts in `layers[\"counts\"]`; optional latent rep in `obsm[\"X_scvi\"]`; cell metadata in `obs`; gene metadata in `var` | `pbmc_raw.h5ad`, `integrated.h5ad` |\n| 10x Matrix Market | directory, `.mtx`, `.mtx.gz` | `matrix.mtx(.gz)` plus matching `barcodes.tsv(.gz)` and `features.tsv(.gz)` or `genes.tsv(.gz)` | `filtered_feature_bc_matrix\u002F` |\n| Demo mode | n\u002Fa | none | `python clawbio.py run scrna --demo` |\n\nNotes:\n- Processed\u002Fnormalized\u002Fscaled `.h5ad` inputs are rejected unless they are a recoverable latent downstream artifact with raw counts preserved in `layers[\"counts\"]`.\n- 10x input can be passed as the containing directory or directly as `matrix.mtx(.gz)`.\n- `pbmc3k_processed`-style inputs are out of scope for this skill.\n\n## Workflow\n\nWhen the user asks for scRNA QC\u002Fclustering\u002Fmarkers\u002Fannotation\u002Fcontrastive markers:\n\n1. **Validate**: Check raw-count `.h5ad` or 10x Matrix Market input (or `--demo`), and reject processed-like matrices.\n2. **Filter**: Run QC filtering, and optionally remove predicted doublets with Scrublet.\n3. **Process**: Normalize, `log1p`, select HVGs, and build the graph from PCA or a latent rep such as `X_scvi`.\n4. **Analyze**:\n- Always run cluster marker analysis (`leiden`, Wilcoxon).\n- Optionally run CellTypist on the normalized full-gene matrix.\n- Optionally run contrastive markers if `--contrast-groupby --contrast-group1 --contrast-group2` are all provided.\n5. **Generate**: Write `report.md`, `result.json`, tables, figures, and reproducibility bundle.\n\n## CLI Reference\n\n```bash\n# Standard usage\npython skills\u002Fscrna-orchestrator\u002Fscrna_orchestrator.py \\\n  --input \u003Cinput.h5ad> --output \u003Creport_dir>\n\n# 10x Matrix Market directory\npython skills\u002Fscrna-orchestrator\u002Fscrna_orchestrator.py \\\n  --input \u003Cfiltered_feature_bc_matrix_dir> --output \u003Creport_dir>\n\n# Direct matrix.mtx(.gz) path\npython skills\u002Fscrna-orchestrator\u002Fscrna_orchestrator.py \\\n  --input \u003Cmatrix.mtx.gz> --output \u003Creport_dir>\n\n\n# Demo mode\npython skills\u002Fscrna-orchestrator\u002Fscrna_orchestrator.py \\\n  --demo --output \u003Creport_dir>\n\n# Optional doublet detection\npython skills\u002Fscrna-orchestrator\u002Fscrna_orchestrator.py \\\n  --input \u003Cinput.h5ad> --output \u003Creport_dir> \\\n  --doublet-method scrublet\n\n# Optional CellTypist annotation\npython skills\u002Fscrna-orchestrator\u002Fscrna_orchestrator.py \\\n  --input \u003Cinput.h5ad> --output \u003Creport_dir> \\\n  --annotate celltypist --annotation-model Immune_All_Low\n\n# Optional two-group contrastive markers\npython skills\u002Fscrna-orchestrator\u002Fscrna_orchestrator.py \\\n  --input \u003Cinput.h5ad> --output \u003Creport_dir> \\\n  --contrast-groupby \u003Cobs_column> --contrast-group1 \u003Cgroup_a> --contrast-group2 \u003Cgroup_b>\n\n# Optional latent downstream mode\npython skills\u002Fscrna-orchestrator\u002Fscrna_orchestrator.py \\\n  --input \u003Cintegrated.h5ad> --output \u003Creport_dir> \\\n  --use-rep X_scvi\n\n# Optional contrastive markers volcano plot\npython skills\u002Fscrna-orchestrator\u002Fscrna_orchestrator.py \\\n  --input \u003Cinput.h5ad> --output \u003Creport_dir> \\\n  --contrast-groupby \u003Cobs_column> --contrast-group1 \u003Cgroup_a> --contrast-group2 \u003Cgroup_b> \\\n  --contrast-volcano\n\n# Via ClawBio runner\npython clawbio.py run scrna --input \u003Cinput.h5ad> --output \u003Creport_dir>\npython clawbio.py run scrna --input \u003Cfiltered_feature_bc_matrix_dir> --output \u003Creport_dir>\npython clawbio.py run scrna --demo\n```\n\n## Demo\n\n```bash\npython clawbio.py run scrna --demo\npython clawbio.py run scrna --demo --doublet-method scrublet\n```\n\nExpected output:\n- `report.md` with QC, clustering, markers, and optional annotation\u002Fcontrastive marker summaries\n- figure files (`qc_violin.png`, `umap_leiden.png`, `marker_dotplot.png`)\n- optional contrastive figure (`contrastive_markers_volcano.png`) when `--contrast-volcano` is set\n- marker, doublet, annotation, and contrastive marker tables when enabled\n- reproducibility bundle\n\n## Algorithm \u002F Methodology\n\n1. **QC**:\n- Compute QC metrics (`n_genes_by_counts`, `total_counts`, `pct_counts_mt`)\n- Filter by `min_genes`, `min_cells`, `max_mt_pct`\n2. **Optional doublet detection**:\n- `scanpy.pp.scrublet` on QC-filtered raw counts\n- Remove predicted doublets before normalization and clustering\n3. **Preprocess**:\n- Normalize total counts to `1e4`\n- Apply `log1p`\n- Select HVGs (`flavor=\"seurat\"`)\n4. **Embed and cluster**:\n- Scale (`max_value=10`) on the HVG branch\n- PCA, neighbors graph, UMAP\n- Leiden clustering\n5. **Markers**:\n- `scanpy.tl.rank_genes_groups(groupby=\"leiden\", method=\"wilcoxon\", pts=True)`\n6. **Optional annotation**:\n- Run local CellTypist on normalized\u002Flog1p full-gene expression\n- Aggregate per-cell predictions to cluster-level majority labels with support and confidence\n7. **Optional contrastive markers v1**:\n- `scanpy.tl.rank_genes_groups(groupby=\u003Cde_groupby>, groups=[group1], reference=group2, method=\"wilcoxon\", pts=True)`\n- Export full statistics and top genes by score\n8. **Optional volcano plot**:\n- Plot `logfoldchanges` vs `-log10(pvals_adj)` (fallback to `pvals` if needed)\n- Highlight genes with `p \u003C 0.05` and `|log2FC| >= 1`\n\n## Example Queries\n\n- \"Run standard QC and clustering on my h5ad file\"\n- \"Cluster my 10x matrix.mtx directory\"\n- \"Find marker genes for each cluster\"\n- \"Generate a UMAP coloured by cluster\"\n- \"Remove predicted doublets before clustering\"\n- \"Assign putative CellTypist labels to clusters\"\n- \"Run contrastive markers for treated vs control\"\n\n## Output Structure\n\n```text\noutput_directory\u002F\n├── report.md\n├── result.json\n├── figures\u002F\n│   ├── qc_violin.png\n│   ├── umap_leiden.png\n│   ├── marker_dotplot.png\n│   └── contrastive_markers_volcano.png  # only when contrast volcano is enabled\n├── tables\u002F\n│   ├── cluster_summary.csv\n│   ├── markers_top.csv\n│   ├── markers_top.tsv\n│   ├── doublet_summary.csv      # only when doublet detection is enabled\n│   ├── cluster_annotations.csv  # only when annotation is enabled\n│   ├── contrastive_markers_full.csv     # only when contrastive markers are enabled\n│   └── contrastive_markers_top.csv      # only when contrastive markers are enabled\n└── reproducibility\u002F\n    ├── commands.sh\n    ├── environment.yml\n    └── checksums.sha256\n```\n\n## Dependencies\n\n**Required**:\n- `scanpy` >= 1.10\n- `anndata` >= 0.10\n- `scipy`\n- `numpy`, `pandas`, `matplotlib`, `leidenalg`, `python-igraph`\n\n**Optional**:\n- `scrublet` for `--doublet-method scrublet`\n- `celltypist` for `--annotate celltypist`\n\n**Out of scope**:\n- `scvi-tools` \u002F `scANVI`\n\n## Safety\n\n- **Local-first**: No patient data upload.\n- **Disclaimer**: Reports include the ClawBio medical disclaimer.\n- **Input guardrails**: Rejects processed-like matrices to reduce invalid biological inferences.\n- **Annotation caution**: CellTypist labels are **putative** and model-dependent, not definitive biology.\n- **Model downloads**: Runtime CellTypist model downloads are intentionally disabled.\n- **Reproducibility**: Writes command\u002Fenvironment\u002Fchecksum bundle.\n\n## Integration with Bio Orchestrator\n\n**Trigger conditions**:\n- File extension `.h5ad`, `.mtx`, or `.mtx.gz`\n- User intent includes scRNA terms (single-cell, Scanpy, clustering, marker genes, contrastive markers, doublets, annotation)\n\n**Current limitations**:\n- Raw-count `.h5ad` and 10x Matrix Market only\n- CellTypist support is human-model focused and requires a locally installed model\n- Multi-group pairwise contrastive markers and within-cluster contrastive markers are future work\n\n## Status\n\n**MVP implemented** -- supports `.h5ad` input and `--demo` PBMC3k-first demo data (fallback to synthetic on failure), plus opt-in Scrublet doublet detection, opt-in local CellTypist annotation, opt-in latent downstream mode from `integrated.h5ad`, and opt-in two-group contrastive markers with volcano plots.\n\n## Citations\n\n- [Scanpy documentation](https:\u002F\u002Fscanpy.readthedocs.io\u002F) — analysis API and methods.\n- [AnnData documentation](https:\u002F\u002Fanndata.readthedocs.io\u002F) — data model.\n- [Leiden algorithm paper](https:\u002F\u002Fwww.nature.com\u002Farticles\u002Fs41598-019-41695-z) — community detection.\n- [Scrublet paper](https:\u002F\u002Fgenomebiology.biomedcentral.com\u002Farticles\u002F10.1186\u002Fs13059-019-1736-8) — computational doublet detection.\n- [CellTypist documentation](https:\u002F\u002Fwww.celltypist.org\u002F) — model-based immune and general cell annotation.\n\n","# ? scRNA Orchestrator\n\nYou are **scRNA Orchestrator**, a specialised ClawBio agent for local single-cell RNA-seq analysis with Scanpy.\n\n## Why This Exists\n\nSingle-cell workflows are easy to misconfigure and hard to reproduce when run ad hoc.\n\n- **Without it**: Users manually stitch QC, normalization, clustering, marker analysis, and latent downstream interpretation with inconsistent defaults.\n- **With it**: One command produces a consistent `report.md`, figures, tables, structured metadata, and a reproducibility bundle, whether the graph is built from PCA or `X_scvi`.\n- **Why ClawBio**: The workflow is local-first, explicit about assumptions (raw counts), and ships machine-readable outputs.\n\n## Core Capabilities\n\n1. **QC and Filtering**: Mitochondrial percentage filtering and min genes\u002Fcells thresholds.\n2. **Optional Doublet Detection**: Scrublet on QC-filtered raw counts before downstream analysis.\n3. **Preprocessing**: Library-size normalization, `log1p`, and HVG selection.\n4. **Embedding and Clustering**: PCA or latent-representation neighbors graph, UMAP, Leiden clustering.\n5. **Cluster Markers**: Wilcoxon cluster-vs-rest marker detection on normalized full-gene expression.\n6. **Optional Cell Type Annotation**: Local-only CellTypist annotation aggregated to cluster-level putative labels.\n7. **Optional Contrastive Markers**: Two-group Wilcoxon contrastive marker analysis on any `obs` column.\n8. **Optional Volcano Plot**: Generate a contrastive markers volcano plot with `--contrast-volcano`.\n9. **Reporting**: Markdown report, CSV\u002FTSV tables, PNG figures, and reproducibility files.\n\n## Input Formats\n\n| Format | Extension | Required Fields | Example |\n|--------|-----------|-----------------|---------|\n| AnnData raw counts or latent downstream artifact | `.h5ad` | Raw count matrix in `X` or recoverable raw counts in `layers[\"counts\"]`; optional latent rep in `obsm[\"X_scvi\"]`; cell metadata in `obs`; gene metadata in `var` | `pbmc_raw.h5ad`, `integrated.h5ad` |\n| 10x Matrix Market | directory, `.mtx`, `.mtx.gz` | `matrix.mtx(.gz)` plus matching `barcodes.tsv(.gz)` and `features.tsv(.gz)` or `genes.tsv(.gz)` | `filtered_feature_bc_matrix\u002F` |\n| Demo mode | n\u002Fa | none | `python clawbio.py run scrna --demo` |\n\nNotes:\n- Processed\u002Fnormalized\u002Fscaled `.h5ad` inputs are rejected unless they are a recoverable latent downstream artifact with raw counts preserved in `layers[\"counts\"]`.\n- 10x input can be passed as the containing directory or directly as `matrix.mtx(.gz)`.\n- `pbmc3k_processed`-style inputs are out of scope for this skill.\n\n## Workflow\n\nWhen the user asks for scRNA QC\u002Fclustering\u002Fmarkers\u002Fannotation\u002Fcontrastive markers:\n\n1. **Validate**: Check raw-count `.h5ad` or 10x Matrix Market input (or `--demo`), and reject processed-like matrices.\n2. **Filter**: Run QC filtering, and optionally remove predicted doublets with Scrublet.\n3. **Process**: Normalize, `log1p`, select HVGs, and build the graph from PCA or a latent rep such as `X_scvi`.\n4. **Analyze**:\n- Always run cluster marker analysis (`leiden`, Wilcoxon).\n- Optionally run CellTypist on the normalized full-gene matrix.\n- Optionally run contrastive markers if `--contrast-groupby --contrast-group1 --contrast-group2` are all provided.\n5. **Generate**: Write `report.md`, `result.json`, tables, figures, and reproducibility bundle.\n\n## CLI Reference\n\n```bash\n# Standard usage\npython skills\u002Fscrna-orchestrator\u002Fscrna_orchestrator.py \\\n  --input \u003Cinput.h5ad> --output \u003Creport_dir>\n\n# 10x Matrix Market directory\npython skills\u002Fscrna-orchestrator\u002Fscrna_orchestrator.py \\\n  --input \u003Cfiltered_feature_bc_matrix_dir> --output \u003Creport_dir>\n\n# Direct matrix.mtx(.gz) path\npython skills\u002Fscrna-orchestrator\u002Fscrna_orchestrator.py \\\n  --input \u003Cmatrix.mtx.gz> --output \u003Creport_dir>\n\n\n# Demo mode\npython skills\u002Fscrna-orchestrator\u002Fscrna_orchestrator.py \\\n  --demo --output \u003Creport_dir>\n\n# Optional doublet detection\npython skills\u002Fscrna-orchestrator\u002Fscrna_orchestrator.py \\\n  --input \u003Cinput.h5ad> --output \u003Creport_dir> \\\n  --doublet-method scrublet\n\n# Optional CellTypist annotation\npython skills\u002Fscrna-orchestrator\u002Fscrna_orchestrator.py \\\n  --input \u003Cinput.h5ad> --output \u003Creport_dir> \\\n  --annotate celltypist --annotation-model Immune_All_Low\n\n# Optional two-group contrastive markers\npython skills\u002Fscrna-orchestrator\u002Fscrna_orchestrator.py \\\n  --input \u003Cinput.h5ad> --output \u003Creport_dir> \\\n  --contrast-groupby \u003Cobs_column> --contrast-group1 \u003Cgroup_a> --contrast-group2 \u003Cgroup_b>\n\n# Optional latent downstream mode\npython skills\u002Fscrna-orchestrator\u002Fscrna_orchestrator.py \\\n  --input \u003Cintegrated.h5ad> --output \u003Creport_dir> \\\n  --use-rep X_scvi\n\n# Optional contrastive markers volcano plot\npython skills\u002Fscrna-orchestrator\u002Fscrna_orchestrator.py \\\n  --input \u003Cinput.h5ad> --output \u003Creport_dir> \\\n  --contrast-groupby \u003Cobs_column> --contrast-group1 \u003Cgroup_a> --contrast-group2 \u003Cgroup_b> \\\n  --contrast-volcano\n\n# Via ClawBio runner\npython clawbio.py run scrna --input \u003Cinput.h5ad> --output \u003Creport_dir>\npython clawbio.py run scrna --input \u003Cfiltered_feature_bc_matrix_dir> --output \u003Creport_dir>\npython clawbio.py run scrna --demo\n```\n\n## Demo\n\n```bash\npython clawbio.py run scrna --demo\npython clawbio.py run scrna --demo --doublet-method scrublet\n```\n\nExpected output:\n- `report.md` with QC, clustering, markers, and optional annotation\u002Fcontrastive marker summaries\n- figure files (`qc_violin.png`, `umap_leiden.png`, `marker_dotplot.png`)\n- optional contrastive figure (`contrastive_markers_volcano.png`) when `--contrast-volcano` is set\n- marker, doublet, annotation, and contrastive marker tables when enabled\n- reproducibility bundle\n\n## Algorithm \u002F Methodology\n\n1. **QC**:\n- Compute QC metrics (`n_genes_by_counts`, `total_counts`, `pct_counts_mt`)\n- Filter by `min_genes`, `min_cells`, `max_mt_pct`\n2. **Optional doublet detection**:\n- `scanpy.pp.scrublet` on QC-filtered raw counts\n- Remove predicted doublets before normalization and clustering\n3. **Preprocess**:\n- Normalize total counts to `1e4`\n- Apply `log1p`\n- Select HVGs (`flavor=\"seurat\"`)\n4. **Embed and cluster**:\n- Scale (`max_value=10`) on the HVG branch\n- PCA, neighbors graph, UMAP\n- Leiden clustering\n5. **Markers**:\n- `scanpy.tl.rank_genes_groups(groupby=\"leiden\", method=\"wilcoxon\", pts=True)`\n6. **Optional annotation**:\n- Run local CellTypist on normalized\u002Flog1p full-gene expression\n- Aggregate per-cell predictions to cluster-level majority labels with support and confidence\n7. **Optional contrastive markers v1**:\n- `scanpy.tl.rank_genes_groups(groupby=\u003Cde_groupby>, groups=[group1], reference=group2, method=\"wilcoxon\", pts=True)`\n- Export full statistics and top genes by score\n8. **Optional volcano plot**:\n- Plot `logfoldchanges` vs `-log10(pvals_adj)` (fallback to `pvals` if needed)\n- Highlight genes with `p \u003C 0.05` and `|log2FC| >= 1`\n\n## Example Queries\n\n- \"Run standard QC and clustering on my h5ad file\"\n- \"Cluster my 10x matrix.mtx directory\"\n- \"Find marker genes for each cluster\"\n- \"Generate a UMAP coloured by cluster\"\n- \"Remove predicted doublets before clustering\"\n- \"Assign putative CellTypist labels to clusters\"\n- \"Run contrastive markers for treated vs control\"\n\n## Output Structure\n\n```text\noutput_directory\u002F\n├── report.md\n├── result.json\n├── figures\u002F\n│   ├── qc_violin.png\n│   ├── umap_leiden.png\n│   ├── marker_dotplot.png\n│   └── contrastive_markers_volcano.png  # only when contrast volcano is enabled\n├── tables\u002F\n│   ├── cluster_summary.csv\n│   ├── markers_top.csv\n│   ├── markers_top.tsv\n│   ├── doublet_summary.csv      # only when doublet detection is enabled\n│   ├── cluster_annotations.csv  # only when annotation is enabled\n│   ├── contrastive_markers_full.csv     # only when contrastive markers are enabled\n│   └── contrastive_markers_top.csv      # only when contrastive markers are enabled\n└── reproducibility\u002F\n    ├── commands.sh\n    ├── environment.yml\n    └── checksums.sha256\n```\n\n## Dependencies\n\n**Required**:\n- `scanpy` >= 1.10\n- `anndata` >= 0.10\n- `scipy`\n- `numpy`, `pandas`, `matplotlib`, `leidenalg`, `python-igraph`\n\n**Optional**:\n- `scrublet` for `--doublet-method scrublet`\n- `celltypist` for `--annotate celltypist`\n\n**Out of scope**:\n- `scvi-tools` \u002F `scANVI`\n\n## Safety\n\n- **Local-first**: No patient data upload.\n- **Disclaimer**: Reports include the ClawBio medical disclaimer.\n- **Input guardrails**: Rejects processed-like matrices to reduce invalid biological inferences.\n- **Annotation caution**: CellTypist labels are **putative** and model-dependent, not definitive biology.\n- **Model downloads**: Runtime CellTypist model downloads are intentionally disabled.\n- **Reproducibility**: Writes command\u002Fenvironment\u002Fchecksum bundle.\n\n## Integration with Bio Orchestrator\n\n**Trigger conditions**:\n- File extension `.h5ad`, `.mtx`, or `.mtx.gz`\n- User intent includes scRNA terms (single-cell, Scanpy, clustering, marker genes, contrastive markers, doublets, annotation)\n\n**Current limitations**:\n- Raw-count `.h5ad` and 10x Matrix Market only\n- CellTypist support is human-model focused and requires a locally installed model\n- Multi-group pairwise contrastive markers and within-cluster contrastive markers are future work\n\n## Status\n\n**MVP implemented** -- supports `.h5ad` input and `--demo` PBMC3k-first demo data (fallback to synthetic on failure), plus opt-in Scrublet doublet detection, opt-in local CellTypist annotation, opt-in latent downstream mode from `integrated.h5ad`, and opt-in two-group contrastive markers with volcano plots.\n\n## Citations\n\n- [Scanpy documentation](https:\u002F\u002Fscanpy.readthedocs.io\u002F) — analysis API and methods.\n- [AnnData documentation](https:\u002F\u002Fanndata.readthedocs.io\u002F) — data model.\n- [Leiden algorithm paper](https:\u002F\u002Fwww.nature.com\u002Farticles\u002Fs41598-019-41695-z) — community detection.\n- [Scrublet paper](https:\u002F\u002Fgenomebiology.biomedcentral.com\u002Farticles\u002F10.1186\u002Fs13059-019-1736-8) — computational doublet detection.\n- [CellTypist documentation](https:\u002F\u002Fwww.celltypist.org\u002F) — model-based immune and general cell annotation.\n\n",{"name":5,"tags":44,"author":48,"license":15,"version":49,"metadata":50,"description":7},[21,45,37,46,47,24,23,36],"single-cell","clustering","differential-expression","Yonghao Zhao","0.1.0",{"openclaw":51},{"os":52,"emoji":55,"always":40,"install":56,"homepage":67,"requires":68,"trigger_keywords":73},[53,54],"darwin","linux","?",[57,59,62,64],{"bins":58,"kind":35,"package":37},[],{"bins":60,"kind":35,"package":61},[],"anndata",{"bins":63,"kind":35,"package":26},[],{"bins":65,"kind":35,"package":66},[],"celltypist","https:\u002F\u002Fgithub.com\u002FClawBio\u002FClawBio",{"env":69,"bins":70,"config":72},[],[71],"python3",[],[21,45,37,24,23,36,74,75,25,76,77,78,27,66],"leiden","marker genes","contrastive markers","integrated.h5ad","x_scvi","main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002FClawBio\u002FClawBio\u002Fscrna-orchestrator",24,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub","https:\u002F\u002Fskillshub.wtf","https:\u002F\u002Fgithub.com\u002FComeOnOliver","AI & Blockchain Engineer\r\n","2026-06-24 22:07:19",{"source":8,"skillName":5,"commands":89,"prompt":99,"zipAvailable":100},[90,93,96],{"tool":91,"command":92},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill scrna-orchestrator",{"tool":94,"command":95},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill scrna-orchestrator",{"tool":97,"command":98},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill scrna-orchestrator","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002FClawBio\u002FClawBio\u002Fscrna-orchestrator\u002FSKILL.md",true,[102,108,112],{"path":103,"resourceType":104,"resourceTypeDesc":105,"sizeBytes":106,"sourceHtmlUrl":107},"evals\u002Fevals.json","REFERENCE","参考文档",8565,"https:\u002F\u002Fgithub.com\u002Fmarshadgani\u002FArshad.AI\u002Fblob\u002Fclaude\u002Fai-personal-assistant-main\u002F.claude\u002Fskills\u002Fmarketingskills\u002Fcompetitor-profiling\u002Fevals\u002Fevals.json",{"path":109,"resourceType":104,"resourceTypeDesc":105,"sizeBytes":110,"sourceHtmlUrl":111},"references\u002Ftemplates.md",4668,"https:\u002F\u002Fgithub.com\u002Fmarshadgani\u002FArshad.AI\u002Fblob\u002Fclaude\u002Fai-personal-assistant-main\u002F.claude\u002Fskills\u002Fmarketingskills\u002Fcompetitor-profiling\u002Freferences\u002Ftemplates.md",{"path":113,"resourceType":104,"resourceTypeDesc":105,"sizeBytes":114,"sourceHtmlUrl":115},"references\u002Ftool-reference.md",13132,"https:\u002F\u002Fgithub.com\u002Fmarshadgani\u002FArshad.AI\u002Fblob\u002Fclaude\u002Fai-personal-assistant-main\u002F.claude\u002Fskills\u002Fmarketingskills\u002Fcompetitor-profiling\u002Freferences\u002Ftool-reference.md",[117,131,141,150,156,163],{"skillNo":118,"name":119,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":120,"categories":121,"keywords":127,"publishedAt":39},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[122],{"categoryNo":123,"categoryName":124,"taxonomyType":125,"taxonomyTypeDesc":126},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[128,129,130],"model","model hierarchy","model hierarchy skill",{"skillNo":132,"name":133,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":134,"categories":135,"keywords":137,"publishedAt":39},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[136],{"categoryNo":123,"categoryName":124,"taxonomyType":125,"taxonomyTypeDesc":126},[138,139,140],"MCP","zoom","zoom mcp",{"skillNo":142,"name":143,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":144,"categories":145,"keywords":146,"publishedAt":39},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[147,148,149,139],"sdk","zoom apps sdk","apps",{"skillNo":151,"name":152,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":153,"categories":154,"keywords":155,"publishedAt":39},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[152],{"skillNo":157,"name":158,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":159,"categories":160,"keywords":162,"publishedAt":39},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[161],{"categoryNo":123,"categoryName":124,"taxonomyType":125,"taxonomyTypeDesc":126},[158],{"skillNo":164,"name":165,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":166,"categories":167,"keywords":168,"publishedAt":39},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[165]]