[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M73GQ5WR7QEW4WPQ2ZDB6TP9":3,"skill-same:01M73GQ5WR7QEW4WPQ2ZDB6TP9":47},{"skillNo":4,"name":5,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":18,"linkOnly":19,"markdownContent":20,"markdownBody":21,"frontMatter":22,"refName":23,"commitSha":24,"skillDirectory":25,"forksCount":26,"repositoryHtmlUrl":27,"repositoryHomepageUrl":28,"ownerHtmlUrl":29,"ownerBlogUrl":30,"ownerDescription":31,"updatedAt":32,"install":33,"resources":46},"01M73GQ5WR7QEW4WPQ2ZDB6TP9","yaml-safe-parsing",null,"Horonomos-laps\u002FYana-AI","Horonomos-laps","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F355299122?v=4","01M76B3QPXE88ET2SQPDPVATZT"," Horonomos-laps","01M72ZQRJPCYPSSWT4D00VJR2A",13,"Apache-2.0","https:\u002F\u002Fgithub.com\u002FHoronomos-laps\u002FYana-AI\u002Fblob\u002Fmain\u002Fcore\u002Fskills\u002Fyaml-safe-parsing\u002FSKILL.md",[],[],"2026-11-11 15:11:14",false,"---\nname: yaml-safe-parsing\ndescription: Safe YAML parsing resistant to YAML bombs and prototype pollution. eemeli\u002Fyaml safe schema, document size limits, no-execute mode, type-safe output, and config file validation patterns. Sources: eemeli\u002Fyaml.\norigin: yana-ai — synthesized from eemeli\u002Fyaml (ISC License)\nlicense: Apache-2.0\nversion: 1.0.0\ncompatibility: yana-ai >= 1.3.48\n---\n\n# \u002Fyaml-safe-parsing\n\n## When to Use\n\n- Parsing any YAML config file in agent pipelines (hooks, rules, skills)\n- Preventing YAML bomb DoS (billion laughs) from untrusted config inputs\n- Loading structured config with type validation before use\n- Replacing `js-yaml.safeLoad` (deprecated) with modern safe parser\n\n## Do NOT use for\n\n- YAML serialization of arbitrary objects with class instances\n- Streaming multi-document YAML files > 10MB\n\n---\n\n## Safe parse with size limit\n\n```javascript\nimport { parse, parseDocument } from 'yaml'\nimport { readFileSync }         from 'fs'\n\nconst MAX_CONFIG_SIZE = 512 * 1024  \u002F\u002F 512KB hard limit\n\nfunction loadConfig(filePath: string): unknown {\n  const raw = readFileSync(filePath, 'utf8')\n\n  if (raw.length > MAX_CONFIG_SIZE) {\n    throw new Error(`[yaml] config file too large: ${raw.length} bytes (max ${MAX_CONFIG_SIZE})`)\n  }\n\n  \u002F\u002F parse() with failOnWarning — reject ambiguous YAML\n  return parse(raw, {\n    schema:         'core',          \u002F\u002F strict: no !!js\u002Fundefined etc.\n    maxAliasCount:  10,              \u002F\u002F YAML bomb: limit alias expansion\n    strict:         false,           \u002F\u002F don't throw on duplicate keys (log instead)\n    logLevel:       'warn',\n    prettyErrors:   true,\n  })\n}\n```\n\n---\n\n## YAML bomb prevention\n\n```javascript\n\u002F\u002F Test: anchor-alias explosion (billion laughs pattern)\n\u002F\u002F a: &a [...]\n\u002F\u002F b: [*a, *a, *a, *a, *a, *a, *a, *a, *a, *a]\n\u002F\u002F c: [*b, *b, *b, ...]\n\n\u002F\u002F eemeli\u002Fyaml default maxAliasCount = 100\n\u002F\u002F Set to 10 for paranoid mode:\nparse(input, { maxAliasCount: 10 })\n\u002F\u002F Throws: Excessive alias count\n\n\u002F\u002F Also set an overall timeout for paranoid inputs:\nasync function safeParseWithTimeout(input: string, ms = 500): Promise\u003Cunknown> {\n  return Promise.race([\n    Promise.resolve(parse(input, { maxAliasCount: 10 })),\n    new Promise((_, reject) =>\n      setTimeout(() => reject(new Error('[yaml] parse timeout')), ms)\n    ),\n  ])\n}\n```\n\n---\n\n## Type-safe config loader\n\n```typescript\nimport { parse } from 'yaml'\nimport { z }     from 'zod'\n\nconst AgentConfigSchema = z.object({\n  version:  z.string(),\n  rules:    z.array(z.string()),\n  timeout:  z.number().int().positive().max(300),\n  sandbox:  z.object({\n    enabled: z.boolean(),\n    memory:  z.string().regex(\u002F^\\d+[mg]$\u002Fi),\n  }).optional(),\n})\n\ntype AgentConfig = z.infer\u003Ctypeof AgentConfigSchema>\n\nfunction loadAgentConfig(path: string): AgentConfig {\n  const raw    = readFileSync(path, 'utf8')\n  const parsed = parse(raw, { maxAliasCount: 10 })\n  return AgentConfigSchema.parse(parsed)  \u002F\u002F throws ZodError if invalid\n}\n```\n\n---\n\n## Detect prototype pollution in YAML output\n\n```javascript\n\u002F\u002F Dangerous keys to reject\nconst PROTO_KEYS = new Set(['__proto__', 'constructor', 'prototype'])\n\nfunction assertNoProtoKeys(obj: unknown, path = ''): void {\n  if (typeof obj !== 'object' || obj === null) return\n  for (const key of Object.keys(obj as object)) {\n    if (PROTO_KEYS.has(key)) {\n      throw new Error(`[yaml] prototype pollution key at ${path}.${key}`)\n    }\n    assertNoProtoKeys((obj as Record\u003Cstring, unknown>)[key], `${path}.${key}`)\n  }\n}\n```\n\n---\n\n## Anti-Fake-Pass Checklist\n\n```\n❌ js-yaml.load() (not safeLoad) → executes !!js\u002Ffunction tags — RCE\n❌ No maxAliasCount → YAML bomb exponential alias expansion → OOM\n❌ No file size limit → 100MB YAML config accepted, parser hangs\n❌ schema:'json' too permissive — use 'core' for strict type safety\n❌ No Zod\u002Fschema validation after parse → type: any propagates to business logic\n❌ __proto__ key in YAML → prototype pollution if result spread into objects\n```\n","# \u002Fyaml-safe-parsing\n\n## When to Use\n\n- Parsing any YAML config file in agent pipelines (hooks, rules, skills)\n- Preventing YAML bomb DoS (billion laughs) from untrusted config inputs\n- Loading structured config with type validation before use\n- Replacing `js-yaml.safeLoad` (deprecated) with modern safe parser\n\n## Do NOT use for\n\n- YAML serialization of arbitrary objects with class instances\n- Streaming multi-document YAML files > 10MB\n\n---\n\n## Safe parse with size limit\n\n```javascript\nimport { parse, parseDocument } from 'yaml'\nimport { readFileSync }         from 'fs'\n\nconst MAX_CONFIG_SIZE = 512 * 1024  \u002F\u002F 512KB hard limit\n\nfunction loadConfig(filePath: string): unknown {\n  const raw = readFileSync(filePath, 'utf8')\n\n  if (raw.length > MAX_CONFIG_SIZE) {\n    throw new Error(`[yaml] config file too large: ${raw.length} bytes (max ${MAX_CONFIG_SIZE})`)\n  }\n\n  \u002F\u002F parse() with failOnWarning — reject ambiguous YAML\n  return parse(raw, {\n    schema:         'core',          \u002F\u002F strict: no !!js\u002Fundefined etc.\n    maxAliasCount:  10,              \u002F\u002F YAML bomb: limit alias expansion\n    strict:         false,           \u002F\u002F don't throw on duplicate keys (log instead)\n    logLevel:       'warn',\n    prettyErrors:   true,\n  })\n}\n```\n\n---\n\n## YAML bomb prevention\n\n```javascript\n\u002F\u002F Test: anchor-alias explosion (billion laughs pattern)\n\u002F\u002F a: &a [...]\n\u002F\u002F b: [*a, *a, *a, *a, *a, *a, *a, *a, *a, *a]\n\u002F\u002F c: [*b, *b, *b, ...]\n\n\u002F\u002F eemeli\u002Fyaml default maxAliasCount = 100\n\u002F\u002F Set to 10 for paranoid mode:\nparse(input, { maxAliasCount: 10 })\n\u002F\u002F Throws: Excessive alias count\n\n\u002F\u002F Also set an overall timeout for paranoid inputs:\nasync function safeParseWithTimeout(input: string, ms = 500): Promise\u003Cunknown> {\n  return Promise.race([\n    Promise.resolve(parse(input, { maxAliasCount: 10 })),\n    new Promise((_, reject) =>\n      setTimeout(() => reject(new Error('[yaml] parse timeout')), ms)\n    ),\n  ])\n}\n```\n\n---\n\n## Type-safe config loader\n\n```typescript\nimport { parse } from 'yaml'\nimport { z }     from 'zod'\n\nconst AgentConfigSchema = z.object({\n  version:  z.string(),\n  rules:    z.array(z.string()),\n  timeout:  z.number().int().positive().max(300),\n  sandbox:  z.object({\n    enabled: z.boolean(),\n    memory:  z.string().regex(\u002F^\\d+[mg]$\u002Fi),\n  }).optional(),\n})\n\ntype AgentConfig = z.infer\u003Ctypeof AgentConfigSchema>\n\nfunction loadAgentConfig(path: string): AgentConfig {\n  const raw    = readFileSync(path, 'utf8')\n  const parsed = parse(raw, { maxAliasCount: 10 })\n  return AgentConfigSchema.parse(parsed)  \u002F\u002F throws ZodError if invalid\n}\n```\n\n---\n\n## Detect prototype pollution in YAML output\n\n```javascript\n\u002F\u002F Dangerous keys to reject\nconst PROTO_KEYS = new Set(['__proto__', 'constructor', 'prototype'])\n\nfunction assertNoProtoKeys(obj: unknown, path = ''): void {\n  if (typeof obj !== 'object' || obj === null) return\n  for (const key of Object.keys(obj as object)) {\n    if (PROTO_KEYS.has(key)) {\n      throw new Error(`[yaml] prototype pollution key at ${path}.${key}`)\n    }\n    assertNoProtoKeys((obj as Record\u003Cstring, unknown>)[key], `${path}.${key}`)\n  }\n}\n```\n\n---\n\n## Anti-Fake-Pass Checklist\n\n```\n❌ js-yaml.load() (not safeLoad) → executes !!js\u002Ffunction tags — RCE\n❌ No maxAliasCount → YAML bomb exponential alias expansion → OOM\n❌ No file size limit → 100MB YAML config accepted, parser hangs\n❌ schema:'json' too permissive — use 'core' for strict type safety\n❌ No Zod\u002Fschema validation after parse → type: any propagates to business logic\n❌ __proto__ key in YAML → prototype pollution if result spread into objects\n```\n",{},"main","481dcd7dd2e288b9d627a2bd017db70e64e6c6fa","core\u002Fskills\u002Fyaml-safe-parsing",2,"https:\u002F\u002Fgithub.com\u002FHoronomos-laps\u002FYana-AI","https:\u002F\u002Fyana.vutam.link\u002F","https:\u002F\u002Fgithub.com\u002FHoronomos-laps","https:\u002F\u002Fyana.vutam.link","An open-source governed runtime & execution environment for multi-agent AI systems.","2026-11-14 13:24:09",{"source":7,"skillName":5,"commands":34,"prompt":44,"zipAvailable":45},[35,38,41],{"tool":36,"command":37},"npx","npx skills add Horonomos-laps\u002FYana-AI --skill yaml-safe-parsing",{"tool":39,"command":40},"bunx","bunx skills add Horonomos-laps\u002FYana-AI --skill yaml-safe-parsing",{"tool":42,"command":43},"pnpm","pnpm dlx skills add Horonomos-laps\u002FYana-AI --skill yaml-safe-parsing","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FHoronomos-laps\u002FYana-AI\u002Fblob\u002Fmain\u002Fcore\u002Fskills\u002Fyaml-safe-parsing\u002FSKILL.md",true,[],[48,56,63,71,79,87],{"skillNo":49,"name":50,"nameZh":6,"description":51,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":52,"licenseFileUrl":6,"sourceHtmlUrl":53,"categories":54,"keywords":55,"publishedAt":18},"01M735GKET5YVYKAY62W2P5YXB","openai--sentry--sentry","Use when the user asks to inspect Sentry issues or events, summarize recent production errors, or pull basic Sentry health data via the Sentry API; perform read-only queries with the bundled script and require `SENTRY_AUTH_TOKEN`.","MIT","https:\u002F\u002Fgithub.com\u002FHoronomos-laps\u002FYana-AI\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fopenai--sentry--sentry\u002FSKILL.md",[],[],{"skillNo":57,"name":58,"nameZh":6,"description":59,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":60,"categories":61,"keywords":62,"publishedAt":18},"01M73DCAP83T17HY7SMGK7MGFE","ito-basket-compare","Compare Itô prediction-market baskets against a user's knowledge base, portfolio notes, financial context, watchlist, or research thesis. Use for read-only basket comparison and gap analysis without investment advice or live trading.","https:\u002F\u002Fgithub.com\u002FHoronomos-laps\u002FYana-AI\u002Fblob\u002Fmain\u002Fcore\u002Fskills\u002Fito-basket-compare\u002FSKILL.md",[],[],{"skillNo":64,"name":65,"nameZh":6,"description":66,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":67,"sourceHtmlUrl":68,"categories":69,"keywords":70,"publishedAt":18},"01M734CYEMZFDR3KH6SW0JP8TD","implementing-network-traffic-baselining","Build network traffic baselines from NetFlow\u002FIPFIX data using Python pandas for statistical analysis, z-score anomaly detection, and hourly\u002Fdaily traffic pattern profiling","https:\u002F\u002Fgithub.com\u002Fyanacuti1121\u002FYana-AI\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fimplementing-network-traffic-baselining\u002FLICENSE","https:\u002F\u002Fgithub.com\u002FHoronomos-laps\u002FYana-AI\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fimplementing-network-traffic-baselining\u002FSKILL.md",[],[],{"skillNo":72,"name":73,"nameZh":6,"description":74,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":75,"sourceHtmlUrl":76,"categories":77,"keywords":78,"publishedAt":18},"01M73ASZ6NJRJM44Z2P84NGQ3Q","detecting-evasion-techniques-in-endpoint-logs","Detects defense evasion techniques used by adversaries in endpoint logs including log tampering, timestomping, process injection, and security tool disabling. Use when investigating suspicious endpoint behavior, building detection rules for evasion tactics, or conducting threat hunting for stealthy adversary activity. Activates for requests involving evasion detection, defense evasion analysis, log tampering detection, or MITRE ATT&CK TA0005.","https:\u002F\u002Fgithub.com\u002Fyanacuti1121\u002FYana-AI\u002Fblob\u002Fmain\u002Fcore\u002Fskills\u002Fdetecting-evasion-techniques-in-endpoint-logs\u002FLICENSE","https:\u002F\u002Fgithub.com\u002FHoronomos-laps\u002FYana-AI\u002Fblob\u002Fmain\u002Fcore\u002Fskills\u002Fdetecting-evasion-techniques-in-endpoint-logs\u002FSKILL.md",[],[],{"skillNo":80,"name":81,"nameZh":6,"description":82,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":83,"sourceHtmlUrl":84,"categories":85,"keywords":86,"publishedAt":18},"01M734AFNXD06Z78QRK0VKGT7Q","implementing-microsegmentation-with-guardicore","Implementing microsegmentation using Akamai Guardicore Segmentation to map application dependencies, create granular network policies, visualize east-west traffic flows, and enforce least-privilege communication between workloads across data centers and cloud.","https:\u002F\u002Fgithub.com\u002Fyanacuti1121\u002FYana-AI\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fimplementing-microsegmentation-with-guardicore\u002FLICENSE","https:\u002F\u002Fgithub.com\u002FHoronomos-laps\u002FYana-AI\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fimplementing-microsegmentation-with-guardicore\u002FSKILL.md",[],[],{"skillNo":88,"name":89,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":90,"categories":91,"keywords":92,"publishedAt":18},"01M736TK27QMCXK0DVCH25SJN5","ramdisk-tmpfs-patterns","https:\u002F\u002Fgithub.com\u002FHoronomos-laps\u002FYana-AI\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Framdisk-tmpfs-patterns\u002FSKILL.md",[],[]]