[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6XE9BP5KC2SSRH123HSP7HV":3,"skill-same:01M6XE9BP5KC2SSRH123HSP7HV":52},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":26,"linkOnly":27,"markdownContent":28,"markdownBody":29,"frontMatter":30,"refName":31,"commitSha":32,"skillDirectory":33,"forksCount":13,"repositoryHtmlUrl":34,"repositoryHomepageUrl":6,"ownerHtmlUrl":35,"ownerBlogUrl":6,"ownerDescription":36,"updatedAt":37,"install":38,"resources":51},"01M6XE9BP5KC2SSRH123HSP7HV","safety-interlocks",null,"Implement safety interlocks and protective mechanisms to prevent equipment damage and ensure safe control system operation.","Waaaalnut\u002Fskillsbench","Waaaalnut","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F103995656?v=4","01M6XCS9K1V51EY3JMB7DGMX24","01M6XCS9Q4WPW88W62C55G1H44",0,"Apache-2.0","https:\u002F\u002Fgithub.com\u002FWaaaalnut\u002Fskillsbench\u002Fblob\u002Fmain\u002Ftasks\u002Fhvac-control\u002Fenvironment\u002Fskills\u002Fsafety-interlocks\u002FSKILL.md",[],[18,19,20,21,22,23,24,25],"Safety","safety interlocks","safe","implement","system","safe control","control","operation","2026-11-10 10:12:30",false,"---\nname: safety-interlocks\ndescription: Implement safety interlocks and protective mechanisms to prevent equipment damage and ensure safe control system operation.\n---\n\n# Safety Interlocks for Control Systems\n\n## Overview\n\nSafety interlocks are protective mechanisms that prevent equipment damage and ensure safe operation. In control systems, the primary risks are output saturation and exceeding safe operating limits.\n\n## Implementation Pattern\n\nAlways check safety conditions BEFORE applying control outputs:\n\n```python\ndef apply_safety_limits(measurement, command, max_limit, min_limit, max_output, min_output):\n    \"\"\"\n    Apply safety checks and return safe command.\n\n    Args:\n        measurement: Current sensor reading\n        command: Requested control output\n        max_limit: Maximum safe measurement value\n        min_limit: Minimum safe measurement value\n        max_output: Maximum output command\n        min_output: Minimum output command\n\n    Returns:\n        tuple: (safe_command, safety_triggered)\n    \"\"\"\n    safety_triggered = False\n\n    # Check for over-limit - HIGHEST PRIORITY\n    if measurement >= max_limit:\n        command = min_output  # Emergency cutoff\n        safety_triggered = True\n\n    # Clamp output to valid range\n    command = max(min_output, min(max_output, command))\n\n    return command, safety_triggered\n```\n\n## Integration with Control Loop\n\n```python\nclass SafeController:\n    def __init__(self, controller, max_limit, min_output=0.0, max_output=100.0):\n        self.controller = controller\n        self.max_limit = max_limit\n        self.min_output = min_output\n        self.max_output = max_output\n        self.safety_events = []\n\n    def compute(self, measurement, dt):\n        \"\"\"Compute safe control output.\"\"\"\n        # Check safety FIRST\n        if measurement >= self.max_limit:\n            self.safety_events.append({\n                \"measurement\": measurement,\n                \"action\": \"emergency_cutoff\"\n            })\n            return self.min_output\n\n        # Normal control\n        output = self.controller.compute(measurement, dt)\n\n        # Clamp to valid range\n        return max(self.min_output, min(self.max_output, output))\n```\n\n## Safety During Open-Loop Testing\n\nDuring calibration\u002Fexcitation, safety is especially important because there's no feedback control:\n\n```python\ndef run_test_with_safety(system, input_value, duration, dt, max_limit):\n    \"\"\"Run open-loop test while monitoring safety limits.\"\"\"\n    data = []\n    current_input = input_value\n\n    for step in range(int(duration \u002F dt)):\n        result = system.step(current_input)\n        data.append(result)\n\n        # Safety check\n        if result[\"output\"] >= max_limit:\n            current_input = 0.0  # Cut input\n\n    return data\n```\n\n## Logging Safety Events\n\nAlways log safety events for analysis:\n\n```python\nsafety_log = {\n    \"limit\": max_limit,\n    \"events\": []\n}\n\nif measurement >= max_limit:\n    safety_log[\"events\"].append({\n        \"time\": current_time,\n        \"measurement\": measurement,\n        \"command_before\": command,\n        \"command_after\": 0.0,\n        \"event_type\": \"limit_exceeded\"\n    })\n```\n\n## Pre-Control Checklist\n\nBefore starting any control operation:\n\n1. **Verify sensor reading is reasonable**\n   - Not NaN or infinite\n   - Within physical bounds\n\n2. **Check initial conditions**\n   - Measurement should be at expected starting point\n   - Output should start at safe value\n\n3. **Confirm safety limits are configured**\n   - Maximum limit threshold set\n   - Output clamping enabled\n\n```python\ndef pre_control_checks(measurement, config):\n    \"\"\"Run pre-control safety verification.\"\"\"\n    assert not np.isnan(measurement), \"Measurement is NaN\"\n    assert config.get(\"max_limit\") is not None, \"Safety limit not configured\"\n    return True\n```\n\n## Best Practices\n\n1. **Defense in depth**: Multiple layers of protection\n2. **Fail safe**: When in doubt, reduce output\n3. **Log everything**: Record all safety events\n4. **Never bypass**: Safety code should not be conditionally disabled\n5. **Test safety**: Verify interlocks work before normal operation\n","# Safety Interlocks for Control Systems\n\n## Overview\n\nSafety interlocks are protective mechanisms that prevent equipment damage and ensure safe operation. In control systems, the primary risks are output saturation and exceeding safe operating limits.\n\n## Implementation Pattern\n\nAlways check safety conditions BEFORE applying control outputs:\n\n```python\ndef apply_safety_limits(measurement, command, max_limit, min_limit, max_output, min_output):\n    \"\"\"\n    Apply safety checks and return safe command.\n\n    Args:\n        measurement: Current sensor reading\n        command: Requested control output\n        max_limit: Maximum safe measurement value\n        min_limit: Minimum safe measurement value\n        max_output: Maximum output command\n        min_output: Minimum output command\n\n    Returns:\n        tuple: (safe_command, safety_triggered)\n    \"\"\"\n    safety_triggered = False\n\n    # Check for over-limit - HIGHEST PRIORITY\n    if measurement >= max_limit:\n        command = min_output  # Emergency cutoff\n        safety_triggered = True\n\n    # Clamp output to valid range\n    command = max(min_output, min(max_output, command))\n\n    return command, safety_triggered\n```\n\n## Integration with Control Loop\n\n```python\nclass SafeController:\n    def __init__(self, controller, max_limit, min_output=0.0, max_output=100.0):\n        self.controller = controller\n        self.max_limit = max_limit\n        self.min_output = min_output\n        self.max_output = max_output\n        self.safety_events = []\n\n    def compute(self, measurement, dt):\n        \"\"\"Compute safe control output.\"\"\"\n        # Check safety FIRST\n        if measurement >= self.max_limit:\n            self.safety_events.append({\n                \"measurement\": measurement,\n                \"action\": \"emergency_cutoff\"\n            })\n            return self.min_output\n\n        # Normal control\n        output = self.controller.compute(measurement, dt)\n\n        # Clamp to valid range\n        return max(self.min_output, min(self.max_output, output))\n```\n\n## Safety During Open-Loop Testing\n\nDuring calibration\u002Fexcitation, safety is especially important because there's no feedback control:\n\n```python\ndef run_test_with_safety(system, input_value, duration, dt, max_limit):\n    \"\"\"Run open-loop test while monitoring safety limits.\"\"\"\n    data = []\n    current_input = input_value\n\n    for step in range(int(duration \u002F dt)):\n        result = system.step(current_input)\n        data.append(result)\n\n        # Safety check\n        if result[\"output\"] >= max_limit:\n            current_input = 0.0  # Cut input\n\n    return data\n```\n\n## Logging Safety Events\n\nAlways log safety events for analysis:\n\n```python\nsafety_log = {\n    \"limit\": max_limit,\n    \"events\": []\n}\n\nif measurement >= max_limit:\n    safety_log[\"events\"].append({\n        \"time\": current_time,\n        \"measurement\": measurement,\n        \"command_before\": command,\n        \"command_after\": 0.0,\n        \"event_type\": \"limit_exceeded\"\n    })\n```\n\n## Pre-Control Checklist\n\nBefore starting any control operation:\n\n1. **Verify sensor reading is reasonable**\n   - Not NaN or infinite\n   - Within physical bounds\n\n2. **Check initial conditions**\n   - Measurement should be at expected starting point\n   - Output should start at safe value\n\n3. **Confirm safety limits are configured**\n   - Maximum limit threshold set\n   - Output clamping enabled\n\n```python\ndef pre_control_checks(measurement, config):\n    \"\"\"Run pre-control safety verification.\"\"\"\n    assert not np.isnan(measurement), \"Measurement is NaN\"\n    assert config.get(\"max_limit\") is not None, \"Safety limit not configured\"\n    return True\n```\n\n## Best Practices\n\n1. **Defense in depth**: Multiple layers of protection\n2. **Fail safe**: When in doubt, reduce output\n3. **Log everything**: Record all safety events\n4. **Never bypass**: Safety code should not be conditionally disabled\n5. **Test safety**: Verify interlocks work before normal operation\n",{"name":5,"description":7},"main","7eeb258ada72b7f58119b0e7a2c00ea89d9beedd","tasks\u002Fhvac-control\u002Fenvironment\u002Fskills\u002Fsafety-interlocks","https:\u002F\u002Fgithub.com\u002FWaaaalnut\u002Fskillsbench","https:\u002F\u002Fgithub.com\u002FWaaaalnut","student of Zhejiang University","2026-04-21 23:16:23",{"source":8,"skillName":5,"commands":39,"prompt":49,"zipAvailable":50},[40,43,46],{"tool":41,"command":42},"npx","npx skills add Waaaalnut\u002Fskillsbench --skill safety-interlocks",{"tool":44,"command":45},"bunx","bunx skills add Waaaalnut\u002Fskillsbench --skill safety-interlocks",{"tool":47,"command":48},"pnpm","pnpm dlx skills add Waaaalnut\u002Fskillsbench --skill safety-interlocks","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FWaaaalnut\u002Fskillsbench\u002Fblob\u002Fmain\u002Ftasks\u002Fhvac-control\u002Fenvironment\u002Fskills\u002Fsafety-interlocks\u002FSKILL.md",true,[],[53,67,82,110,132,151],{"skillNo":54,"name":55,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":56,"categories":57,"keywords":63,"publishedAt":26},"01M6XEWMJ6VY3ZC53MPDCPG3GH","data-reconciliation","https:\u002F\u002Fgithub.com\u002FWaaaalnut\u002Fskillsbench\u002Fblob\u002Fmain\u002Ftasks\u002Fxlsx-recover-data\u002Fenvironment\u002Fskills\u002Fdata-reconciliation\u002FSKILL.md",[58],{"categoryNo":59,"categoryName":60,"taxonomyType":61,"taxonomyTypeDesc":62},"01JBSEEDCAT000000000000033","数据分析师","PROFESSION","适用职业",[64,65,66],"data reconciliation","reconciliation","data",{"skillNo":68,"name":69,"nameZh":6,"description":70,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":71,"categories":72,"keywords":73,"publishedAt":26},"01M6XEW8MNPMF1KRXV6ATGFRQF","speech-to-text","Transcribe video to timestamped text using Whisper tiny model (pre-installed).","https:\u002F\u002Fgithub.com\u002FWaaaalnut\u002Fskillsbench\u002Fblob\u002Fmain\u002Ftasks\u002Fvideo-tutorial-indexer\u002Fenvironment\u002Fskills\u002Fspeech-to-text\u002FSKILL.md",[],[74,75,76,77,78,79,80,81],"speech","text","speech to text","transcribe video","whisper","model","Video","transcribe",{"skillNo":83,"name":84,"nameZh":6,"description":85,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":86,"categories":87,"keywords":93,"publishedAt":26},"01M6XEW3FQZP0T1RKQQJFXVY9T","video-processor","Process videos by removing segments and concatenating remaining parts. Use when you need to remove detected pauses\u002Fopenings from videos, create highlight reels, or batch process segment removals using ffmpeg filter_complex.","https:\u002F\u002Fgithub.com\u002FWaaaalnut\u002Fskillsbench\u002Fblob\u002Fmain\u002Ftasks\u002Fvideo-silence-remover\u002Fenvironment\u002Fskills\u002Fvideo-processor\u002FSKILL.md",[88],{"categoryNo":89,"categoryName":90,"taxonomyType":91,"taxonomyTypeDesc":92},"01JBSEEDCAT000000000000016","图像与多媒体","SCENARIO","使用场景",[80,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109],"processor","video processor","batch","create","reels","when","parts","segments","process","videos","you","segment","filter","ffmpeg","use","remove",{"skillNo":111,"name":112,"nameZh":6,"description":113,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":114,"categories":115,"keywords":117,"publishedAt":26},"01M6XEVXJ5KZ0NTY3XZKRY4AS1","silence-detector","Detect initial silence segments in audio\u002Fvideo using energy-based analysis. Use when you need to find low-energy periods at the start of recordings (title slides, setup time, pre-roll silence).","https:\u002F\u002Fgithub.com\u002FWaaaalnut\u002Fskillsbench\u002Fblob\u002Fmain\u002Ftasks\u002Fvideo-silence-remover\u002Fenvironment\u002Fskills\u002Fsilence-detector\u002FSKILL.md",[116],{"categoryNo":89,"categoryName":90,"taxonomyType":91,"taxonomyTypeDesc":92},[118,119,120,121,99,104,122,123,124,125,126,101,127,128,80,129,130,131,108],"detector","silence detector","title","slides","time","energy","at","recordings","detect","find","Audio","analysis","start","setup",{"skillNo":133,"name":134,"nameZh":6,"description":135,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":136,"categories":137,"keywords":138,"publishedAt":26},"01M6XEVT3NGRN1FT7JPMAPXS6M","segment-combiner","Combine multiple segment detection results into a unified list. Use when you need to merge segments from different detectors, prepare removal lists for video processing, or consolidate detection outputs.","https:\u002F\u002Fgithub.com\u002FWaaaalnut\u002Fskillsbench\u002Fblob\u002Fmain\u002Ftasks\u002Fvideo-silence-remover\u002Fenvironment\u002Fskills\u002Fsegment-combiner\u002FSKILL.md",[],[105,139,80,140,141,142,143,144,99,145,146,101,104,147,148,108,149,150],"segment combiner","detection","prepare","merge","video processing","for","outputs","combine","processing","consolidate","results","list",{"skillNo":152,"name":153,"nameZh":6,"description":154,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":155,"categories":156,"keywords":160,"publishedAt":26},"01M6XEVMPVASGS2KX86QK4FMT7","report-generator","Generate compression reports for video processing. Use when you need to create structured JSON reports with duration statistics, compression ratios, and segment details after video processing.","https:\u002F\u002Fgithub.com\u002FWaaaalnut\u002Fskillsbench\u002Fblob\u002Fmain\u002Ftasks\u002Fvideo-silence-remover\u002Fenvironment\u002Fskills\u002Freport-generator\u002FSKILL.md",[157],{"categoryNo":158,"categoryName":159,"taxonomyType":61,"taxonomyTypeDesc":62},"01JBSEEDCAT000000000000034","行政与办公人员",[161,162,163,105,99,144,104,164,147,165,166,167,108,143,168,80,169,170,97],"generator","report generator","report","with","statistics","structured","reports","json","compression","generate"]