[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M73GFCGAH7GT614TZPZR833P":3,"skill-same:01M73GFCGAH7GT614TZPZR833P":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},"01M73GFCGAH7GT614TZPZR833P","type-safe-api-contracts",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\u002Ftype-safe-api-contracts\u002FSKILL.md",[],[],"2026-11-11 15:11:14",false,"---\nname: type-safe-api-contracts\ndescription: Type-safe API contract patterns. tRPC end-to-end typed procedures, ts-rest shared contract definitions, zod-to-openapi spec generation, Zodios Axios client, and contract-first development workflow. Sources: trpc\u002Ftrpc, ts-rest\u002Fts-rest, asteasolutions\u002Fzod-to-openapi, zodios\u002Fzodios, ecyrbe\u002Fzodios.\norigin: yana-ai — synthesized from trpc\u002Ftrpc, ts-rest\u002Fts-rest, asteasolutions\u002Fzod-to-openapi, zodios\u002Fzodios, ecyrbe\u002Fzodios\nlicense: Apache-2.0\nversion: 1.0.0\ncompatibility: yana-ai >= 1.3.44\n---\n\n# \u002Ftype-safe-api-contracts\n\n## When to Use\n\n- TypeScript monorepo where frontend + backend share the same contract\n- \"The API changed and the frontend silently broke\" — need compile-time safety\n- Generating OpenAPI spec from Zod schemas (single source of truth)\n- External clients need an OpenAPI doc but you don't want to maintain it manually\n\n## Do NOT use for\n\n- Pure REST API consumed by non-TypeScript clients only (use OpenAPI spec directly)\n- GraphQL systems (use code-first GraphQL instead)\n\n---\n\n## Decision: tRPC vs ts-rest vs Zodios\n\n```\nSame TypeScript monorepo, full type inference end-to-end?\n  YES → tRPC (no schema, types inferred from router definition)\n  NO  →\n    Need REST endpoints compatible with non-TS clients?\n      YES → ts-rest (typed contract, real HTTP verbs, OpenAPI export)\n      Need Axios with typed responses from existing OpenAPI?\n        YES → Zodios (Axios + Zod runtime validation from OpenAPI)\n```\n\n---\n\n## tRPC (end-to-end type inference)\n\n```typescript\n\u002F\u002F server\u002Frouter.ts\nimport { initTRPC, TRPCError } from '@trpc\u002Fserver'\nimport { z } from 'zod'\n\nconst t = initTRPC.context\u003C{ userId: string }>().create()\nexport const router  = t.router\nexport const publicProcedure    = t.procedure\nexport const protectedProcedure = t.procedure.use(async ({ ctx, next }) => {\n  if (!ctx.userId) throw new TRPCError({ code: 'UNAUTHORIZED' })\n  return next({ ctx })\n})\n\nexport const appRouter = router({\n  agent: router({\n    run: protectedProcedure\n      .input(z.object({ task: z.string().min(1), depth: z.number().int().max(5).default(1) }))\n      .output(z.object({ result: z.string(), tokensUsed: z.number() }))\n      .mutation(async ({ input, ctx }) => {\n        const result = await runAgent(input.task, ctx.userId, input.depth)\n        return result\n      }),\n\n    history: protectedProcedure\n      .input(z.object({ limit: z.number().default(20) }))\n      .query(async ({ input, ctx }) => getHistory(ctx.userId, input.limit)),\n  }),\n})\n\nexport type AppRouter = typeof appRouter\n```\n\n```typescript\n\u002F\u002F client\u002Ftrpc.ts — full type inference, no codegen\nimport { createTRPCProxyClient, httpBatchLink } from '@trpc\u002Fclient'\nimport type { AppRouter } from '..\u002Fserver\u002Frouter'\n\nconst trpc = createTRPCProxyClient\u003CAppRouter>({\n  links: [httpBatchLink({ url: '\u002Fapi\u002Ftrpc', headers: () => ({ Authorization: `Bearer ${token}` }) })],\n})\n\n\u002F\u002F Fully typed — IDE autocomplete on every call\nconst { result, tokensUsed } = await trpc.agent.run.mutate({ task: 'summarize repo' })\n\n\u002F\u002F Rule: always define .output() schema — prevents leaking server-internal fields\n\u002F\u002F Rule: use httpBatchLink for SPA (batches multiple calls into one HTTP request)\n\u002F\u002F Rule: TRPCError code maps to HTTP status — UNAUTHORIZED=401, NOT_FOUND=404, etc.\n```\n\n---\n\n## ts-rest (typed REST contracts)\n\n```typescript\n\u002F\u002F contracts\u002Fagent.ts — shared between server and client\nimport { initContract } from '@ts-rest\u002Fcore'\nimport { z } from 'zod'\n\nconst c = initContract()\n\nexport const agentContract = c.router({\n  run: {\n    method:   'POST',\n    path:     '\u002Fagents\u002Frun',\n    body:     z.object({ task: z.string(), sessionId: z.string().uuid() }),\n    responses: {\n      200: z.object({ result: z.string(), elapsedMs: z.number() }),\n      429: z.object({ retryAfter: z.number() }),\n    },\n    summary: 'Run an agent task',\n  },\n  getResult: {\n    method:   'GET',\n    path:     '\u002Fagents\u002F:id\u002Fresult',\n    pathParams: z.object({ id: z.string().uuid() }),\n    responses: {\n      200: z.object({ status: z.enum(['pending', 'done', 'failed']), result: z.string().optional() }),\n      404: z.object({ message: z.string() }),\n    },\n  },\n})\n```\n\n```typescript\n\u002F\u002F server\u002Froutes.ts — Next.js \u002F Express handler\nimport { createNextRouter } from '@ts-rest\u002Fnext'\nimport { agentContract }    from '..\u002Fcontracts\u002Fagent'\n\nexport default createNextRouter(agentContract, {\n  run: async ({ body }) => {\n    const result = await executeAgentTask(body.task, body.sessionId)\n    return { status: 200, body: result }\n  },\n  getResult: async ({ params }) => {\n    const task = await getTask(params.id)\n    if (!task) return { status: 404, body: { message: 'Not found' } }\n    return { status: 200, body: task }\n  },\n})\n```\n\n```typescript\n\u002F\u002F client\u002Fapi.ts — types inferred from same contract\nimport { initQueryClient } from '@ts-rest\u002Freact-query'\nimport { agentContract }   from '..\u002Fcontracts\u002Fagent'\n\nconst client = initQueryClient(agentContract, { baseUrl: '\u002Fapi' })\n\n\u002F\u002F Typed response — status 200 body is always z.infer\u003Ctypeof responses[200]>\nconst { data } = client.getResult.useQuery(['agent', id], { params: { id } })\n```\n\n---\n\n## zod-to-openapi (spec generation)\n\n```typescript\nimport { OpenAPIRegistry, OpenApiGeneratorV3 } from '@asteasolutions\u002Fzod-to-openapi'\nimport { z } from 'zod'\n\nconst registry = new OpenAPIRegistry()\n\n\u002F\u002F Register schemas\nconst AgentRunBody = registry.register('AgentRunBody',\n  z.object({\n    task:      z.string().min(1).openapi({ example: 'summarize the PR' }),\n    sessionId: z.string().uuid(),\n  })\n)\n\nconst AgentRunResult = registry.register('AgentRunResult',\n  z.object({\n    result:    z.string(),\n    elapsedMs: z.number().int(),\n  })\n)\n\n\u002F\u002F Register path\nregistry.registerPath({\n  method:  'post',\n  path:    '\u002Fagents\u002Frun',\n  summary: 'Execute an agent task',\n  request: { body: { content: { 'application\u002Fjson': { schema: AgentRunBody } } } },\n  responses: {\n    200: { description: 'Success', content: { 'application\u002Fjson': { schema: AgentRunResult } } },\n    429: { description: 'Rate limited' },\n  },\n})\n\n\u002F\u002F Generate spec\nconst generator = new OpenApiGeneratorV3(registry.definitions)\nconst spec      = generator.generateDocument({\n  openapi: '3.0.0',\n  info:    { title: 'YAMTAM Agent API', version: '1.3.44' },\n  servers: [{ url: '\u002Fapi' }],\n})\n\n\u002F\u002F Rule: write spec to releases\u002Fopenapi.json in CI — never hand-edit\n\u002F\u002F Rule: Zod schemas ARE the source of truth; spec is a derived artifact\n```\n\n---\n\n## Zodios (Axios + Zod typed client)\n\n```typescript\nimport { makeApi, Zodios } from '@zodios\u002Fcore'\nimport { z } from 'zod'\n\nconst api = makeApi([\n  {\n    method:   'post',\n    path:     '\u002Fagents\u002Frun',\n    alias:    'runAgent',\n    response: z.object({ result: z.string(), elapsedMs: z.number() }),\n    parameters: [{\n      name: 'body',\n      type: 'Body',\n      schema: z.object({ task: z.string(), sessionId: z.string().uuid() }),\n    }],\n    errors: [\n      { status: 429, schema: z.object({ retryAfter: z.number() }) },\n    ],\n  },\n])\n\nconst client = new Zodios('\u002Fapi', api)\n\n\u002F\u002F Fully typed call — response is inferred from schema\nconst { result } = await client.runAgent({ task: 'list PRs', sessionId: crypto.randomUUID() })\n\n\u002F\u002F Rule: Zodios validates response at runtime — throws ZodError on mismatch\n\u002F\u002F Rule: use alias to get named method on client (not positional array indexing)\n```\n\n---\n\n## Anti-Fake-Pass Checklist\n\n```\n❌ tRPC .output() missing (server-internal fields can leak to client)\n❌ ts-rest path params not in pathParams schema (runtime crash on mismatch)\n❌ OpenAPI spec hand-edited instead of generated from Zod (drift guaranteed)\n❌ Zodios client used without error schema (429\u002F500 untyped)\n❌ tRPC httpBatchLink missing — each call = separate HTTP round-trip\n❌ Contract defined in server package, not shared package (client can't import it)\n❌ Zod .openapi() metadata omitted — spec examples missing, docs useless\n```\n","# \u002Ftype-safe-api-contracts\n\n## When to Use\n\n- TypeScript monorepo where frontend + backend share the same contract\n- \"The API changed and the frontend silently broke\" — need compile-time safety\n- Generating OpenAPI spec from Zod schemas (single source of truth)\n- External clients need an OpenAPI doc but you don't want to maintain it manually\n\n## Do NOT use for\n\n- Pure REST API consumed by non-TypeScript clients only (use OpenAPI spec directly)\n- GraphQL systems (use code-first GraphQL instead)\n\n---\n\n## Decision: tRPC vs ts-rest vs Zodios\n\n```\nSame TypeScript monorepo, full type inference end-to-end?\n  YES → tRPC (no schema, types inferred from router definition)\n  NO  →\n    Need REST endpoints compatible with non-TS clients?\n      YES → ts-rest (typed contract, real HTTP verbs, OpenAPI export)\n      Need Axios with typed responses from existing OpenAPI?\n        YES → Zodios (Axios + Zod runtime validation from OpenAPI)\n```\n\n---\n\n## tRPC (end-to-end type inference)\n\n```typescript\n\u002F\u002F server\u002Frouter.ts\nimport { initTRPC, TRPCError } from '@trpc\u002Fserver'\nimport { z } from 'zod'\n\nconst t = initTRPC.context\u003C{ userId: string }>().create()\nexport const router  = t.router\nexport const publicProcedure    = t.procedure\nexport const protectedProcedure = t.procedure.use(async ({ ctx, next }) => {\n  if (!ctx.userId) throw new TRPCError({ code: 'UNAUTHORIZED' })\n  return next({ ctx })\n})\n\nexport const appRouter = router({\n  agent: router({\n    run: protectedProcedure\n      .input(z.object({ task: z.string().min(1), depth: z.number().int().max(5).default(1) }))\n      .output(z.object({ result: z.string(), tokensUsed: z.number() }))\n      .mutation(async ({ input, ctx }) => {\n        const result = await runAgent(input.task, ctx.userId, input.depth)\n        return result\n      }),\n\n    history: protectedProcedure\n      .input(z.object({ limit: z.number().default(20) }))\n      .query(async ({ input, ctx }) => getHistory(ctx.userId, input.limit)),\n  }),\n})\n\nexport type AppRouter = typeof appRouter\n```\n\n```typescript\n\u002F\u002F client\u002Ftrpc.ts — full type inference, no codegen\nimport { createTRPCProxyClient, httpBatchLink } from '@trpc\u002Fclient'\nimport type { AppRouter } from '..\u002Fserver\u002Frouter'\n\nconst trpc = createTRPCProxyClient\u003CAppRouter>({\n  links: [httpBatchLink({ url: '\u002Fapi\u002Ftrpc', headers: () => ({ Authorization: `Bearer ${token}` }) })],\n})\n\n\u002F\u002F Fully typed — IDE autocomplete on every call\nconst { result, tokensUsed } = await trpc.agent.run.mutate({ task: 'summarize repo' })\n\n\u002F\u002F Rule: always define .output() schema — prevents leaking server-internal fields\n\u002F\u002F Rule: use httpBatchLink for SPA (batches multiple calls into one HTTP request)\n\u002F\u002F Rule: TRPCError code maps to HTTP status — UNAUTHORIZED=401, NOT_FOUND=404, etc.\n```\n\n---\n\n## ts-rest (typed REST contracts)\n\n```typescript\n\u002F\u002F contracts\u002Fagent.ts — shared between server and client\nimport { initContract } from '@ts-rest\u002Fcore'\nimport { z } from 'zod'\n\nconst c = initContract()\n\nexport const agentContract = c.router({\n  run: {\n    method:   'POST',\n    path:     '\u002Fagents\u002Frun',\n    body:     z.object({ task: z.string(), sessionId: z.string().uuid() }),\n    responses: {\n      200: z.object({ result: z.string(), elapsedMs: z.number() }),\n      429: z.object({ retryAfter: z.number() }),\n    },\n    summary: 'Run an agent task',\n  },\n  getResult: {\n    method:   'GET',\n    path:     '\u002Fagents\u002F:id\u002Fresult',\n    pathParams: z.object({ id: z.string().uuid() }),\n    responses: {\n      200: z.object({ status: z.enum(['pending', 'done', 'failed']), result: z.string().optional() }),\n      404: z.object({ message: z.string() }),\n    },\n  },\n})\n```\n\n```typescript\n\u002F\u002F server\u002Froutes.ts — Next.js \u002F Express handler\nimport { createNextRouter } from '@ts-rest\u002Fnext'\nimport { agentContract }    from '..\u002Fcontracts\u002Fagent'\n\nexport default createNextRouter(agentContract, {\n  run: async ({ body }) => {\n    const result = await executeAgentTask(body.task, body.sessionId)\n    return { status: 200, body: result }\n  },\n  getResult: async ({ params }) => {\n    const task = await getTask(params.id)\n    if (!task) return { status: 404, body: { message: 'Not found' } }\n    return { status: 200, body: task }\n  },\n})\n```\n\n```typescript\n\u002F\u002F client\u002Fapi.ts — types inferred from same contract\nimport { initQueryClient } from '@ts-rest\u002Freact-query'\nimport { agentContract }   from '..\u002Fcontracts\u002Fagent'\n\nconst client = initQueryClient(agentContract, { baseUrl: '\u002Fapi' })\n\n\u002F\u002F Typed response — status 200 body is always z.infer\u003Ctypeof responses[200]>\nconst { data } = client.getResult.useQuery(['agent', id], { params: { id } })\n```\n\n---\n\n## zod-to-openapi (spec generation)\n\n```typescript\nimport { OpenAPIRegistry, OpenApiGeneratorV3 } from '@asteasolutions\u002Fzod-to-openapi'\nimport { z } from 'zod'\n\nconst registry = new OpenAPIRegistry()\n\n\u002F\u002F Register schemas\nconst AgentRunBody = registry.register('AgentRunBody',\n  z.object({\n    task:      z.string().min(1).openapi({ example: 'summarize the PR' }),\n    sessionId: z.string().uuid(),\n  })\n)\n\nconst AgentRunResult = registry.register('AgentRunResult',\n  z.object({\n    result:    z.string(),\n    elapsedMs: z.number().int(),\n  })\n)\n\n\u002F\u002F Register path\nregistry.registerPath({\n  method:  'post',\n  path:    '\u002Fagents\u002Frun',\n  summary: 'Execute an agent task',\n  request: { body: { content: { 'application\u002Fjson': { schema: AgentRunBody } } } },\n  responses: {\n    200: { description: 'Success', content: { 'application\u002Fjson': { schema: AgentRunResult } } },\n    429: { description: 'Rate limited' },\n  },\n})\n\n\u002F\u002F Generate spec\nconst generator = new OpenApiGeneratorV3(registry.definitions)\nconst spec      = generator.generateDocument({\n  openapi: '3.0.0',\n  info:    { title: 'YAMTAM Agent API', version: '1.3.44' },\n  servers: [{ url: '\u002Fapi' }],\n})\n\n\u002F\u002F Rule: write spec to releases\u002Fopenapi.json in CI — never hand-edit\n\u002F\u002F Rule: Zod schemas ARE the source of truth; spec is a derived artifact\n```\n\n---\n\n## Zodios (Axios + Zod typed client)\n\n```typescript\nimport { makeApi, Zodios } from '@zodios\u002Fcore'\nimport { z } from 'zod'\n\nconst api = makeApi([\n  {\n    method:   'post',\n    path:     '\u002Fagents\u002Frun',\n    alias:    'runAgent',\n    response: z.object({ result: z.string(), elapsedMs: z.number() }),\n    parameters: [{\n      name: 'body',\n      type: 'Body',\n      schema: z.object({ task: z.string(), sessionId: z.string().uuid() }),\n    }],\n    errors: [\n      { status: 429, schema: z.object({ retryAfter: z.number() }) },\n    ],\n  },\n])\n\nconst client = new Zodios('\u002Fapi', api)\n\n\u002F\u002F Fully typed call — response is inferred from schema\nconst { result } = await client.runAgent({ task: 'list PRs', sessionId: crypto.randomUUID() })\n\n\u002F\u002F Rule: Zodios validates response at runtime — throws ZodError on mismatch\n\u002F\u002F Rule: use alias to get named method on client (not positional array indexing)\n```\n\n---\n\n## Anti-Fake-Pass Checklist\n\n```\n❌ tRPC .output() missing (server-internal fields can leak to client)\n❌ ts-rest path params not in pathParams schema (runtime crash on mismatch)\n❌ OpenAPI spec hand-edited instead of generated from Zod (drift guaranteed)\n❌ Zodios client used without error schema (429\u002F500 untyped)\n❌ tRPC httpBatchLink missing — each call = separate HTTP round-trip\n❌ Contract defined in server package, not shared package (client can't import it)\n❌ Zod .openapi() metadata omitted — spec examples missing, docs useless\n```\n",{},"main","481dcd7dd2e288b9d627a2bd017db70e64e6c6fa","core\u002Fskills\u002Ftype-safe-api-contracts",1,"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-11 23:56:26",{"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 type-safe-api-contracts",{"tool":39,"command":40},"bunx","bunx skills add Horonomos-laps\u002FYana-AI --skill type-safe-api-contracts",{"tool":42,"command":43},"pnpm","pnpm dlx skills add Horonomos-laps\u002FYana-AI --skill type-safe-api-contracts","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FHoronomos-laps\u002FYana-AI\u002Fblob\u002Fmain\u002Fcore\u002Fskills\u002Ftype-safe-api-contracts\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",[],[]]