Skip to content

marke destructive fields as immutable#19

Merged
flybayer merged 5 commits into
mainfrom
bb-immutable
Jun 12, 2026
Merged

marke destructive fields as immutable#19
flybayer merged 5 commits into
mainfrom
bb-immutable

Conversation

@flybayer

@flybayer flybayer commented Jun 11, 2026

Copy link
Copy Markdown
Member

Greptile Summary

This PR adds immutable: true to foundational identity, target, and state inputs across all module definitions, and documents the immutability policy in the agent skill guide.

  • Shared partials updated: aws_account_id, aws_region, ravion_state_backend_workspace, and the network-ref template fields (vpc_id, subnet IDs) are now immutable; advanced_terraform_variables and execution_environment_id are correctly left mutable per the new SKILL.md rule.
  • Module-specific fields locked: VPC name/vpc_cidr, ACM certificate domain fields and validation settings, IAM role name/path/instance-profile fields, static site bucket name, ECS cluster network ref and name, and ECS service cluster ref + all mapped fallback fields (ARNs, subnet IDs, capacity provider names, ALB SG IDs), service name, and container_port are all marked immutable.
  • SKILL.md updated with a comprehensive Input Immutability section that documents which fields always require immutable: true, which must never be marked immutable, and module-specific lists for reference.

Confidence Score: 5/5

All changes are additive YAML metadata annotations with no logic changes; immutability selections are consistent with the documented policy across all eleven files.

Every field marked immutable matches the SKILL.md taxonomy, the two mandatory exclusions (execution_environment_id and advanced_terraform_variables) are correctly left mutable in every location they appear, and the shared partials propagate the constraint to all downstream modules automatically.

No files require special attention.

Important Files Changed

Filename Overview
.agents/skills/module-definition-config/SKILL.md Adds comprehensive Input Immutability section documenting which fields must/must not be marked immutable, and adds a checklist item to the review rubric.
partials/inputs/aws-account.yml Marks aws_account_id immutable; correctly aligns with the SKILL.md rule requiring account identity to be immutable across all modules.
partials/inputs/aws-region.yml Marks aws_region immutable; shared partial propagates this constraint to all modules that include it.
partials/inputs/terraform-settings.yml Marks ravion_state_backend_workspace immutable; advanced_terraform_variables is correctly left mutable per the SKILL.md rule.
partials/templates/network-ref-mapped-inputs.yml Marks aws_account_id, aws_region, vpc_id, private_subnet_ids, and public_subnet_ids immutable; execution_environment_id correctly left mutable per the SKILL.md exclusion rule.
networking/vpc/rvn-aws-network-definition.yml Marks name and vpc_cidr immutable, matching the SKILL.md spec for network/VPC modules.
security/acm_certificate/rvn-acm-certificate-definition.yml Marks domain_name, subject_alternative_names, route53_validation_records_creation_enabled, and route53_zone_id immutable; the tagging-only name field is correctly left mutable.
security/iam/rvn-aws-iam-role-definition.yml Marks role name, path, instance_profile_creation_enabled, instance_profile_name, and instance_profile_path immutable, matching the SKILL.md spec for IAM role modules.
hosting/static_site/rvn-aws-static-definition.yml Marks the bucket/resource name immutable; matches the SKILL.md spec for static hosting modules.
compute/ecs_cluster/rvn-ecs-cluster-definition.yml Marks the network ref and cluster name immutable; operational controls (Fargate toggle, EC2 capacity, LB deletion protection) remain mutable as expected.
compute/ecs_service/rvn-ecs-web-definition.yml Marks cluster ref + all mapped fallback fields (ARNs, VPC IDs, subnet IDs, capacity provider names, ALB listener ARNs and SG IDs), service name, and container_port immutable; execution_environment_id is correctly excluded.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A[Module Input] --> B{Is it a foundational\nidentity/state field?}
    B -- Yes --> C[Mark immutable: true]
    B -- No --> D{Is it execution_environment_id\nor advanced_terraform_variables?}
    D -- Yes --> E[Leave mutable — explicit exclusion]
    D -- No --> F{Is it an operational/\nproduct-level control?}
    F -- Yes --> G[Leave mutable]
    F -- No --> H{Is it a ref-derived\ninfrastructure identity field?}
    H -- Yes --> C
    H -- No --> G

    subgraph "Always Immutable"
        I[aws_account_id]
        J[aws_region]
        K[ravion_state_backend_workspace]
        L[vpc_id / subnet IDs / ARNs]
        M[cluster/service/bucket name]
        N[vpc_cidr]
    end

    subgraph "Always Mutable"
        O[execution_environment_id]
        P[advanced_terraform_variables]
        Q[NAT / peering / flow logs / CloudFront settings]
        R[health checks / autoscaling / tags / IAM policies]
    end

    C --> I & J & K & L & M & N
    E --> O & P
    G --> Q & R
Loading

Reviews (2): Last reviewed commit: "remove a bunch" | Re-trigger Greptile

@github-actions

github-actions Bot commented Jun 11, 2026

Copy link
Copy Markdown

Ravion Module Publish Plan

Dry run only. No Ravion API mutations were made.

Module Current Version New Version Description
rvn-acm-certificate 0.2.0 0.2.1 Mark destructive certificate inputs immutable
rvn-aws-iam-role 0.1.1 0.1.2 Mark destructive IAM role inputs immutable
rvn-aws-network 0.1.0 0.1.1 Mark destructive network inputs immutable
rvn-aws-static 0.1.1 0.1.2 Mark destructive static hosting inputs immutable
rvn-ecs-cluster 0.1.1 0.1.2 Mark destructive ECS cluster inputs immutable
rvn-ecs-web 0.4.0 0.4.1 Mark destructive ECS web inputs immutable
rvn-rds 0.2.0 0.2.1 Make state backend workspace name immutable

Diffs

rvn-acm-certificate 0.2.0 -> 0.2.1

--- remote
+++ compiled
     label: AWS account & region
     type: section
   - id: aws_account_id
+    immutable: true
     label: AWS account
     required: true
     type: string
     values: $values:ravion/aws_accounts
   - description: Must be the same region as the load balancer, or us-east-1 for CloudFront.
     id: aws_region
+    immutable: true
     label: Region
     required: true
     type: string
@@
     type: string
   - description: Primary fully qualified domain name for the ACM certificate.
     id: domain_name
+    immutable: true
     label: Domain name
     placeholder: api.example.com
     required: true
@@
   - add_button_label: Add secondary domain
     description: Additional fully qualified domain names to include on the certificate.
     id: subject_alternative_names
+    immutable: true
     label: Subject alternative names
     placeholder: www.example.com
     type: string_array
@@
   - default: false
     description: Use only when the domain already has a Route53 public hosted zone and all primary/SAN validation records belong in that zone.
     id: route53_validation_records_creation_enabled
+    immutable: true
     label: Create Route53 validation records
     type: boolean
   - description: Public hosted zone used for validation records. Required when Route53 validation records are enabled.
     id: route53_zone_id
+    immutable: true
     label: Route53 hosted zone ID
     patterns:
       - message: Use a valid Route53 hosted zone ID, for example Z1234567890ABC.
@@
   - collapsible: true
     description: Override Terraform state backend workspace name. Defaults to project + environment + module given ids.
     id: ravion_state_backend_workspace
+    immutable: true
     label: Ravion Terraform workspace name
     type: string
   - collapsible: true
@@
 
   - [AWS Certificate Manager DNS validation](https://docs.aws.amazon.com/acm/latest/userguide/dns-validation.html)
   - [AWS Certificate Manager certificates for CloudFront](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/cnames-and-https-requirements.html)
-  - [Source module](https://github.com/flightcontrolhq/modules/tree/rvn-acm-certificate@0.2.0/security/acm_certificate)
+  - [Source module](https://github.com/flightcontrolhq/modules/tree/rvn-acm-certificate@0.2.1/security/acm_certificate)
 stack:
   pipelines:
     change:
@@
         base_path: security/acm_certificate
         branch: main
         execution_environment_id: << module.input.execution_environment_id >>
-        ref: rvn-acm-certificate@0.2.0
+        ref: rvn-acm-certificate@0.2.1
         repo: https://github.com/flightcontrolhq/modules
         stack_id: <<stack.id>>
         terraform_variables:

rvn-aws-iam-role 0.1.1 -> 0.1.2

--- remote
+++ compiled
     label: AWS account & region
     type: section
   - id: aws_account_id
+    immutable: true
     label: AWS account
     required: true
     type: string
     values: $values:ravion/aws_accounts
   - id: aws_region
+    immutable: true
     label: Region
     required: true
     type: string
@@
   - default: <<project.given_id>>-<<environment.given_id>>-<<module.given_id>>
     description: Name of the IAM role. AWS IAM role names must be unique in the account.
     id: name
+    immutable: true
     label: Role name
     patterns:
       - message: "Use 1-64 characters: letters, numbers, plus, equals, comma, period, at, underscore, or hyphen."
@@
     default: /
     description: IAM path for the role. Most roles should use the root path.
     id: path
+    immutable: true
     label: Path
     patterns:
       - message: Start and end with a slash, for example / or /service-roles/.
@@
   - default: false
     description: Create an IAM instance profile for EC2 instances to use this role.
     id: instance_profile_creation_enabled
+    immutable: true
     label: Create instance profile
     type: boolean
   - description: Instance profile name. Defaults to the role name when empty.
     id: instance_profile_name
+    immutable: true
     label: Instance profile name
     patterns:
       - message: "Use 1-128 characters: letters, numbers, plus, equals, comma, period, at, underscore, or hyphen."
@@
     type: string
   - description: IAM path for the instance profile. Defaults to the role path when empty.
     id: instance_profile_path
+    immutable: true
     label: Instance profile path
     patterns:
       - message: Start and end with a slash, for example / or /service-roles/.
@@
   - collapsible: true
     description: Override Terraform state backend workspace name. Defaults to project + environment + module given ids.
     id: ravion_state_backend_workspace
+    immutable: true
     label: Ravion Terraform workspace name
     type: string
   - collapsible: true
@@
   - [IAM roles](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)
   - [IAM JSON policy elements](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.html)
   - [IAM permissions boundaries](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_boundaries.html)
-  - [Source module](https://github.com/flightcontrolhq/modules/tree/rvn-aws-iam-role@0.1.1/security/iam)
+  - [Source module](https://github.com/flightcontrolhq/modules/tree/rvn-aws-iam-role@0.1.2/security/iam)
 stack:
   pipelines:
     change:
@@
         base_path: security/iam
         branch: main
         execution_environment_id: << module.input.execution_environment_id >>
-        ref: rvn-aws-iam-role@0.1.1
+        ref: rvn-aws-iam-role@0.1.2
         repo: https://github.com/flightcontrolhq/modules
         stack_id: <<stack.id>>
         terraform_variables:

rvn-aws-network 0.1.0 -> 0.1.1

--- remote
+++ compiled
     label: AWS account & region
     type: section
   - id: aws_account_id
+    immutable: true
     label: AWS account
     required: true
     type: string
     values: $values:ravion/aws_accounts
   - description: Recommend anything but us-east-1 as it has the most outages.
     id: aws_region
+    immutable: true
     label: Region
     required: true
     type: string
@@
   - default: <<project.given_id>>-<<environment.given_id>>
     description: Name prefix for all resources created by this module.
     id: name
+    immutable: true
     label: Name slug
     patterns:
       - message: The name must be 1-36 characters, contain only lowercase letters, numbers, and hyphens, and start and end with a letter or number.
@@
   - default: 10.0.0.0/16
     description: The IPv4 CIDR block for the VPC.
     id: vpc_cidr
+    immutable: true
     label: VPC CIDR
     required: false
     type: string
@@
   - collapsible: true
     description: Override Terraform state backend workspace name. Defaults to project + environment + module given ids.
     id: ravion_state_backend_workspace
+    immutable: true
     label: Ravion Terraform workspace name
     type: string
   - collapsible: true
@@
   - **VPC Flow Logs** for network traffic monitoring and SOC 2 compliance
   - **VPC Peering** to connect with existing VPCs across accounts or regions
 
-   Terraform source: [flightcontrolhq/modules/networking/vpc](https://github.com/flightcontrolhq/modules/tree/rvn-aws-network@0.1.0/networking/vpc)
+   Terraform source: [flightcontrolhq/modules/networking/vpc](https://github.com/flightcontrolhq/modules/tree/rvn-aws-network@0.1.1/networking/vpc)
 
   ## Use cases
 
@@
         base_path: networking/vpc
         branch: main
         execution_environment_id: << module.input.execution_environment_id >>
-        ref: rvn-aws-network@0.1.0
+        ref: rvn-aws-network@0.1.1
         repo: https://github.com/flightcontrolhq/modules
         stack_id: <<stack.id>>
         terraform_variables:

rvn-aws-static 0.1.1 -> 0.1.2

--- remote
+++ compiled
     label: AWS account & region
     type: section
   - id: aws_account_id
+    immutable: true
     label: AWS account
     required: true
     type: string
@@
   - default: us-east-1
     description: Region for the S3 bucket. CloudFront and KVS always use us-east-1.
     id: aws_region
+    immutable: true
     label: Region
     required: true
     type: string
@@
   - default: <<project.given_id>>-<<environment.given_id>>-<<module.given_id>>
     description: Name for the bucket and other resources' prefix. Must be globally unique.
     id: name
+    immutable: true
     label: Name slug
     patterns:
       - message: "Use a valid S3 bucket name: lowercase letters, numbers, hyphens, and periods; start and end with a letter or number."
@@
   - collapsible: true
     description: Override Terraform state backend workspace name. Defaults to project + environment + module given ids.
     id: ravion_state_backend_workspace
+    immutable: true
     label: Ravion Terraform workspace name
     type: string
   - collapsible: true
@@
 
   Every deployment is versioned. The deploy step promotes an S3 directory by updating the CloudFront KeyValueStore active pointer. CloudFront rewrites viewer requests to the active version prefix before it reads from S3.
 
-  Terraform source: [flightcontrolhq/modules/hosting/static_site](https://github.com/flightcontrolhq/modules/tree/rvn-aws-static@0.1.1/hosting/static_site)
+  Terraform source: [flightcontrolhq/modules/hosting/static_site](https://github.com/flightcontrolhq/modules/tree/rvn-aws-static@0.1.2/hosting/static_site)
 
   ## Use cases
 
@@
         base_path: hosting/static_site
         branch: main
         execution_environment_id: << module.input.execution_environment_id >>
-        ref: rvn-aws-static@0.1.1
+        ref: rvn-aws-static@0.1.2
         repo: https://github.com/flightcontrolhq/modules
         stack_id: <<stack.id>>
         terraform_variables:

rvn-ecs-cluster 0.1.1 -> 0.1.2

--- remote
+++ compiled
 inputs:
   - id: network
+    immutable: true
     label: VPC network
     mapped_inputs:
       - id: section_aws
@@
         type: section
       - default: << ref.input.aws_account_id >>
         id: aws_account_id
+        immutable: true
         label: AWS account
         type: string
         values: $values:ravion/aws_accounts
       - default: << ref.input.aws_region >>
         description: AWS region for this module. If unset in Terraform, the provider region is used.
         id: aws_region
+        immutable: true
         label: Region
         type: string
         values: $values:aws/regions
@@
         type: section
       - default: <<ref.stack.output.vpc_id>>
         id: vpc_id
+        immutable: true
         label: VPC ID
         required: true
         type: string
@@
         default: <<ref.stack.output.private_subnet_ids>>
         description: Required by Terraform. Used for private workloads and private load balancers.
         id: private_subnet_ids
+        immutable: true
         label: Private subnet IDs
         required: true
         type: string_array
@@
         default: <<ref.stack.output.public_subnet_ids>>
         description: Used for public load balancers. Terraform defaults to [] when no public load balancer is enabled.
         id: public_subnet_ids
+        immutable: true
         label: Public subnet IDs
         placeholder: subnet-...
         type: string_array
@@
   - default: <<project.given_id>>-<<environment.given_id>>
     description: Name prefix for all resources. Terraform requires 1-28 characters so generated ALB names fit AWS limits.
     id: name
+    immutable: true
     label: Name slug
     patterns:
       - message: The name must be 1-28 characters, contain only lowercase letters, numbers, and hyphens, and start and end with a letter or number.
@@
   - collapsible: true
     description: Override Terraform state backend workspace name. Defaults to project + environment + module given ids.
     id: ravion_state_backend_workspace
+    immutable: true
     label: Ravion Terraform workspace name
     type: string
   - collapsible: true
@@
   - **Public and private Network Load Balancers** for TCP/UDP and static IP use cases
   - **CloudWatch Container Insights** dashboard metrics for production visibility
 
-  Terraform source: [flightcontrolhq/modules/compute/ecs_cluster](https://github.com/flightcontrolhq/modules/tree/rvn-ecs-cluster@0.1.1/compute/ecs_cluster)
+  Terraform source: [flightcontrolhq/modules/compute/ecs_cluster](https://github.com/flightcontrolhq/modules/tree/rvn-ecs-cluster@0.1.2/compute/ecs_cluster)
 
   ## Use cases
 
@@
         base_path: compute/ecs_cluster
         branch: main
         execution_environment_id: << module.input.execution_environment_id >>
-        ref: rvn-ecs-cluster@0.1.1
+        ref: rvn-ecs-cluster@0.1.2
         repo: https://github.com/flightcontrolhq/modules
         stack_id: <<stack.id>>
         terraform_variables:

rvn-ecs-web 0.4.0 -> 0.4.1

--- remote
+++ compiled
     label: ECS cluster
     type: section
   - id: cluster
+    immutable: true
     label: ECS cluster
     mapped_inputs:
       - default: <<ref.input.aws_account_id>>
         id: aws_account_id
+        immutable: true
         label: AWS account
         type: string
         values: $values:ravion/aws_accounts
       - default: <<ref.input.aws_region>>
         id: aws_region
+        immutable: true
         label: Region
         type: string
         values: $values:aws/regions
@@
         values: $values:ravion/execution_environments
       - default: <<ref.stack.output.cluster_arn>>
         id: cluster_arn
+        immutable: true
         label: Cluster ARN
         required: true
         type: string
       - default: <<ref.input.vpc_id>>
         id: vpc_id
+        immutable: true
         label: VPC ID
         required: true
         type: string
@@
         default: <<ref.input.private_subnet_ids>>
         description: Private subnets available from the selected ECS cluster network.
         id: private_subnet_ids
+        immutable: true
         label: Private subnet IDs
         required: true
         type: string_array
@@
         default: <<ref.input.public_subnet_ids>>
         description: Public subnets available from the selected ECS cluster network.
         id: public_subnet_ids
+        immutable: true
         label: Public subnet IDs
         type: string_array
       - add_button_label: Add subnet ID
@@
         default: <<ref.input.private_subnet_ids>>
         description: Legacy service subnet override. Leave blank to derive subnets from the public/private service setting.
         id: subnet_ids
+        immutable: true
         label: Private subnet IDs
         required: false
         type: string_array
@@
         type: section
       - default: <<ref.stack.output.fargate_capacity_provider_name>>
         id: fargate_capacity_provider_name
+        immutable: true
         label: Fargate capacity provider
         type: string
       - default: <<ref.stack.output.fargate_spot_capacity_provider_name>>
         id: fargate_spot_capacity_provider_name
+        immutable: true
         label: Fargate spot capacity provider
         type: string
       - default: ""
         description: EC2 capacity provider name from the selected cluster. Required only when using EC2 capacity.
         id: ec2_capacity_provider_name
+        immutable: true
         label: EC2 capacity provider
         required: false
         show_when:
@@
         type: section
       - default: <<ref.stack.output.public_alb_http_listener_arn>>
         id: public_alb_http_listener_arn
+        immutable: true
         label: Public ALB HTTP listener ARN
         type: string
       - collapsible: true
         default: <<ref.stack.output.public_alb_https_listener_arn>>
         description: HTTPS listener ARN from the selected public ALB. Ravion uses it when present, otherwise falls back to HTTP.
         id: public_alb_https_listener_arn
+        immutable: true
         label: Public ALB HTTPS listener ARN
         required: false
         type: string
       - default: <<ref.stack.output.public_alb_security_group_id>>
         id: public_alb_security_group_id
+        immutable: true
         label: Public ALB security group ID
         type: string
       - default: <<ref.stack.output.private_alb_http_listener_arn>>
         id: private_alb_http_listener_arn
+        immutable: true
         label: Private ALB HTTP listener ARN
         type: string
       - collapsible: true
         default: <<ref.stack.output.private_alb_https_listener_arn>>
         description: HTTPS listener ARN from the selected private ALB. Ravion uses it when present, otherwise falls back to HTTP.
         id: private_alb_https_listener_arn
+        immutable: true
         label: Private ALB HTTPS listener ARN
         required: false
         type: string
       - default: <<ref.stack.output.private_alb_security_group_id>>
         id: private_alb_security_group_id
+        immutable: true
         label: Private ALB security group ID
         type: string
     required: true
@@
   - default: <<project.given_id>>-<<environment.given_id>>-<<module.given_id>>
     description: Name for the ECS service and related resources.
     id: name
+    immutable: true
     label: Service name
     patterns:
       - message: Use 1-255 letters, numbers, underscores, or hyphens, starting with a letter or number.
@@
   - default: 80
     description: Port the web container listens on.
     id: container_port
+    immutable: true
     label: Container port
     max: 65535
     min: 1
@@
   - collapsible: true
     description: Override Terraform state backend workspace name. Defaults to project + environment + module given ids.
     id: ravion_state_backend_workspace
+    immutable: true
     label: Ravion Terraform workspace name
     type: string
   - collapsible: true
@@
 
   The module is intentionally focused on web services behind an Application Load Balancer. It uses the selected ECS cluster to inherit AWS account, region, VPC, subnets, capacity providers, load balancer listeners, and load balancer security groups.
 
-  Terraform source: [flightcontrolhq/modules/compute/ecs_service](https://github.com/flightcontrolhq/modules/tree/rvn-ecs-web@0.4.0/compute/ecs_service)
+  Terraform source: [flightcontrolhq/modules/compute/ecs_service](https://github.com/flightcontrolhq/modules/tree/rvn-ecs-web@0.4.1/compute/ecs_service)
 
   ## Use cases
 
@@
         base_path: compute/ecs_service
         branch: main
         execution_environment_id: << module.input.execution_environment_id >>
-        ref: rvn-ecs-web@0.4.0
+        ref: rvn-ecs-web@0.4.1
         repo: https://github.com/flightcontrolhq/modules
         stack_id: <<stack.id>>
         terraform_variables:

rvn-rds 0.2.0 -> 0.2.1

--- remote
+++ compiled
   - collapsible: true
     description: Override Terraform state backend workspace name. Defaults to project + environment + module given ids.
     id: ravion_state_backend_workspace
+    immutable: true
     label: Ravion Terraform workspace name
     type: string
   - collapsible: true
@@
   - [RDS DB instance classes](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Concepts.DBInstanceClass.html)
   - [RDS security](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.html)
   - [RDS monitoring](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_Monitoring.html)
-  - [Terraform source](https://github.com/flightcontrolhq/modules/tree/rvn-rds@0.2.0/database/rds)
+  - [Terraform source](https://github.com/flightcontrolhq/modules/tree/rvn-rds@0.2.1/database/rds)
 stack:
   pipelines:
     change:
@@
         base_path: database/rds
         branch: main
         execution_environment_id: << module.input.execution_environment_id >>
-        ref: rvn-rds@0.2.0
+        ref: rvn-rds@0.2.1
         repo: https://github.com/flightcontrolhq/modules
         stack_id: <<stack.id>>
         terraform_variables:

@flybayer

Copy link
Copy Markdown
Member Author

@greptile

@flybayer flybayer requested a review from mabadir June 12, 2026 00:31
@flybayer flybayer merged commit 7b8cb0c into main Jun 12, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant