[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6C0ZEKV8Y8N8230180FSPVH":3,"skill-same:01M6C0ZEKV8Y8N8230180FSPVH":49},{"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":21,"linkOnly":22,"markdownContent":23,"markdownBody":24,"frontMatter":25,"refName":26,"commitSha":27,"skillDirectory":28,"forksCount":29,"repositoryHtmlUrl":30,"repositoryHomepageUrl":31,"ownerHtmlUrl":32,"ownerBlogUrl":33,"ownerDescription":6,"updatedAt":34,"install":35,"resources":48},"01M6C0ZEKV8Y8N8230180FSPVH","pluot-filter-select-highlight",null,"Use when modifying the filtering, selection, or highlighting logic in Pluot.","keller-mark\u002Fpluot","keller-mark","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F7525285?v=4","01M6C0Z7QY1MB45XYSA751H279","Mark Keller","01M6C0Z7WT9FM6H2ZFHT28C43C",31,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Fkeller-mark\u002Fpluot\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fpluot-filter-select-highlight\u002FSKILL.md",[],[19,20],"select","pluot filter select highlight","2026-11-10 10:12:30",false,"---\nname: pluot-filter-select-highlight\ndescription: Use when modifying the filtering, selection, or highlighting logic in Pluot.\n---\n\nWe want to ensure the following is the case across layer implementations:\n\n- Filtering refers to whether particular data items (or sets of data items) are considered at all during either rendering or computation. For example, if the filtering logic specifies that only immune cell types are included, then we do not render non-immune cell types (as data points, along categorical axes, in legends, etc.) In other words, when immune cell types are the only cell types that meet the current filtering criteria, we do not include non-immune cell types in any visual encoding (or upstream computation of a visual encoding, such as when computing distributions or averages).\n- Selection refers to a visual emphasis on one or more data items or sets of data items (e.g., immune cell types). Items (or sets of items) which meet the filtering criteria, yet are un-selected, should still be rendered (as data points, along categorical axes, in legends), but should be de-emphasized visually (e.g., greyed-out or with reduced opacity or reduced size).\n- Highlighting refers to ephemeral emphasis on one or a few data items (observation or feature) (e.g., a particular cell or gene). This emphasis should correspond to a visual encoding such as an outline.\n\n\nWhen filtering is `None`, this means that all data items (or sets of data items) are included. When selection is `None`, this means that all data items (or sets of data items) that meet the filtering criteria are selected. An explicit empty array means that nothing should be included\u002Fselected. When highlight is `None`, this means that nothing is currently highlighted.\n\n\nFiltering criteria determines the \"background\" items and visual representation.\nSelection critiera determines the \"foreground\" items and visual representation.\n\n\n## Selection criteria can be orthgonal to filtering criteria\n\nWhen filtering criteria is defined in terms of included categories of items (e.g., cell types), selection criteria is not limited to a subset of the filter-included categories. Rather, selection criteria may be entirely orthogonal to the filtering criteria, for instance, selection of cells which express a certain gene (regardless of cell type).\n\n## Types of filtering and selection criteria\n\n- Integer instance ID column (one per dataset item) plus list of included instance IDs\n- Categorical column (one category code per dataset item) plus list of included category codes (leverage the categories+codes dictionary format when implementing)\n- Quantitative column (one value per dataset item) plus the included range\u002Fextent (or a min\u002Fmax to specify only a lower\u002Fupper bound and implicitly infinity\u002Fnegative-infinity in the other direction).\n\n\n## GPU-accelerated implementation of filtering, selection, and highlighting\n\nFor each primitive (i.e., not composite) layer drawing function (i.e., in `crates\u002Fpluot_core\u002Fsrc\u002Flayers`), the layer parameters must accept selection and filtering criteria alongside the associated NumericData data buffers.\nWe will reuse NumericData buffers when possible (e.g., when filter criteria exactly equals selection criteria).\nFor filter-excluded data items, the WGSL logic will omit\u002Fhide these items (i.e., not render them) when encountered in the shaders.\nFilter-excluded items will also be ignored in picking logic (i.e., not returned as hits when picking).\nFor filter-included, but selection-excluded data items, the WGSL logic will de-emphasize these data items (i.e., gray-out or render with reduced opacity).\nFor filter-included, select-included, but not highlighted items, these will render with normal emphasis using the specified visual encoding (color, fill\u002Fstroke, size, opacity)\nFor highlighted data items, the WGSL logic will further emphasize these data items (i.e., render with a dark stroke or render with increased size).\n\nGPGPU compute operations (i.e., in `crates\u002Fpluot_core\u002Fsrc\u002Fcompute`) must support analogous filtering and selection logic.\nFor example, an operation which computes the distribution of items-per-category will compute counts for \"background\" (filter-included) and \"foreground\" (filter-included and selection-included), where filtering and selection criteria may rely on independent\u002Forthogonal categorical or quantitative variables themselves.\n\n\n\u003C!-- TODO: also define principles for handing missingness \u002F null items in nullable data arrays? -->\n","We want to ensure the following is the case across layer implementations:\n\n- Filtering refers to whether particular data items (or sets of data items) are considered at all during either rendering or computation. For example, if the filtering logic specifies that only immune cell types are included, then we do not render non-immune cell types (as data points, along categorical axes, in legends, etc.) In other words, when immune cell types are the only cell types that meet the current filtering criteria, we do not include non-immune cell types in any visual encoding (or upstream computation of a visual encoding, such as when computing distributions or averages).\n- Selection refers to a visual emphasis on one or more data items or sets of data items (e.g., immune cell types). Items (or sets of items) which meet the filtering criteria, yet are un-selected, should still be rendered (as data points, along categorical axes, in legends), but should be de-emphasized visually (e.g., greyed-out or with reduced opacity or reduced size).\n- Highlighting refers to ephemeral emphasis on one or a few data items (observation or feature) (e.g., a particular cell or gene). This emphasis should correspond to a visual encoding such as an outline.\n\n\nWhen filtering is `None`, this means that all data items (or sets of data items) are included. When selection is `None`, this means that all data items (or sets of data items) that meet the filtering criteria are selected. An explicit empty array means that nothing should be included\u002Fselected. When highlight is `None`, this means that nothing is currently highlighted.\n\n\nFiltering criteria determines the \"background\" items and visual representation.\nSelection critiera determines the \"foreground\" items and visual representation.\n\n\n## Selection criteria can be orthgonal to filtering criteria\n\nWhen filtering criteria is defined in terms of included categories of items (e.g., cell types), selection criteria is not limited to a subset of the filter-included categories. Rather, selection criteria may be entirely orthogonal to the filtering criteria, for instance, selection of cells which express a certain gene (regardless of cell type).\n\n## Types of filtering and selection criteria\n\n- Integer instance ID column (one per dataset item) plus list of included instance IDs\n- Categorical column (one category code per dataset item) plus list of included category codes (leverage the categories+codes dictionary format when implementing)\n- Quantitative column (one value per dataset item) plus the included range\u002Fextent (or a min\u002Fmax to specify only a lower\u002Fupper bound and implicitly infinity\u002Fnegative-infinity in the other direction).\n\n\n## GPU-accelerated implementation of filtering, selection, and highlighting\n\nFor each primitive (i.e., not composite) layer drawing function (i.e., in `crates\u002Fpluot_core\u002Fsrc\u002Flayers`), the layer parameters must accept selection and filtering criteria alongside the associated NumericData data buffers.\nWe will reuse NumericData buffers when possible (e.g., when filter criteria exactly equals selection criteria).\nFor filter-excluded data items, the WGSL logic will omit\u002Fhide these items (i.e., not render them) when encountered in the shaders.\nFilter-excluded items will also be ignored in picking logic (i.e., not returned as hits when picking).\nFor filter-included, but selection-excluded data items, the WGSL logic will de-emphasize these data items (i.e., gray-out or render with reduced opacity).\nFor filter-included, select-included, but not highlighted items, these will render with normal emphasis using the specified visual encoding (color, fill\u002Fstroke, size, opacity)\nFor highlighted data items, the WGSL logic will further emphasize these data items (i.e., render with a dark stroke or render with increased size).\n\nGPGPU compute operations (i.e., in `crates\u002Fpluot_core\u002Fsrc\u002Fcompute`) must support analogous filtering and selection logic.\nFor example, an operation which computes the distribution of items-per-category will compute counts for \"background\" (filter-included) and \"foreground\" (filter-included and selection-included), where filtering and selection criteria may rely on independent\u002Forthogonal categorical or quantitative variables themselves.\n\n\n\u003C!-- TODO: also define principles for handing missingness \u002F null items in nullable data arrays? -->\n",{"name":5,"description":7},"main","183ad01c1deac0379e3fa98720cf49c990b2a0d3",".claude\u002Fskills\u002Fpluot-filter-select-highlight",3,"https:\u002F\u002Fgithub.com\u002Fkeller-mark\u002Fpluot","https:\u002F\u002Fpluot.dev","https:\u002F\u002Fgithub.com\u002Fkeller-mark","markk.co","2026-11-04 02:32:42",{"source":8,"skillName":5,"commands":36,"prompt":46,"zipAvailable":47},[37,40,43],{"tool":38,"command":39},"npx","npx skills add keller-mark\u002Fpluot --skill pluot-filter-select-highlight",{"tool":41,"command":42},"bunx","bunx skills add keller-mark\u002Fpluot --skill pluot-filter-select-highlight",{"tool":44,"command":45},"pnpm","pnpm dlx skills add keller-mark\u002Fpluot --skill pluot-filter-select-highlight","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fkeller-mark\u002Fpluot\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fpluot-filter-select-highlight\u002FSKILL.md",true,[],[50,63,72,84,97,109],{"skillNo":51,"name":52,"nameZh":6,"description":53,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":54,"categories":55,"keywords":56,"publishedAt":21},"01M6C0ZSB3MV7FRFBAEMNDSKC7","pluot-snappy-troubleshooting","Use when rust build fails due to command did not execute successfully, involving snappy or snappy_src or snappy\u002Fsnappy.cc","https:\u002F\u002Fgithub.com\u002Fkeller-mark\u002Fpluot\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fpluot-snappy-troubleshooting\u002FSKILL.md",[],[57,58,59,60,61,62],"pluot snappy troubleshooting","troubleshooting","execute","command","src","rust",{"skillNo":64,"name":65,"nameZh":6,"description":66,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":67,"categories":68,"keywords":69,"publishedAt":21},"01M6C0ZQWAKEWB2HC934DFBPP2","pluot-shader-modules","Use when you need to write or modify a WGSL shader.","https:\u002F\u002Fgithub.com\u002Fkeller-mark\u002Fpluot\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fpluot-shader-modules\u002FSKILL.md",[],[70,71],"pluot shader modules","write",{"skillNo":73,"name":74,"nameZh":6,"description":75,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":76,"categories":77,"keywords":78,"publishedAt":21},"01M6C0ZP26G5TJTFNFEK035R6Z","pluot-reference-materials","Use when the user asks you to reference specific code, documentation files, or source repositories of dependencies or related tools.","https:\u002F\u002Fgithub.com\u002Fkeller-mark\u002Fpluot\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fpluot-reference-materials\u002FSKILL.md",[],[79,80,81,82,83],"pluot reference materials","user","Tools","code","documentation",{"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":15,"licenseFileUrl":6,"sourceHtmlUrl":88,"categories":89,"keywords":90,"publishedAt":21},"01M6C0ZKJ5DXMB57SG53GAPM4M","pluot-memoization","Use when writing layer prepare functions which load data asynchronously or otherwise need to cache or memoize results.","https:\u002F\u002Fgithub.com\u002Fkeller-mark\u002Fpluot\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fpluot-memoization\u002FSKILL.md",[],[91,92,93,94,95,96],"pluot memoization","results","data","cache","prepare","writing",{"skillNo":98,"name":99,"nameZh":6,"description":100,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":101,"categories":102,"keywords":103,"publishedAt":21},"01M6C0ZJ279C848HRCTA1YZ454","pluot-layer-parameter-principles","Use when adding fields\u002Fproperties\u002Fmembers to layer parameter structs.","https:\u002F\u002Fgithub.com\u002Fkeller-mark\u002Fpluot\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fpluot-layer-parameter-principles\u002FSKILL.md",[],[104,105,106,107,108],"pluot layer parameter principles","principles","layer","use","properties",{"skillNo":110,"name":111,"nameZh":6,"description":112,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":113,"categories":114,"keywords":115,"publishedAt":21},"01M6C0ZGD3J2WVVE8499GW4Y47","pluot-layer-implementation","Use when implementing layers for Pluot in Rust.","https:\u002F\u002Fgithub.com\u002Fkeller-mark\u002Fpluot\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fpluot-layer-implementation\u002FSKILL.md",[],[116,62],"pluot layer implementation"]