[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6N8TH50ABZGAXYPXTR5J014":3,"skill-same:01M6N8TH50ABZGAXYPXTR5J014":74},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":27,"publishedAt":48,"linkOnly":49,"markdownContent":50,"markdownBody":51,"frontMatter":52,"refName":53,"commitSha":54,"skillDirectory":55,"forksCount":56,"repositoryHtmlUrl":57,"repositoryHomepageUrl":6,"ownerHtmlUrl":58,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":59,"install":60,"resources":73},"01M6N8TH50ABZGAXYPXTR5J014","bubbles-backup-bcdr-doctrine",null,"Backup tier model, RTO\u002FRPO definitions, restore-drill cadence requirements, and `OFFSITE_BACKEND` swap contract. Use when defining backup strategy for a new product, when choosing\u002Fchanging offsite backend, when authoring a BCDR plan, or when interpreting backup ledger entries.","pkirsanov\u002Fsmackerel","pkirsanov","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F138962?v=4","01M6N8NAPD2KXMVC17X6GJ0WZ5","01M6N8NATQ9SAZ00H9D61R0TPV",1,"MIT","https:\u002F\u002Fgithub.com\u002Fpkirsanov\u002Fsmackerel\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fbubbles-backup-bcdr-doctrine\u002FSKILL.md",[17,22],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000010","后端与接口","SCENARIO","使用场景",{"categoryNo":23,"categoryName":24,"taxonomyType":25,"taxonomyTypeDesc":26},"01JBSEEDCAT000000000000037","律师与法务","PROFESSION","适用职业",[28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47],"doctrine","bubbles backup bcdr doctrine","backup","backup strategy","for","cadence","drill","contract","requirements","entries","swap","rto","product","restore","backend","use","strategy","model","plan","rpo","2026-11-10 10:12:30",false,"---\ndescription: Backup tier model, RTO\u002FRPO definitions, restore-drill cadence requirements, and `OFFSITE_BACKEND` swap contract. Use when defining backup strategy for a new product, when choosing\u002Fchanging offsite backend, when authoring a BCDR plan, or when interpreting backup ledger entries.\n---\n\n# Backup + BCDR Doctrine\n\n## Four Tiers (Encapsulated via `OFFSITE_BACKEND` env)\n\n| Tier | Protects against | Backend | Where engine writes | Frequency |\n|---|---|---|---|---|\n| **T1** ZFS snapshot | Accidental delete, app corruption | ZFS on `tank\u002F\u003Cdataset>` | `tank\u002F\u003Cdataset>@upkeep-\u003Cts>` | Daily |\n| **T2** Host-local restic | Single-volume corruption, restore-test isolation | restic to `\u002Fsrv\u002Fbackups\u002Frestic\u002F\u003Cproduct>` | Daily |\n| **T3** Near-line removable | RAID controller failure, ransomware, host wipe | restic to mounted USB drive (rotated weekly, physically separated) | Daily (when drive mounted) |\n| **T4** True offsite cloud | Fire, theft, total host loss | restic to B2\u002FR2\u002FWasabi\u002FS3\u002Frclone-any | Daily (when configured) |\n\n## `OFFSITE_BACKEND` Env Contract\n\nSingle env var, set in per-product `\u003Cproduct>\u002F\u003Ctarget>\u002Fparams.yaml`:\n\n```bash\n# Today (RAID5 only, T1+T2):\nOFFSITE_BACKEND=local-only\n\n# When USB drives arrive:\nOFFSITE_BACKEND=restic_usb:\u002Fmnt\u002Fusb-backup-1\n\n# When cloud offsite added later:\nOFFSITE_BACKEND=restic_b2:bucket=mybucket\nOFFSITE_BACKEND=restic_r2:bucket=mybucket\nOFFSITE_BACKEND=restic_wasabi:bucket=mybucket\nOFFSITE_BACKEND=restic_s3:bucket=mybucket\nOFFSITE_BACKEND=restic_rclone:remote=myremote\n```\n\nEngine (`knb\u002Fshared\u002Fupkeep\u002Foffsite-restic.sh`) parses the prefix (`restic_\u003Ctype>:\u003Cconfig>`) and dispatches to the right restic backend. **Swapping tiers requires zero product changes.**\n\n## RTO \u002F RPO Definitions\n\n| Term | Meaning | How measured |\n|---|---|---|\n| **RTO** Recovery Time Objective | Max time from declaring incident → product back online | `bcdr-drill` ledger entry: `finished_at − incident_declared_at` |\n| **RPO** Recovery Point Objective | Max data loss tolerated (in time) | Backup cadence — daily = 24h RPO ceiling |\n\nPer-product RTO\u002FRPO declared in `docs\u002FBCDR_Plan.md`:\n\n```markdown\n| Product | RTO | RPO | Notes |\n|---|---|---|---|\n| \u003Cproduct-a> | 4h | 24h | Daily backup + manual cutover |\n| \u003Cproduct-b> | 12h | 24h | Single-user; longer RTO acceptable |\n| \u003Cproduct-c> | 2h | 1h | Hot path; needs hourly backup eventually |\n| \u003Cproduct-d> | 1h | 1h | Trading-adjacent; eventually needs sub-hourly |\n```\n\n## Drill Cadence\n\n| Drill | Cadence | Mode | Pass criteria |\n|---|---|---|---|\n| Restore-test | Weekly | `upkeep-restore-drill` | Restore from T2 into isolated namespace; smoke check exit 0 |\n| BCDR-drill | Quarterly | `upkeep-bcdr-drill` | Full stack restore from highest available tier; RTO ≤ declared; smoke + integration checks exit 0 |\n| Compliance-sweep | Quarterly | `upkeep-compliance-sweep` | G117-G120 evidence collected; report generated; audit sign-off received |\n\n## Gate Behavior\n\n- **G112 backup-evidence-required** — Every train in `active` phase shipping to non-`none` slot MUST have a recent (≤ cadence) successful backup ledger entry. Blocks `release-train-promote`.\n- **G113 restore-drill-evidence** — Every product MUST have a successful restore-test within the cadence. Failed restore-test blocks next `release-train-promote` on that product.\n- **G114 bcdr-evidence** — Quarterly drill required for trains in `prod` slot.\n- **G116 offsite-backup-required-for-prod-trains** — Behavior depends on `release-trains.yaml`:\n  - `offsite_required: false` (default) → **warns** when `OFFSITE_BACKEND=local-only`\n  - `offsite_required: true` → **blocks** promote when `OFFSITE_BACKEND=local-only`\n  - Operator flips this switch when USB drives or cloud offsite arrive. **No code change needed.**\n\n## Initial Reality Pattern (single-host RAID, no offsite yet)\n\n- T1 + T2 run daily; protect against software corruption + single-disk failure (RAID5 absorbs 1 disk loss).\n- T3 + T4 skipped with WARN entries in ledger.\n- G114 BCDR drill: WARN only — true BCDR requires offsite.\n- G116: WARN only (`offsite_required: false`).\n\nWhen USB arrives: operator mounts drive, sets `OFFSITE_BACKEND=restic_usb:\u002Fmnt\u002Fusb-backup-1`, re-runs adapter `apply.sh`. T3 starts populating on next nightly backup.\n\nWhen cloud arrives: operator sets `OFFSITE_BACKEND=restic_b2:...`, sets `offsite_required: true`, re-runs apply. G114\u002FG116 flip from warn → block.\n\n## Anti-Patterns\n\n| ❌ Wrong | ✅ Right |\n|---|---|\n| Custom per-product backup scripts that bypass the engine | One engine; per-product `backup.sh` declares what to dump |\n| Storing offsite credentials in the repo | Operator's password manager only; engine reads from runtime env |\n| Skipping restore-test because \"backup completed\" | Backup completion ≠ restore success; G113 requires actual restore |\n| Restoring into prod namespace to \"save time\" | Ephemeral `restore-test` namespace only (G115) |\n| Treating `local-only` as production-ready | At minimum WARN; with `offsite_required: true` it blocks |\n\n## See Also\n\n- Skill: `bubbles-upkeep-cadence` (task scheduling)\n- Skill: `bubbles-env-pollution-isolation` (G115)\n- knb skill: `knb-offsite-backup-restic` (backend implementation)\n- Agent: `bubbles.upkeep` (Treena Lahey)\n- Gates: G112, G113, G114, G116\n","# Backup + BCDR Doctrine\n\n## Four Tiers (Encapsulated via `OFFSITE_BACKEND` env)\n\n| Tier | Protects against | Backend | Where engine writes | Frequency |\n|---|---|---|---|---|\n| **T1** ZFS snapshot | Accidental delete, app corruption | ZFS on `tank\u002F\u003Cdataset>` | `tank\u002F\u003Cdataset>@upkeep-\u003Cts>` | Daily |\n| **T2** Host-local restic | Single-volume corruption, restore-test isolation | restic to `\u002Fsrv\u002Fbackups\u002Frestic\u002F\u003Cproduct>` | Daily |\n| **T3** Near-line removable | RAID controller failure, ransomware, host wipe | restic to mounted USB drive (rotated weekly, physically separated) | Daily (when drive mounted) |\n| **T4** True offsite cloud | Fire, theft, total host loss | restic to B2\u002FR2\u002FWasabi\u002FS3\u002Frclone-any | Daily (when configured) |\n\n## `OFFSITE_BACKEND` Env Contract\n\nSingle env var, set in per-product `\u003Cproduct>\u002F\u003Ctarget>\u002Fparams.yaml`:\n\n```bash\n# Today (RAID5 only, T1+T2):\nOFFSITE_BACKEND=local-only\n\n# When USB drives arrive:\nOFFSITE_BACKEND=restic_usb:\u002Fmnt\u002Fusb-backup-1\n\n# When cloud offsite added later:\nOFFSITE_BACKEND=restic_b2:bucket=mybucket\nOFFSITE_BACKEND=restic_r2:bucket=mybucket\nOFFSITE_BACKEND=restic_wasabi:bucket=mybucket\nOFFSITE_BACKEND=restic_s3:bucket=mybucket\nOFFSITE_BACKEND=restic_rclone:remote=myremote\n```\n\nEngine (`knb\u002Fshared\u002Fupkeep\u002Foffsite-restic.sh`) parses the prefix (`restic_\u003Ctype>:\u003Cconfig>`) and dispatches to the right restic backend. **Swapping tiers requires zero product changes.**\n\n## RTO \u002F RPO Definitions\n\n| Term | Meaning | How measured |\n|---|---|---|\n| **RTO** Recovery Time Objective | Max time from declaring incident → product back online | `bcdr-drill` ledger entry: `finished_at − incident_declared_at` |\n| **RPO** Recovery Point Objective | Max data loss tolerated (in time) | Backup cadence — daily = 24h RPO ceiling |\n\nPer-product RTO\u002FRPO declared in `docs\u002FBCDR_Plan.md`:\n\n```markdown\n| Product | RTO | RPO | Notes |\n|---|---|---|---|\n| \u003Cproduct-a> | 4h | 24h | Daily backup + manual cutover |\n| \u003Cproduct-b> | 12h | 24h | Single-user; longer RTO acceptable |\n| \u003Cproduct-c> | 2h | 1h | Hot path; needs hourly backup eventually |\n| \u003Cproduct-d> | 1h | 1h | Trading-adjacent; eventually needs sub-hourly |\n```\n\n## Drill Cadence\n\n| Drill | Cadence | Mode | Pass criteria |\n|---|---|---|---|\n| Restore-test | Weekly | `upkeep-restore-drill` | Restore from T2 into isolated namespace; smoke check exit 0 |\n| BCDR-drill | Quarterly | `upkeep-bcdr-drill` | Full stack restore from highest available tier; RTO ≤ declared; smoke + integration checks exit 0 |\n| Compliance-sweep | Quarterly | `upkeep-compliance-sweep` | G117-G120 evidence collected; report generated; audit sign-off received |\n\n## Gate Behavior\n\n- **G112 backup-evidence-required** — Every train in `active` phase shipping to non-`none` slot MUST have a recent (≤ cadence) successful backup ledger entry. Blocks `release-train-promote`.\n- **G113 restore-drill-evidence** — Every product MUST have a successful restore-test within the cadence. Failed restore-test blocks next `release-train-promote` on that product.\n- **G114 bcdr-evidence** — Quarterly drill required for trains in `prod` slot.\n- **G116 offsite-backup-required-for-prod-trains** — Behavior depends on `release-trains.yaml`:\n  - `offsite_required: false` (default) → **warns** when `OFFSITE_BACKEND=local-only`\n  - `offsite_required: true` → **blocks** promote when `OFFSITE_BACKEND=local-only`\n  - Operator flips this switch when USB drives or cloud offsite arrive. **No code change needed.**\n\n## Initial Reality Pattern (single-host RAID, no offsite yet)\n\n- T1 + T2 run daily; protect against software corruption + single-disk failure (RAID5 absorbs 1 disk loss).\n- T3 + T4 skipped with WARN entries in ledger.\n- G114 BCDR drill: WARN only — true BCDR requires offsite.\n- G116: WARN only (`offsite_required: false`).\n\nWhen USB arrives: operator mounts drive, sets `OFFSITE_BACKEND=restic_usb:\u002Fmnt\u002Fusb-backup-1`, re-runs adapter `apply.sh`. T3 starts populating on next nightly backup.\n\nWhen cloud arrives: operator sets `OFFSITE_BACKEND=restic_b2:...`, sets `offsite_required: true`, re-runs apply. G114\u002FG116 flip from warn → block.\n\n## Anti-Patterns\n\n| ❌ Wrong | ✅ Right |\n|---|---|\n| Custom per-product backup scripts that bypass the engine | One engine; per-product `backup.sh` declares what to dump |\n| Storing offsite credentials in the repo | Operator's password manager only; engine reads from runtime env |\n| Skipping restore-test because \"backup completed\" | Backup completion ≠ restore success; G113 requires actual restore |\n| Restoring into prod namespace to \"save time\" | Ephemeral `restore-test` namespace only (G115) |\n| Treating `local-only` as production-ready | At minimum WARN; with `offsite_required: true` it blocks |\n\n## See Also\n\n- Skill: `bubbles-upkeep-cadence` (task scheduling)\n- Skill: `bubbles-env-pollution-isolation` (G115)\n- knb skill: `knb-offsite-backup-restic` (backend implementation)\n- Agent: `bubbles.upkeep` (Treena Lahey)\n- Gates: G112, G113, G114, G116\n",{"description":7},"main","ed893cc338281a0bb9bb9ecf3415716cb242bb3f",".claude\u002Fskills\u002Fbubbles-backup-bcdr-doctrine",0,"https:\u002F\u002Fgithub.com\u002Fpkirsanov\u002Fsmackerel","https:\u002F\u002Fgithub.com\u002Fpkirsanov","2026-11-07 02:54:37",{"source":8,"skillName":5,"commands":61,"prompt":71,"zipAvailable":72},[62,65,68],{"tool":63,"command":64},"npx","npx skills add pkirsanov\u002Fsmackerel --skill bubbles-backup-bcdr-doctrine",{"tool":66,"command":67},"bunx","bunx skills add pkirsanov\u002Fsmackerel --skill bubbles-backup-bcdr-doctrine",{"tool":69,"command":70},"pnpm","pnpm dlx skills add pkirsanov\u002Fsmackerel --skill bubbles-backup-bcdr-doctrine","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fpkirsanov\u002Fsmackerel\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fbubbles-backup-bcdr-doctrine\u002FSKILL.md",true,[],[75,104,132,159,180,207],{"skillNo":76,"name":77,"nameZh":6,"description":78,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":79,"categories":80,"keywords":84,"publishedAt":48},"01M6N9V5TBHQT20V5SCCJ1VRBC","smackerel-trace-capture","Wire Smackerel's concrete validate-plane stack into the framework trace-driven defect-discovery method. Use when running live-category tests (integration\u002Fe2e\u002Fe2e-ui\u002Fstress) against the ephemeral test stack; capturing SLO or trace evidence; hunting latency\u002Ferror\u002Fperf bugs from spans; querying the test-stack Jaeger or Prometheus; or touching `.specify\u002Fruntime\u002Fobservability`. Concrete smackerel endpoints + the exact `capture-slo.sh` command; do NOT duplicate `bubbles-observability-adapter` — this only adds the wiring.","https:\u002F\u002Fgithub.com\u002Fpkirsanov\u002Fsmackerel\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fsmackerel-trace-capture\u002FSKILL.md",[81],{"categoryNo":82,"categoryName":83,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000008","测试与质量",[85,86,87,88,89,90,91,92,93,43,94,95,96,97,98,99,100,101,102,103],"trace","capture","smackerel trace capture","perf","observability","prometheus","specify","e2e","discovery","slo","only","evidence","do","latency","runtime","tests","adapter","error","bugs",{"skillNo":105,"name":106,"nameZh":6,"description":107,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":108,"categories":109,"keywords":113,"publishedAt":48},"01M6N9TZDEV26RZ7W34HEFPQE9","smackerel-no-defaults","Enforce Smackerel's NO-DEFAULTS \u002F fail-loud SST policy. Use when editing config, Docker Compose, deploy adapters, docs, instructions, skills, env handling, host bind addresses, or any runtime value that could be hidden by fallback syntax.","https:\u002F\u002Fgithub.com\u002Fpkirsanov\u002Fsmackerel\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fsmackerel-no-defaults\u002FSKILL.md",[110],{"categoryNo":111,"categoryName":112,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000011","运维与部署",[114,115,116,117,118,119,120,121,122,43,123,124,99,125,126,127,128,129,130,131],"smackerel no defaults","docker","policy","config","deploy","docker compose","syntax","editing","instructions","compose","enforce","bind","env","host","Adapters","sst","addresses","value",{"skillNo":133,"name":134,"nameZh":6,"description":135,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":136,"categories":137,"keywords":141,"publishedAt":48},"01M6N9TJRS5PF83JH2W4614D4W","bubbles-workflow-mode-resolution","Resolve a Bubbles workflow mode against `bubbles\u002Fworkflows.yaml`, including template inheritance, status ceilings, gate wiring, and decision policy. Use when picking a mode for a request, when a guard reports a mode-related failure, or when extending workflows.yaml with a new mode or template. Covers natural-language intent routing and the workflow registry consistency rules.","https:\u002F\u002Fgithub.com\u002Fpkirsanov\u002Fsmackerel\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fbubbles-workflow-mode-resolution\u002FSKILL.md",[138],{"categoryNo":139,"categoryName":140,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000023","Skill与智能体开发",[142,143,144,145,116,146,147,148,149,150,151,43,152,153,154,155,156,157,32,158],"workflow","resolution","mode","bubbles workflow mode resolution","workflows","routing","guard","template","decision","Rules","reports","intent","inheritance","with","consistency","natural-language","wiring",{"skillNo":160,"name":161,"nameZh":6,"description":162,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":163,"categories":164,"keywords":166,"publishedAt":48},"01M6N9TC98D6DJR0D64SSN0SN3","bubbles-workflow-execution-loops","Run per-round synchronous workflow execution loops correctly. Use when orchestrating a multi-round workflow, dispatching specialist subagents, handling round-based remediation, or interpreting a workflow mode's execution policy. Covers authorized direct execution, dispatch-and-wait, batch-then-summarize prohibition, and mapped-mode execution.","https:\u002F\u002Fgithub.com\u002Fpkirsanov\u002Fsmackerel\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fbubbles-workflow-execution-loops\u002FSKILL.md",[165],{"categoryNo":139,"categoryName":140,"taxonomyType":20,"taxonomyTypeDesc":21},[142,167,168,169,170,116,171,172,173,174,175,43,176,177,178,179,144],"execution","loops","bubbles workflow execution loops","summarize","run","batch","remediation","direct","subagents","dispatch","wait","multi","multi-round",{"skillNo":181,"name":182,"nameZh":6,"description":183,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":184,"categories":185,"keywords":190,"publishedAt":48},"01M6N9SYXQNJDQ1T1YT81JH2BG","bubbles-vscode-agent-constraints","Design agents that fit the VS Code Copilot Chat runtime instead of fighting it. Use when authoring or editing any `*.agent.md`; when adding `tools:`, `agents:`, `handoffs:`, `model:`, `user-invocable:`, or `disable-model-invocation:` frontmatter; when designing an orchestrator that dispatches specialists; when a design implies agent-calls-agent-calls-agent chaining; when a subagent dispatch silently no-ops or an agent cannot be selected in the dropdown; or when writing a governance rule about delegation that the runtime cannot actually enforce. Prevents multi-level-subagent designs, prose-only dispatch laws, and frontmatter\u002Fbody contradictions.","https:\u002F\u002Fgithub.com\u002Fpkirsanov\u002Fsmackerel\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fbubbles-vscode-agent-constraints\u002FSKILL.md",[186,189],{"categoryNo":187,"categoryName":188,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000015","视觉设计",{"categoryNo":139,"categoryName":140,"taxonomyType":20,"taxonomyTypeDesc":21},[191,192,193,194,195,196,197,198,199,200,45,201,121,202,95,99,203,204,205,206],"vscode","constraints","bubbles vscode agent constraints","design","writing","copilot","code","delegation","Tools","subagent","chaining","orchestrator","authoring","fit","subagent dispatch","frontmatter",{"skillNo":208,"name":209,"nameZh":6,"description":210,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":211,"categories":212,"keywords":213,"publishedAt":48},"01M6N9SD78SK12PRT9KBRZ6TB3","bubbles-upkeep-cadence","How to schedule, dispatch, and record recurring operational upkeep tasks (backup, restore-drill, BCDR-drill, patch-cycle, secret-rotation, flag-cleanup, compliance-sweep). Use when authoring or modifying `config\u002Fupkeep-calendar.yaml`, when investigating a missed task, when reading the upkeep ledger, or when adding a new task type.","https:\u002F\u002Fgithub.com\u002Fpkirsanov\u002Fsmackerel\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fbubbles-upkeep-cadence\u002FSKILL.md",[],[33,214,215,216,30,217,218,219,43,220,41,221,222,223,224,225,34,226,227,228],"bubbles upkeep cadence","tasks","cleanup","sweep","schedule","recurring","patch","task","cycle","record","missed","type","how to","new task","rotation"]