[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6X7XF69HTXYGRNFB5C83GCS":3,"skill-same:01M6X7XF69HTXYGRNFB5C83GCS":81},{"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":23,"publishedAt":43,"linkOnly":44,"markdownContent":45,"markdownBody":46,"frontMatter":47,"refName":58,"commitSha":59,"skillDirectory":60,"forksCount":61,"repositoryHtmlUrl":62,"repositoryHomepageUrl":63,"ownerHtmlUrl":64,"ownerBlogUrl":63,"ownerDescription":65,"updatedAt":66,"install":67,"resources":80},"01M6X7XF69HTXYGRNFB5C83GCS","terraform",null,"Use when writing Terraform — AWS modules, resources, variables, outputs, remote state — even when the user just says 'provision this infra' or 'add an S3 bucket' without naming Terraform.","event4u-app\u002Fagent-config","event4u-app","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F199339632?v=4","01M6X5TWBNCQCE1VDKT4E9KF7N","event4u.app","01M6X5TWF4HRM266RG2Q5VVH1X",19,"MIT","https:\u002F\u002Fgithub.com\u002Fevent4u-app\u002Fagent-config\u002Fblob\u002Fmain\u002Fsrc\u002Fskills\u002Fterraform\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000011","运维与部署","SCENARIO","使用场景",[5,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42],"when","writing","outputs","bucket","naming","Variables","remote","add","resources","module","base","infra","modules","devops","use","just","aws","s3","state","2026-11-10 10:12:30",false,"---\nmodel_tier: medium\nname: terraform\ndescription: \"Use when writing Terraform — AWS modules, resources, variables, outputs, remote state — even when the user just says 'provision this infra' or 'add an S3 bucket' without naming Terraform.\"\ndomain: devops\nworkspaces:\n  - engineering\npacks:\n  - engineering-base\ntriggers:\n  - phrase: \"terraform module\"\n  - phrase: \"terraform state\"\n---\n\n# terraform\n\n## When to use\n\nUse this skill when writing or modifying Terraform configurations (`.tf` files), creating new infrastructure modules, or understanding AWS resource definitions.\n\n## Procedure: Write Terraform config\n\n1. Read the infrastructure repo structure (check `agents\u002Foverrides\u002Fskills\u002Fterraform.md` for the repo location).\n2. Check existing modules in `modules\u002F` for patterns and conventions.\n3. Read `variables.tf` of the target module to understand required inputs.\n4. Check `versions.tf` for provider version constraints.\n\n## Project structure (typical)\n\n```\n{infrastructure-repo}\u002F\n├── environments\u002F\n│   ├── pro\u002F                    # Production environment\n│   │   ├── root.hcl            # Terragrunt root config\n│   │   ├── core\u002F               # Core infrastructure (VPC, DNS zones)\n│   │   └── {service}\u002F          # Per-service resources\n│   └── sta\u002F                    # Stage environment\n│       └── ...\n├── modules\u002F\n│   ├── core\u002F                   # VPC, DNS, shared resources\n│   └── {service}\u002F              # Per-service module (ECS, ALB, ECR, etc.)\n└── Taskfile.yml                # Task runner commands (or Makefile)\n```\n\nRead `agents\u002Foverrides\u002Fskills\u002Fterraform.md` for the actual repository layout and service names.\n\n## Conventions\n\n### Provider versions\n\n- Always pin provider versions in `versions.tf`.\n- Check `versions.tf` in the existing modules for the project's version constraints.\n\n### Module sources\n\nPrefer community or organization-specific Terraform modules from the Terraform Registry:\n\n```hcl\nmodule \"alb\" {\n  source  = \"{org}\u002Fapplication-load-balancer\u002Faws\"\n  version = \">= 1.0.0, \u003C 2.0.0\"\n}\n```\n\nCheck existing modules in the project for which registry modules are used.\n\n### Naming\n\n- Resource prefix: `var.global_prefix` (e.g., `{project}-{env}`)\n- All resources must include `tags = var.tags`\n- Security groups: `${var.global_prefix}-\u003Cpurpose>` (e.g., `-ecs`, `-mysql`, `-redis`)\n- Log groups: `\u002Faws\u002Fecs\u002F${cluster}\u002F${service}`\n\n### State management\n\n- Remote state in **S3** with **DynamoDB** locking.\n- State is encrypted.\n- Key pattern: `${path_relative_to_include()}\u002Fterraform.tfstate`\n\n### Variables\n\n- Use typed `variable` blocks with `description`.\n- Use `object()` types for complex inputs (not `any` unless unavoidable).\n- Use `optional()` with defaults where appropriate.\n- Group variables by domain (naming, network, ECS, Redis, database, etc.).\n\n### Lifecycle rules\n\n- Use `ignore_changes = [task_definition]` on ECS services — task definitions are managed by CI\u002FCD, not Terraform.\n- Use `deletion_protection = true` on databases.\n\n### Security\n\n- OIDC authentication for GitHub Actions (no long-lived credentials).\n- Secrets stored in **AWS Secrets Manager**.\n- Security groups follow least-privilege: only allow traffic between known services.\n- IAM policies use specific resource ARNs, not wildcards (except where unavoidable).\n\n### Permissive defaults and missing security blocks\n\nThe failure that reaches production is almost never a pinned-version mistake;\nit is a resource that works either way and was left on its permissive default.\nFour constructs carry it. Each backstop grep is over the `.tf` tree you are\nchanging, not over this repository.\n\n| Backstop grep | What a hit means | Override condition |\n|---|---|---|\n| `grep -rn '0\\.0\\.0\\.0\u002F0' --include='*.tf' .` | An ingress or egress rule whose CIDR is 0.0.0.0\u002F0, i.e. open to the whole internet. On a management or database port stop and treat it as CRITICAL - the corpus row enumerates which ports those are. | A deliberately public listener - an ALB or CloudFront origin on 80\u002F443. Nothing else. Record the reason next to the rule. |\n| `grep -rn 'publicly_accessible\\|block_public_acls\\|ignore_public_acls' --include='*.tf' .` | Either `publicly_accessible = true` on a database, or a bucket with no public-access block present at all. Absence is the more common hit and the grep returning nothing is the failing case. | A bucket that genuinely serves public web assets, with the policy written explicitly rather than inherited from a default. |\n| `grep -rnE '\"(Action\\|Resource)\" *: *\"\\*\"\\|= *\\[\"\\*\"\\]' --include='*.tf' .` | A wildcard IAM action or resource. One compromised workload credential then reaches everything in the account. | A named, reviewed exception - `iam:PassRole` scoped by condition, or a bootstrap role. Never the default. |\n| `grep -rL 'encrypt' --include='*.tf' .` (lists files with NO encryption mention; `-L` prints names only, so no `-n`) | A storage, volume, snapshot, or database resource with no encryption block. | None for data at rest. A resource holding no data at all. |\n\nRead the surface class before the fix, not after: the mitigation text, the\nabuse case, and the negative test live in the `infrastructure` rows of\n[`threat-modeling`](..\u002Fthreat-modeling\u002FSKILL.md)'s corpus, which is the single\nauthority for them. Ask that skill's grounded-corpus step for the\n`infrastructure` surface class - it carries the invocation - and describe the\nchange you are making, e.g. *terraform security group ingress open to\n0.0.0.0\u002F0*. Do not copy the command here: one skill owns that interface, for\nthe same reason one file owns the control text.\n\nThose rows also carry a `Decided by:` clause stating which check actually\ndecides each one. For all four constructs above that clause reads NO CHECK IN\nTHIS REPOSITORY - no HCL or IAM-policy parser ships here, so these greps and\nyour own IaC policy scanner are the whole enforcement story. Do not write or\nimply otherwise.\n\n## Common patterns\n\n### ECS service with CodeDeploy (Blue\u002FGreen)\n\nUsed for web services with zero-downtime deployments:\n- ALB → Target Group → ECS Service\n- CodeDeploy handles traffic shifting\n- Auto-rollback on CloudWatch alarms (5xx error rate)\n\n### ECS service without CodeDeploy\n\nUsed for workers and schedulers:\n- Direct ECS service update\n- `deployment_controller { type = \"ECS\" }`\n- `lifecycle { ignore_changes = [task_definition] }`\n\n### GitHub OIDC IAM role\n\nEach environment has a GitHub IAM role with:\n- OIDC trust policy (scoped to repo + environment)\n- Policies for ECR push\u002Fpull, ECS deployment, Secrets Manager read, CloudWatch logs\n\n## Output format\n\n1. Terraform configuration files (.tf) with proper module structure\n2. Variables, outputs, and state management config\n\n## Auto-trigger keywords\n\n- Terraform\n- AWS infrastructure\n- modules\n- resources\n- state management\n\n## Known pitfalls\n\n| Symptom | Root cause | Fix |\n|---|---|---|\n| `Error acquiring the state lock` blocks every command | A prior `apply` crashed \u002F was killed and left the lock held (DynamoDB \u002F backend lock) | Confirm no apply is actually running, then `terraform force-unlock \u003Clock-id>` — never delete the lock table |\n| `plan` wants to destroy+recreate a resource after a rename | Renaming a resource block changes its address; Terraform sees the old address gone and a new one added | `terraform state mv \u003Cold.addr> \u003Cnew.addr>` (or a `moved {}` block) so it tracks the same object |\n| `count`\u002F`for_each` errors with \"value depends on resource attributes that cannot be determined until apply\" | The count\u002Ffor_each expression reads an unknown (not-yet-created) value | Key `for_each` off a static\u002Fknown map, or split into a two-stage apply with `-target` |\n| A change applies but the next `plan` shows the same diff again (perpetual diff) | The provider normalizes\u002Fcomputes the attribute differently than written (ordering, defaults, case) | Match the provider's canonical form, or `ignore_changes` on that attribute in `lifecycle` |\n| `plan` shows a resource as tainted\u002Freplaced after a manual console change | Out-of-band drift — someone edited the resource outside Terraform | `terraform apply -refresh-only` to reconcile state, then decide code-vs-cloud; stop the manual edits |\n\n## Gotcha\n\n- `terraform apply` without `-auto-approve` requires interactive confirmation — don't use in CI without the flag.\n- The model forgets to run `terraform plan` before `apply` — always plan first, review changes.\n- State files contain sensitive data — never commit them to Git. Use remote state (S3 + DynamoDB).\n\n## Do NOT\n\n- Do NOT use `*` in IAM resource ARNs unless absolutely necessary.\n- Do NOT remove `deletion_protection` from databases.\n- Do NOT change provider versions without testing in Stage first.\n- Do NOT hardcode AWS account IDs — use `data.aws_caller_identity.current`.\n","# terraform\n\n## When to use\n\nUse this skill when writing or modifying Terraform configurations (`.tf` files), creating new infrastructure modules, or understanding AWS resource definitions.\n\n## Procedure: Write Terraform config\n\n1. Read the infrastructure repo structure (check `agents\u002Foverrides\u002Fskills\u002Fterraform.md` for the repo location).\n2. Check existing modules in `modules\u002F` for patterns and conventions.\n3. Read `variables.tf` of the target module to understand required inputs.\n4. Check `versions.tf` for provider version constraints.\n\n## Project structure (typical)\n\n```\n{infrastructure-repo}\u002F\n├── environments\u002F\n│   ├── pro\u002F                    # Production environment\n│   │   ├── root.hcl            # Terragrunt root config\n│   │   ├── core\u002F               # Core infrastructure (VPC, DNS zones)\n│   │   └── {service}\u002F          # Per-service resources\n│   └── sta\u002F                    # Stage environment\n│       └── ...\n├── modules\u002F\n│   ├── core\u002F                   # VPC, DNS, shared resources\n│   └── {service}\u002F              # Per-service module (ECS, ALB, ECR, etc.)\n└── Taskfile.yml                # Task runner commands (or Makefile)\n```\n\nRead `agents\u002Foverrides\u002Fskills\u002Fterraform.md` for the actual repository layout and service names.\n\n## Conventions\n\n### Provider versions\n\n- Always pin provider versions in `versions.tf`.\n- Check `versions.tf` in the existing modules for the project's version constraints.\n\n### Module sources\n\nPrefer community or organization-specific Terraform modules from the Terraform Registry:\n\n```hcl\nmodule \"alb\" {\n  source  = \"{org}\u002Fapplication-load-balancer\u002Faws\"\n  version = \">= 1.0.0, \u003C 2.0.0\"\n}\n```\n\nCheck existing modules in the project for which registry modules are used.\n\n### Naming\n\n- Resource prefix: `var.global_prefix` (e.g., `{project}-{env}`)\n- All resources must include `tags = var.tags`\n- Security groups: `${var.global_prefix}-\u003Cpurpose>` (e.g., `-ecs`, `-mysql`, `-redis`)\n- Log groups: `\u002Faws\u002Fecs\u002F${cluster}\u002F${service}`\n\n### State management\n\n- Remote state in **S3** with **DynamoDB** locking.\n- State is encrypted.\n- Key pattern: `${path_relative_to_include()}\u002Fterraform.tfstate`\n\n### Variables\n\n- Use typed `variable` blocks with `description`.\n- Use `object()` types for complex inputs (not `any` unless unavoidable).\n- Use `optional()` with defaults where appropriate.\n- Group variables by domain (naming, network, ECS, Redis, database, etc.).\n\n### Lifecycle rules\n\n- Use `ignore_changes = [task_definition]` on ECS services — task definitions are managed by CI\u002FCD, not Terraform.\n- Use `deletion_protection = true` on databases.\n\n### Security\n\n- OIDC authentication for GitHub Actions (no long-lived credentials).\n- Secrets stored in **AWS Secrets Manager**.\n- Security groups follow least-privilege: only allow traffic between known services.\n- IAM policies use specific resource ARNs, not wildcards (except where unavoidable).\n\n### Permissive defaults and missing security blocks\n\nThe failure that reaches production is almost never a pinned-version mistake;\nit is a resource that works either way and was left on its permissive default.\nFour constructs carry it. Each backstop grep is over the `.tf` tree you are\nchanging, not over this repository.\n\n| Backstop grep | What a hit means | Override condition |\n|---|---|---|\n| `grep -rn '0\\.0\\.0\\.0\u002F0' --include='*.tf' .` | An ingress or egress rule whose CIDR is 0.0.0.0\u002F0, i.e. open to the whole internet. On a management or database port stop and treat it as CRITICAL - the corpus row enumerates which ports those are. | A deliberately public listener - an ALB or CloudFront origin on 80\u002F443. Nothing else. Record the reason next to the rule. |\n| `grep -rn 'publicly_accessible\\|block_public_acls\\|ignore_public_acls' --include='*.tf' .` | Either `publicly_accessible = true` on a database, or a bucket with no public-access block present at all. Absence is the more common hit and the grep returning nothing is the failing case. | A bucket that genuinely serves public web assets, with the policy written explicitly rather than inherited from a default. |\n| `grep -rnE '\"(Action\\|Resource)\" *: *\"\\*\"\\|= *\\[\"\\*\"\\]' --include='*.tf' .` | A wildcard IAM action or resource. One compromised workload credential then reaches everything in the account. | A named, reviewed exception - `iam:PassRole` scoped by condition, or a bootstrap role. Never the default. |\n| `grep -rL 'encrypt' --include='*.tf' .` (lists files with NO encryption mention; `-L` prints names only, so no `-n`) | A storage, volume, snapshot, or database resource with no encryption block. | None for data at rest. A resource holding no data at all. |\n\nRead the surface class before the fix, not after: the mitigation text, the\nabuse case, and the negative test live in the `infrastructure` rows of\n[`threat-modeling`](..\u002Fthreat-modeling\u002FSKILL.md)'s corpus, which is the single\nauthority for them. Ask that skill's grounded-corpus step for the\n`infrastructure` surface class - it carries the invocation - and describe the\nchange you are making, e.g. *terraform security group ingress open to\n0.0.0.0\u002F0*. Do not copy the command here: one skill owns that interface, for\nthe same reason one file owns the control text.\n\nThose rows also carry a `Decided by:` clause stating which check actually\ndecides each one. For all four constructs above that clause reads NO CHECK IN\nTHIS REPOSITORY - no HCL or IAM-policy parser ships here, so these greps and\nyour own IaC policy scanner are the whole enforcement story. Do not write or\nimply otherwise.\n\n## Common patterns\n\n### ECS service with CodeDeploy (Blue\u002FGreen)\n\nUsed for web services with zero-downtime deployments:\n- ALB → Target Group → ECS Service\n- CodeDeploy handles traffic shifting\n- Auto-rollback on CloudWatch alarms (5xx error rate)\n\n### ECS service without CodeDeploy\n\nUsed for workers and schedulers:\n- Direct ECS service update\n- `deployment_controller { type = \"ECS\" }`\n- `lifecycle { ignore_changes = [task_definition] }`\n\n### GitHub OIDC IAM role\n\nEach environment has a GitHub IAM role with:\n- OIDC trust policy (scoped to repo + environment)\n- Policies for ECR push\u002Fpull, ECS deployment, Secrets Manager read, CloudWatch logs\n\n## Output format\n\n1. Terraform configuration files (.tf) with proper module structure\n2. Variables, outputs, and state management config\n\n## Auto-trigger keywords\n\n- Terraform\n- AWS infrastructure\n- modules\n- resources\n- state management\n\n## Known pitfalls\n\n| Symptom | Root cause | Fix |\n|---|---|---|\n| `Error acquiring the state lock` blocks every command | A prior `apply` crashed \u002F was killed and left the lock held (DynamoDB \u002F backend lock) | Confirm no apply is actually running, then `terraform force-unlock \u003Clock-id>` — never delete the lock table |\n| `plan` wants to destroy+recreate a resource after a rename | Renaming a resource block changes its address; Terraform sees the old address gone and a new one added | `terraform state mv \u003Cold.addr> \u003Cnew.addr>` (or a `moved {}` block) so it tracks the same object |\n| `count`\u002F`for_each` errors with \"value depends on resource attributes that cannot be determined until apply\" | The count\u002Ffor_each expression reads an unknown (not-yet-created) value | Key `for_each` off a static\u002Fknown map, or split into a two-stage apply with `-target` |\n| A change applies but the next `plan` shows the same diff again (perpetual diff) | The provider normalizes\u002Fcomputes the attribute differently than written (ordering, defaults, case) | Match the provider's canonical form, or `ignore_changes` on that attribute in `lifecycle` |\n| `plan` shows a resource as tainted\u002Freplaced after a manual console change | Out-of-band drift — someone edited the resource outside Terraform | `terraform apply -refresh-only` to reconcile state, then decide code-vs-cloud; stop the manual edits |\n\n## Gotcha\n\n- `terraform apply` without `-auto-approve` requires interactive confirmation — don't use in CI without the flag.\n- The model forgets to run `terraform plan` before `apply` — always plan first, review changes.\n- State files contain sensitive data — never commit them to Git. Use remote state (S3 + DynamoDB).\n\n## Do NOT\n\n- Do NOT use `*` in IAM resource ARNs unless absolutely necessary.\n- Do NOT remove `deletion_protection` from databases.\n- Do NOT change provider versions without testing in Stage first.\n- Do NOT hardcode AWS account IDs — use `data.aws_caller_identity.current`.\n",{"name":5,"packs":48,"domain":37,"triggers":50,"model_tier":55,"workspaces":56,"description":7},[49],"engineering-base",[51,53],{"phrase":52},"terraform module",{"phrase":54},"terraform state","medium",[57],"engineering","main","12bd765ce1d800501d45dfb8232102793af01290","src\u002Fskills\u002Fterraform",1,"https:\u002F\u002Fgithub.com\u002Fevent4u-app\u002Fagent-config","https:\u002F\u002Fevent4u.app","https:\u002F\u002Fgithub.com\u002Fevent4u-app","Your events in your hand","2026-11-11 06:19:40",{"source":8,"skillName":5,"commands":68,"prompt":78,"zipAvailable":79},[69,72,75],{"tool":70,"command":71},"npx","npx skills add event4u-app\u002Fagent-config --skill terraform",{"tool":73,"command":74},"bunx","bunx skills add event4u-app\u002Fagent-config --skill terraform",{"tool":76,"command":77},"pnpm","pnpm dlx skills add event4u-app\u002Fagent-config --skill terraform","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fevent4u-app\u002Fagent-config\u002Fblob\u002Fmain\u002Fsrc\u002Fskills\u002Fterraform\u002FSKILL.md",true,[],[82,98,111,123,135,145],{"skillNo":83,"name":84,"nameZh":6,"description":85,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":86,"categories":87,"keywords":91,"publishedAt":43},"01M6X84PK96XBPENXH66JCTSD1","unknown-key-fixture","Declares a key the schema does not know.","https:\u002F\u002Fgithub.com\u002Fevent4u-app\u002Fagent-config\u002Fblob\u002Fmain\u002Ftests\u002Fscripts\u002Ffixtures\u002Fbody-portable\u002Funknown-key\u002FSKILL.md",[88],{"categoryNo":89,"categoryName":90,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[92,93,94,95,96,97],"unknown key fixture","Unknown key","fixture","unknown","schema","package",{"skillNo":99,"name":100,"nameZh":6,"description":101,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":102,"categories":103,"keywords":105,"publishedAt":43},"01M6X84HW7NAHZ7GZMQ9RXK1XJ","portable-fixture","Declares only semantics the MCP-lite carrier transports whole.","https:\u002F\u002Fgithub.com\u002Fevent4u-app\u002Fagent-config\u002Fblob\u002Fmain\u002Ftests\u002Fscripts\u002Ffixtures\u002Fbody-portable\u002Fportable\u002FSKILL.md",[104],{"categoryNo":89,"categoryName":90,"taxonomyType":21,"taxonomyTypeDesc":22},[94,106,107,108,109,97,110],"portable","portable fixture","engineer","only","MCP",{"skillNo":112,"name":113,"nameZh":6,"description":114,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":115,"categories":116,"keywords":118,"publishedAt":43},"01M6X84F29FE0RGGZ1ZTFGZTX2","non-portable-fixture","Declares a runtime semantic the carrier drops.","https:\u002F\u002Fgithub.com\u002Fevent4u-app\u002Fagent-config\u002Fblob\u002Fmain\u002Ftests\u002Fscripts\u002Ffixtures\u002Fbody-portable\u002Fnon-portable\u002FSKILL.md",[117],{"categoryNo":89,"categoryName":90,"taxonomyType":21,"taxonomyTypeDesc":22},[107,119,106,94,120,121,122,97],"non portable fixture","semantic","high","runtime",{"skillNo":124,"name":125,"nameZh":6,"description":126,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":127,"categories":128,"keywords":130,"publishedAt":43},"01M6X848F706PT9MDCX75JKJ6B","candidate-zero-width","A candidate whose prose carries an invisible joiner.","https:\u002F\u002Fgithub.com\u002Fevent4u-app\u002Fagent-config\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fskill-scout-candidates\u002Fzero-width-injection\u002FSKILL.md",[129],{"categoryNo":89,"categoryName":90,"taxonomyType":21,"taxonomyTypeDesc":22},[131,132,133,134],"candidate zero width","candidate","ZeRO","prose",{"skillNo":136,"name":137,"nameZh":6,"description":138,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":139,"categories":140,"keywords":142,"publishedAt":43},"01M6X841SSC2T31VDF41SA6DG1","candidate-disclosure-suppression","A candidate whose prose tells the agent to withhold from the user.","https:\u002F\u002Fgithub.com\u002Fevent4u-app\u002Fagent-config\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fskill-scout-candidates\u002Fdisclosure-suppression\u002FSKILL.md",[141],{"categoryNo":89,"categoryName":90,"taxonomyType":21,"taxonomyTypeDesc":22},[143,132,134,144],"candidate disclosure suppression","user",{"skillNo":146,"name":147,"nameZh":6,"description":148,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":149,"categories":150,"keywords":152,"publishedAt":43},"01M6X83TFS5AGPBPVTQNWP0BB3","candidate-dangerous-frontmatter","A candidate claiming an unscoped tool grant and a permission bypass.","https:\u002F\u002Fgithub.com\u002Fevent4u-app\u002Fagent-config\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fskill-scout-candidates\u002Fdangerous-frontmatter\u002FSKILL.md",[151],{"categoryNo":89,"categoryName":90,"taxonomyType":21,"taxonomyTypeDesc":22},[153,132,154,155,156,157],"candidate dangerous frontmatter","frontmatter","shell","permission","tool"]