[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6EKZQWSJ6F6SD8PMSZ2EZEK":3,"skill-same:01M6EKZQWSJ6F6SD8PMSZ2EZEK":126},{"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":31,"linkOnly":32,"markdownContent":33,"markdownBody":34,"frontMatter":35,"refName":52,"commitSha":53,"skillDirectory":54,"forksCount":55,"repositoryHtmlUrl":56,"repositoryHomepageUrl":6,"ownerHtmlUrl":57,"ownerBlogUrl":58,"ownerDescription":59,"updatedAt":60,"install":61,"resources":74},"01M6EKZQWSJ6F6SD8PMSZ2EZEK","prediction-quality-gate",null,"Performance floor (AUC ≥ 0.60 \u002F R² ≥ 0.05) before SHAP; if no model passes, skip SHAP entirely.","cgpan\u002Fedm-ars-public","cgpan","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F118746117?v=4","01M6EKT5TG36Q3GH340QN8RH08","Chenguang Pan","01M6EKT5YTQVRARGJF0VPA1SY7",5,"MIT","https:\u002F\u002Fgithub.com\u002Fcgpan\u002Fedm-ars-public\u002Fblob\u002Fmain\u002Fskills\u002Ftask-type\u002Fprediction-quality-gate\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30],"quality gate","quality","gate","prediction quality gate","performance","shap","critic","model","task","analyst","type","thresholds","2026-11-10 10:12:30",false,"---\nname: prediction-quality-gate\nlayer: task-type\ndescription: Performance floor (AUC ≥ 0.60 \u002F R² ≥ 0.05) before SHAP; if no model passes, skip SHAP entirely.\ntrigger_keywords:\n  - quality\n  - gate\n  - floor\n  - threshold\n  - thresholds\n  - shap-eligible\napplicable_task_types:\n  - prediction\napplicable_datasets: []\napplicable_stages:\n  - Analyst\n  - Critic\npriority: 1\nreferences_skills: []\nresources: []\nversion: \"1.0\"\nrule_severity: mandatory\n---\n\n# Prediction Quality Gate\n\nApply this gate **after** evaluating all models on the test set and\n**before** running SHAP. It prevents the system from interpreting noise\nas signal — feature attributions for a non-discriminative model are\nworse than no attributions at all because they look authoritative.\n\n## Floors\n\n| Task type | Metric | Floor |\n|---|---|---|\n| Classification | AUC | `0.60` |\n| Regression | R² | `0.05` |\n\nA model passes the gate iff its primary-metric value on the test set\nis **≥** the floor.\n\n## Operational sequence\n\n```python\nimport analysis_helpers\n\ngate_results = analysis_helpers.model_quality_gate(\n    all_models=results[\"all_models\"],\n    is_classification=is_classification,\n    auc_floor=0.60,\n    r2_floor=0.05,\n)\n\n# Find the best SHAP-eligible model.\nshap_eligible = [\n    (name, gate_results[name][\"metric_value\"])\n    for name, g in gate_results.items()\n    if g[\"shap_eligible\"]\n]\n\nif shap_eligible:\n    shap_model_name = max(shap_eligible, key=lambda x: x[1])[0]\n    # ... run SHAP on shap_model_name ...\nelse:\n    # NO model passed the gate — skip ALL SHAP analysis.\n    warnings_list.append(\n        \"MODEL QUALITY WARNING: No model achieved the minimum performance \"\n        f\"threshold ({'AUC >= 0.60' if is_classification else 'R² >= 0.05'}). \"\n        \"SHAP feature importance analysis was skipped because interpreting \"\n        \"feature contributions from a non-discriminative model would produce \"\n        \"misleading results.\"\n    )\n    results[\"shap_skipped\"] = True\n    results[\"shap_skip_reason\"] = \"no_model_passed_quality_gate\"\n```\n\n## Per-model warnings\n\nFor each model that FAILS the gate, append a warning:\n\n```python\nfor name, g in gate_results.items():\n    if not g[\"passed\"]:\n        warnings_list.append(\n            f\"Model {name} failed quality gate: {g['metric_name']} = \"\n            f\"{g['metric_value']:.4f} (floor = {g['floor']}). This model \"\n            \"is reported in the comparison table but excluded from SHAP \"\n            \"interpretability analysis.\"\n        )\n```\n\n## Why these floors\n\n- **AUC = 0.60** is roughly the threshold below which test-set\n  predictions are statistically distinguishable from chance only at\n  large sample sizes. Below 0.60, SHAP values represent the model's\n  best guess about features that don't actually predict the outcome\n  — meaningless attribution.\n- **R² = 0.05** is the floor below which the model explains less than\n  5% of outcome variance. PDP and SHAP for such a model show structure\n  in noise.\n\n## What goes in `results.json`\n\n```json\n{\n  \"model_quality_gate\": {\n    \"LogisticRegression\": {\n      \"passed\": true, \"metric_name\": \"auc\",\n      \"metric_value\": 0.78, \"floor\": 0.60, \"shap_eligible\": true\n    },\n    \"MLP\": {\n      \"passed\": false, \"metric_name\": \"auc\",\n      \"metric_value\": 0.55, \"floor\": 0.60, \"shap_eligible\": false\n    }\n  },\n  \"shap_model\": \"XGBoost\",\n  \"shap_skipped\": false,\n  \"shap_skip_reason\": null\n}\n```\n\nWhen SHAP is skipped:\n\n```json\n{\n  \"shap_model\": null,\n  \"shap_skipped\": true,\n  \"shap_skip_reason\": \"no_model_passed_quality_gate\"\n}\n```\n\n## Interaction with the MLP timeout fallback\n\nTwo SHAP-source decisions can change the model used for SHAP:\n\n1. **Quality gate** — best individual model fails the floor → fall\n   back to next-best gate-passing individual model.\n2. **MLP KernelExplainer timeout** — MLP is gate-eligible best but\n   times out → fall back to next-best non-MLP individual model\n   (per `shap-explainer-selection`).\n\nWhen both apply, quality gate fires first; the MLP-timeout fallback\nonly runs if MLP passed the gate AND was selected for SHAP.\n\n## Writer's responsibility\n\nWhen `shap_skipped: true`, the Writer must state in §Limitations\nthat SHAP was not computed because no model met the performance\nthreshold, and that reported model comparison numbers should be\ninterpreted with caution. The `paper-writing-style-rules` and\n`hsls09-multilevel-limitations-paragraph` skills describe how this\nfits into the limitations narrative.\n\n## Source provenance\n\nCanonical source: `agent_prompts\u002Fanalyst.yaml` §\"Model Quality Gate\"\n(L380-L427).\n","# Prediction Quality Gate\n\nApply this gate **after** evaluating all models on the test set and\n**before** running SHAP. It prevents the system from interpreting noise\nas signal — feature attributions for a non-discriminative model are\nworse than no attributions at all because they look authoritative.\n\n## Floors\n\n| Task type | Metric | Floor |\n|---|---|---|\n| Classification | AUC | `0.60` |\n| Regression | R² | `0.05` |\n\nA model passes the gate iff its primary-metric value on the test set\nis **≥** the floor.\n\n## Operational sequence\n\n```python\nimport analysis_helpers\n\ngate_results = analysis_helpers.model_quality_gate(\n    all_models=results[\"all_models\"],\n    is_classification=is_classification,\n    auc_floor=0.60,\n    r2_floor=0.05,\n)\n\n# Find the best SHAP-eligible model.\nshap_eligible = [\n    (name, gate_results[name][\"metric_value\"])\n    for name, g in gate_results.items()\n    if g[\"shap_eligible\"]\n]\n\nif shap_eligible:\n    shap_model_name = max(shap_eligible, key=lambda x: x[1])[0]\n    # ... run SHAP on shap_model_name ...\nelse:\n    # NO model passed the gate — skip ALL SHAP analysis.\n    warnings_list.append(\n        \"MODEL QUALITY WARNING: No model achieved the minimum performance \"\n        f\"threshold ({'AUC >= 0.60' if is_classification else 'R² >= 0.05'}). \"\n        \"SHAP feature importance analysis was skipped because interpreting \"\n        \"feature contributions from a non-discriminative model would produce \"\n        \"misleading results.\"\n    )\n    results[\"shap_skipped\"] = True\n    results[\"shap_skip_reason\"] = \"no_model_passed_quality_gate\"\n```\n\n## Per-model warnings\n\nFor each model that FAILS the gate, append a warning:\n\n```python\nfor name, g in gate_results.items():\n    if not g[\"passed\"]:\n        warnings_list.append(\n            f\"Model {name} failed quality gate: {g['metric_name']} = \"\n            f\"{g['metric_value']:.4f} (floor = {g['floor']}). This model \"\n            \"is reported in the comparison table but excluded from SHAP \"\n            \"interpretability analysis.\"\n        )\n```\n\n## Why these floors\n\n- **AUC = 0.60** is roughly the threshold below which test-set\n  predictions are statistically distinguishable from chance only at\n  large sample sizes. Below 0.60, SHAP values represent the model's\n  best guess about features that don't actually predict the outcome\n  — meaningless attribution.\n- **R² = 0.05** is the floor below which the model explains less than\n  5% of outcome variance. PDP and SHAP for such a model show structure\n  in noise.\n\n## What goes in `results.json`\n\n```json\n{\n  \"model_quality_gate\": {\n    \"LogisticRegression\": {\n      \"passed\": true, \"metric_name\": \"auc\",\n      \"metric_value\": 0.78, \"floor\": 0.60, \"shap_eligible\": true\n    },\n    \"MLP\": {\n      \"passed\": false, \"metric_name\": \"auc\",\n      \"metric_value\": 0.55, \"floor\": 0.60, \"shap_eligible\": false\n    }\n  },\n  \"shap_model\": \"XGBoost\",\n  \"shap_skipped\": false,\n  \"shap_skip_reason\": null\n}\n```\n\nWhen SHAP is skipped:\n\n```json\n{\n  \"shap_model\": null,\n  \"shap_skipped\": true,\n  \"shap_skip_reason\": \"no_model_passed_quality_gate\"\n}\n```\n\n## Interaction with the MLP timeout fallback\n\nTwo SHAP-source decisions can change the model used for SHAP:\n\n1. **Quality gate** — best individual model fails the floor → fall\n   back to next-best gate-passing individual model.\n2. **MLP KernelExplainer timeout** — MLP is gate-eligible best but\n   times out → fall back to next-best non-MLP individual model\n   (per `shap-explainer-selection`).\n\nWhen both apply, quality gate fires first; the MLP-timeout fallback\nonly runs if MLP passed the gate AND was selected for SHAP.\n\n## Writer's responsibility\n\nWhen `shap_skipped: true`, the Writer must state in §Limitations\nthat SHAP was not computed because no model met the performance\nthreshold, and that reported model comparison numbers should be\ninterpreted with caution. The `paper-writing-style-rules` and\n`hsls09-multilevel-limitations-paragraph` skills describe how this\nfits into the limitations narrative.\n\n## Source provenance\n\nCanonical source: `agent_prompts\u002Fanalyst.yaml` §\"Model Quality Gate\"\n(L380-L427).\n",{"name":5,"layer":36,"version":37,"priority":38,"resources":39,"description":7,"rule_severity":40,"trigger_keywords":41,"applicable_stages":45,"references_skills":48,"applicable_datasets":49,"applicable_task_types":50},"task-type","1.0",1,[],"mandatory",[20,21,42,43,30,44],"floor","threshold","shap-eligible",[46,47],"Analyst","Critic",[],[],[51],"prediction","main","1aeaead66d2bf876109f3b101005d2eed54041d9","skills\u002Ftask-type\u002Fprediction-quality-gate",0,"https:\u002F\u002Fgithub.com\u002Fcgpan\u002Fedm-ars-public","https:\u002F\u002Fgithub.com\u002Fcgpan","https:\u002F\u002Fcpan.ai","Ph.D. candidate in Measurement, Evaluation, and Statistics.","2026-09-28 20:39:06",{"source":8,"skillName":5,"commands":62,"prompt":72,"zipAvailable":73},[63,66,69],{"tool":64,"command":65},"npx","npx skills add cgpan\u002Fedm-ars-public --skill prediction-quality-gate",{"tool":67,"command":68},"bunx","bunx skills add cgpan\u002Fedm-ars-public --skill prediction-quality-gate",{"tool":70,"command":71},"pnpm","pnpm dlx skills add cgpan\u002Fedm-ars-public --skill prediction-quality-gate","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fcgpan\u002Fedm-ars-public\u002Fblob\u002Fmain\u002Fskills\u002Ftask-type\u002Fprediction-quality-gate\u002FSKILL.md",true,[75,81,85,89,94,98,102,108,112,116,120],{"path":76,"resourceType":77,"resourceTypeDesc":78,"sizeBytes":79,"sourceHtmlUrl":80},".claude-plugin\u002Fmarketplace.json","REFERENCE","参考文档",685,"https:\u002F\u002Fgithub.com\u002Fangel5002\u002Fkfc-arquitectura-empresarial\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Ffrontend-slides\u002F.claude-plugin\u002Fmarketplace.json",{"path":82,"resourceType":77,"resourceTypeDesc":78,"sizeBytes":83,"sourceHtmlUrl":84},"animation-patterns.md",4030,"https:\u002F\u002Fgithub.com\u002Fangel5002\u002Fkfc-arquitectura-empresarial\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Ffrontend-slides\u002Fanimation-patterns.md",{"path":86,"resourceType":77,"resourceTypeDesc":78,"sizeBytes":87,"sourceHtmlUrl":88},"html-template.md",12535,"https:\u002F\u002Fgithub.com\u002Fangel5002\u002Fkfc-arquitectura-empresarial\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Ffrontend-slides\u002Fhtml-template.md",{"path":90,"resourceType":90,"resourceTypeDesc":91,"sizeBytes":92,"sourceHtmlUrl":93},"LICENSE","许可证",1067,"https:\u002F\u002Fgithub.com\u002Fangel5002\u002Fkfc-arquitectura-empresarial\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Ffrontend-slides\u002FLICENSE",{"path":95,"resourceType":77,"resourceTypeDesc":78,"sizeBytes":96,"sourceHtmlUrl":97},"plugins\u002Ffrontend-slides\u002F.claude-plugin\u002Fplugin.json",534,"https:\u002F\u002Fgithub.com\u002Fangel5002\u002Fkfc-arquitectura-empresarial\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Ffrontend-slides\u002Fplugins\u002Ffrontend-slides\u002F.claude-plugin\u002Fplugin.json",{"path":99,"resourceType":77,"resourceTypeDesc":78,"sizeBytes":100,"sourceHtmlUrl":101},"README.md",6686,"https:\u002F\u002Fgithub.com\u002Fangel5002\u002Fkfc-arquitectura-empresarial\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Ffrontend-slides\u002FREADME.md",{"path":103,"resourceType":104,"resourceTypeDesc":105,"sizeBytes":106,"sourceHtmlUrl":107},"scripts\u002Fdeploy.sh","SCRIPT","脚本",8077,"https:\u002F\u002Fgithub.com\u002Fangel5002\u002Fkfc-arquitectura-empresarial\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Ffrontend-slides\u002Fscripts\u002Fdeploy.sh",{"path":109,"resourceType":104,"resourceTypeDesc":105,"sizeBytes":110,"sourceHtmlUrl":111},"scripts\u002Fexport-pdf.sh",13615,"https:\u002F\u002Fgithub.com\u002Fangel5002\u002Fkfc-arquitectura-empresarial\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Ffrontend-slides\u002Fscripts\u002Fexport-pdf.sh",{"path":113,"resourceType":104,"resourceTypeDesc":105,"sizeBytes":114,"sourceHtmlUrl":115},"scripts\u002Fextract-pptx.py",2917,"https:\u002F\u002Fgithub.com\u002Fangel5002\u002Fkfc-arquitectura-empresarial\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Ffrontend-slides\u002Fscripts\u002Fextract-pptx.py",{"path":117,"resourceType":77,"resourceTypeDesc":78,"sizeBytes":118,"sourceHtmlUrl":119},"STYLE_PRESETS.md",8202,"https:\u002F\u002Fgithub.com\u002Fangel5002\u002Fkfc-arquitectura-empresarial\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Ffrontend-slides\u002FSTYLE_PRESETS.md",{"path":121,"resourceType":122,"resourceTypeDesc":123,"sizeBytes":124,"sourceHtmlUrl":125},"viewport-base.css","OTHER","其他",4037,"https:\u002F\u002Fgithub.com\u002Fangel5002\u002Fkfc-arquitectura-empresarial\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Ffrontend-slides\u002Fviewport-base.css",[127,150,160,169,182,193],{"skillNo":128,"name":129,"nameZh":6,"description":130,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":131,"categories":132,"keywords":143,"publishedAt":31},"01M6EM1ZTQZVAP90DZTVBHCCFB","acm-fixture","Fixture writing skill for ACM acmart sigconf paper output.","https:\u002F\u002Fgithub.com\u002Fcgpan\u002Fedm-ars-public\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fskills\u002Fwriting\u002Facm-fixture\u002FSKILL.md",[133,138],{"categoryNo":134,"categoryName":135,"taxonomyType":136,"taxonomyTypeDesc":137},"01JBSEEDCAT000000000000018","写作与文案","SCENARIO","使用场景",{"categoryNo":139,"categoryName":140,"taxonomyType":141,"taxonomyTypeDesc":142},"01JBSEEDCAT000000000000036","内容创作者","PROFESSION","适用职业",[144,145,146,147,148,149],"acm fixture","fixture","writing","LaTeX","writer","paper",{"skillNo":151,"name":152,"nameZh":6,"description":153,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":154,"categories":155,"keywords":156,"publishedAt":31},"01M6EM1XNFETAZFGPHQPAXKBYN","prediction-fixture","Fixture skill for the prediction task type; references shap-fixture.","https:\u002F\u002Fgithub.com\u002Fcgpan\u002Fedm-ars-public\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fskills\u002Ftask-type\u002Fprediction-fixture\u002FSKILL.md",[],[145,157,27,29,158,159,24,28],"prediction fixture","references","fixture skill",{"skillNo":161,"name":162,"nameZh":6,"description":163,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":164,"categories":165,"keywords":166,"publishedAt":31},"01M6EM1V4MQXYGQ7K2ZDJRAPSM","causal-fixture","Fixture skill for the causal_inference task type.","https:\u002F\u002Fgithub.com\u002Fcgpan\u002Fedm-ars-public\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fskills\u002Ftask-type\u002Fcausal-fixture\u002FSKILL.md",[],[145,167,29,27,168,159],"causal fixture","inference",{"skillNo":170,"name":171,"nameZh":6,"description":172,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":173,"categories":174,"keywords":175,"publishedAt":31},"01M6EM1SCWFZZ2ACSAP65GNWK9","shap-fixture","Fixture methodology for SHAP feature importance analysis.","https:\u002F\u002Fgithub.com\u002Fcgpan\u002Fedm-ars-public\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fskills\u002Fmethodology\u002Fshap-fixture\u002FSKILL.md",[],[176,145,24,177,178,179,180,181],"shap fixture","feature importance","methodology","analysis","explainer","feature",{"skillNo":183,"name":184,"nameZh":6,"description":185,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":186,"categories":187,"keywords":188,"publishedAt":31},"01M6EM1PZC1MK1G0D1YFVYAQ9W","cluster-recon-fixture","Fixture methodology for reconstructing cluster IDs from fingerprint variables.","https:\u002F\u002Fgithub.com\u002Fcgpan\u002Fedm-ars-public\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fskills\u002Fmethodology\u002Fcluster-recon-fixture\u002FSKILL.md",[],[189,190,191,145,192,178],"recon","cluster recon fixture","cluster","ids",{"skillNo":194,"name":195,"nameZh":6,"description":196,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":197,"categories":198,"keywords":199,"publishedAt":31},"01M6EM1MZVKMSWEXZ7TJ45DS04","hsls09-fixture","Fixture skill for HSLS:09 with a bundled YAML resource and one cross-reference.","https:\u002F\u002Fgithub.com\u002Fcgpan\u002Fedm-ars-public\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fskills\u002Fdataset\u002Fhsls09-fixture\u002FSKILL.md",[],[145,200,201,202,203,159,204,189,191,205],"hsls09 fixture","yaml","public","reference","dataset","registry"]