Winch Labs

Reference

Built-in rules

Generated from the source tree by cmd/docsgen. Do not edit: your change would be overwritten on the next run, and the point of this page is that it cannot disagree with the binary.

These ship in the binary and need no adoption. They are generated from the rule registry rather than scraped from the source, which matters more than it sounds: the source also contains unit-test fixtures and convention ids that share the same namespace, and a scraped list would publish them as product features.

budget.*

RuleWhat it checks
budget.thresholdEstimated monthly cost exceeds the configured threshold.

cfn.*

RuleWhat it checks
cfn.cross_stack_wiringAn Fn::ImportValue names an export no template in the repo produces.
cfn.export_namingA stack export does not follow the repo's derived export-naming convention.

convention.*

RuleWhat it checks
convention.unpinned_module_sourceA remote module source is not pinned to a version or ref.

crossplane.*

RuleWhat it checks
crossplane.claim_group_mismatchA claim's API group does not match its XRD.
crossplane.claim_kind_mismatchA claim's kind does not match its XRD.
crossplane.composite_mismatchA Composition's compositeTypeRef does not match its XRD.
crossplane.envconfig_missingA Composition references an EnvironmentConfig that does not exist.
crossplane.invalid_yamlA manifest could not be parsed.
crossplane.missing_labelA claim omits a label this repo applies everywhere else.
crossplane.mr_labels_missingA composed managed resource carries none of the repo's standard labels.
crossplane.mr_prod_deletionA production managed resource has a deletion policy that deletes.
crossplane.namespace_not_allowedA claim targets a namespace this repo does not use.
crossplane.namingA claim name does not follow the repo's derived naming convention.
crossplane.plaintext_secretA literal secret value in a manifest.
crossplane.prod_deletion_deleteA production claim sets deletionPolicy: Delete.
crossplane.rds_unencryptedA composed database declares no encryption.
crossplane.s3_no_versioningA composed bucket has versioning off.
crossplane.s3_public_accessA composed bucket permits public access.
crossplane.s3_unencryptedA composed bucket declares no encryption.
crossplane.schema_missing_requiredA manifest omits a field the provider CRD requires.
crossplane.schema_unknown_fieldA manifest sets a field the provider CRD does not define.
crossplane.storage_boundsA claim's storage size falls outside the range this repo uses.
crossplane.unknown_provider_resourceA managed resource kind no pinned provider schema defines.

destructive.*

RuleWhat it checks
destructive.count_shiftA count change renumbers instances, recreating resources.
destructive.no_prevent_destroyA stateful resource has no prevent_destroy lifecycle guard.
destructive.recreateA change forces replacement of an existing resource.
destructive.removedA resource is removed from configuration.
destructive.rename_without_movedA rename with no moved block destroys and recreates.

plan.*

RuleWhat it checks
plan.blast_radiusThe plan changes more resources than this repo's changes usually do.
plan.stateful_destroyThe plan destroys a stateful resource.
plan.stateful_replaceThe plan replaces a stateful resource.

reliability.*

RuleWhat it checks
reliability.cache_no_failoverA cache cluster has no failover configured.
reliability.rds_no_backupsA database retains no automated backups.
reliability.rds_single_azA production database is single-AZ.

renderdiff.*

RuleWhat it checks
renderdiff.immutable_field_changedA field the provider treats as immutable changed between two renders, forcing replacement.

secops.*

RuleWhat it checks
secops.alb_http_onlyA load balancer listener serves plain HTTP.
secops.count_on_statefulcount on a stateful resource, where a shift renumbers and recreates.
secops.ebs_unencryptedAn EBS volume declares no encryption.
secops.hardcoded_secretA literal credential in configuration rather than a reference.
secops.missing_required_versionNo required_version constraint, so any Terraform version may apply this.
secops.open_egress_data_tierA data-tier security group allows unrestricted egress.
secops.provider_creds_inlineProvider credentials inline in the provider block.
secops.public_ingressAn ingress rule admits 0.0.0.0/0.
secops.rds_no_deletion_protectionA database has deletion protection off.
secops.rds_publicA database is publicly accessible.
secops.rds_unencryptedA database declares no storage encryption.
secops.root_credentialsUse of root or account-wide credentials.
secops.s3_public_aclA bucket ACL grants public access.
secops.s3_unencryptedA bucket declares no server-side encryption.
secops.wildcard_iamAn IAM policy grants Action or Resource "*".

51 built-in rules across 9 families.