Skip to content

Derive per-input applies_on (stack / build / deploy) in the compiler - #100

Open
devin-ai-integration[bot] wants to merge 22 commits into
mainfrom
devin/1786224974-derive-applies-on
Open

Derive per-input applies_on (stack / build / deploy) in the compiler#100
devin-ai-integration[bot] wants to merge 22 commits into
mainfrom
devin/1786224974-derive-applies-on

Conversation

@devin-ai-integration

@devin-ai-integration devin-ai-integration Bot commented Aug 8, 2026

Copy link
Copy Markdown
Contributor

Summary

Derives per-input applies_on (stack / build / deploy) in the modules compiler, so every compiled definition says what a change to each input actually requires. Flightcontrol #6879 adds the schema field; #6881/#6883 consume this metadata in the API, CLI and UI.

Derivation runs after $include / $merge / $template / $with resolution and scans module.stack, module.build, module.deploy for references to each input, unioning the phases it finds. [] means "referenced by none of those sections", which is deliberately different from absent metadata (a definition published before this existed) — consumers treat the first as "nothing to do" and the second as "unknown".

The attribution rules are where the subtlety lives, and getting them wrong silently mis-advises users:

  • an indexed or element reference attributes to the named child, so module.input.listeners[0].tls_certificate gives listeners.tls_certificate["stack"] rather than dragging every listener child up to the parent's ["stack","deploy"];
  • children with no reference of their own inherit the parent's phases; the parent is the union of its children;
  • #.field element expressions bind to the collection of the enclosing map(module.input.<collection>, ...) (innermost when nested), while plain references in the same string keep their own attribution;
  • bare-ID fallback is limited to mapped_inputs — arbitrary item_inputs children collide on names like name/enabled, so an ambiguous ID gets no attribution and a warning instead of a wrong one.

Authored applies_on is preserved and overrides derivation; a superset is allowed silently and an override that omits a derived phase warns.

Two authored overrides, because static derivation can only see references. Where a value reaches the running app through a deploy-time step behind a stack-only reference, derivation under-reports — which is the one failure mode this feature must not have:

  • rvn-ec2-service runtime environment_variables / secrets[stack, deploy]: the env file is re-rendered at boot and on every deploy, so a running instance doesn't see new values from a stack update alone.
  • rvn-aws-static build_environment_variables[build, deploy]: the build uploads to a versioned S3 prefix, and a separate deploy flips the CloudFront KeyValueStore active key (see iam_deploy.tf / cloudfront_kvs.tf), so a rebuild alone doesn't go live.

ECS web/NLB (["deploy"] for runtime env/secrets), Lambda (["stack"], runtime config is stack-managed) and the remaining definitions were checked and derive correctly.

Also documents the field for authors in .agents/skills/module-definition-config/SKILL.md (alongside Input Immutability), including when to author an override and how to read a specific input's derived phases, with a pointer from AGENTS.md.

Definition releases are patch-bumped where compiled output changed, and the README version table is regenerated. Note the publish dry-run cannot pass until #6879 is deployed — until then api.ravion.com rejects the new field with 422 "applies_on": "field is not allowed".

Link to Devin session: https://app.devin.ai/sessions/a32da8ecb942427eb0e38330c7ff8294
Requested by: @flybayer

@flybayer flybayer self-assigned this Aug 8, 2026
@flybayer
flybayer self-requested a review August 8, 2026 21:43
@devin-ai-integration

Copy link
Copy Markdown
Contributor Author

🤖 Devin AI Engineer

I'll be helping with this pull request! Here's what you should know:

✅ I will automatically:

  • Address comments on this PR. Add '(aside)' to your comment to have me ignore it.
  • Look at CI failures and help fix them

Note: I can only respond to comments from users who have write access to this repository.

⚙️ Control Options:

  • Disable automatic comment, CI, and merge conflict monitoring

@github-actions

github-actions Bot commented Aug 8, 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 1.0.1 1.0.2 Derive per-input apply-action metadata in the compiled module definition.
rvn-aurora 1.2.0 1.2.1 Derive per-input apply-action metadata in the compiled module definition.
rvn-aws-alb 1.0.1 1.0.2 Derive per-input apply-action metadata in the compiled module definition.
rvn-aws-iam-policy 1.0.1 1.0.2 Derive per-input apply-action metadata in the compiled module definition.
rvn-aws-iam-role 1.0.1 1.0.2 Derive per-input apply-action metadata in the compiled module definition.
rvn-aws-network 1.0.1 1.0.2 Derive per-input apply-action metadata in the compiled module definition.
rvn-aws-static 1.1.1 1.1.2 Prevent applies from failing with CloudFront in-use errors and derive per-input apply-action metadata in the compiled module definition.
rvn-cloudfront 1.2.2 1.2.3 Fix the managed Markdown cache policy, prevent CloudFront in-use apply failures, and derive per-input apply-action metadata.
rvn-ec2-service 1.4.0 1.3.1 Add Builder IAM policies inputs and derive per-input apply-action metadata in the compiled module definition.
rvn-ecs-cluster 1.0.1 1.0.2 Derive per-input apply-action metadata in the compiled module definition.
rvn-ecs-nlb 1.1.0 1.1.1 Add Builder IAM policies inputs and derive per-input apply-action metadata in the compiled module definition.
rvn-ecs-web 1.1.0 1.1.1 Add Builder IAM policies inputs and derive per-input apply-action metadata in the compiled module definition.
rvn-ecs-worker 1.1.0 1.1.1 Add Builder IAM policies inputs and derive per-input apply-action metadata in the compiled module definition.
rvn-efs 1.0.1 1.0.2 Derive per-input apply-action metadata in the compiled module definition.
rvn-elasticache 1.0.1 1.0.2 Derive per-input apply-action metadata in the compiled module definition.
rvn-lambda 1.1.0 1.1.1 Add Builder IAM policies inputs and derive per-input apply-action metadata in the compiled module definition.
rvn-rds 1.2.0 1.2.1 Derive per-input apply-action metadata in the compiled module definition.
rvn-rds-proxy 0.1.0 0.1.1 Derive per-input apply-action metadata in the compiled module definition.
rvn-route53 1.0.3 1.0.4 Correct long TXT and SPF record encoding and derive per-input apply-action metadata.
rvn-s3 1.0.1 1.0.2 Derive per-input apply-action metadata in the compiled module definition.
rvn-stack 1.2.4 1.2.5 Derive per-input apply-action metadata in the compiled module definition.

Diffs

rvn-acm-certificate 1.0.1 -> 1.0.2

--- remote
+++ compiled
   - id: section_aws
     label: AWS account & region
     type: section
-  - id: aws_account_id
+  - applied_by:
+      - stack
+    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.
+  - applied_by:
+      - stack
+    description: Must be the same region as the load balancer, or us-east-1 for CloudFront.
     id: aws_region
     immutable: true
     label: Region
@@
   - id: section_certificate
     label: Certificate
     type: section
-  - default: <<project.given_id>>-<<environment.given_id>>-<<module.given_id>>
+  - applied_by:
+      - stack
+    default: <<project.given_id>>-<<environment.given_id>>-<<module.given_id>>
     description: Name prefix used for tagging the ACM certificate.
     id: name
     label: Name slug
@@
     required: true
     type: string
   - add_button_label: Add domain
+    applied_by:
+      - stack
     description: Fully qualified domain names for the certificate. The first domain is primary and the remaining domains are subject alternative names.
     id: domains
     immutable: true
@@
   - id: section_validation
     label: DNS validation
     type: section
-  - default: false
+  - applied_by:
+      - stack
+    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.
+  - applied_by:
+      - stack
+    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
@@
     show_when:
       route53_validation_records_creation_enabled: true
     type: string
-  - default: false
+  - applied_by:
+      - stack
+    default: false
     description: Wait for ACM to issue the certificate during apply. Enable after DNS validation can complete.
     id: certificate_validation_wait_enabled
     label: Wait for certificate issuance
@@
   - id: section_misc
     label: Misc
     type: section
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: A map of tags to assign to all resources. Default tags are `Owner`, `ProjectGivenId`, `EnvironmentGivenId`, `ModuleGivenId`, `ModuleId`
     id: tags
     label: Tags
@@
   - id: section_advanced
     label: Terraform settings
     type: section
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: Override the environment's default version for this module
     id: opentofu_version
     label: OpenTofu version override
     required: false
     type: string
     values: $values:opentofu/versions
-  - collapsible: true
+  - applied_by:
+      - stack
+    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
+  - applied_by:
+      - stack
+    collapsible: true
     default: {}
     description: Optional raw Terraform variable overrides for advanced module inputs or one-off overrides. Values here override the generated variables above.
     id: advanced_terraform_variables
     label: Advanced Terraform variables
     required: false
     type: object
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: Override the VPC, subnet, and security group for Terraform runners. Must use the same AWS account as selected above.
     id: execution_environment_id
     label: Terraform execution environment
@@
 
   - [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/ravionhq/modules/tree/rvn-acm-certificate@1.0.1/security/acm_certificate)
+  - [Source module](https://github.com/ravionhq/modules/tree/rvn-acm-certificate@1.0.2/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@1.0.1
+        ref: rvn-acm-certificate@1.0.2
         repo: https://github.com/ravionhq/modules
         stack_id: <<stack.id>>
         terraform_variables:

rvn-aurora 1.2.0 -> 1.2.1

--- remote
+++ compiled
 inputs:
-  - id: network
+  - applied_by:
+      - stack
+    id: network
     immutable: true
     label: VPC network
     mapped_inputs:
-      - id: section_aws
+      - applied_by: []
+        id: section_aws
         label: AWS account & region
         type: section
-      - default: << ref.input.aws_account_id >>
+      - applied_by:
+          - stack
+        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 >>
+      - applied_by:
+          - stack
+        default: << ref.input.aws_region >>
         id: aws_region
         immutable: true
         label: Region
         type: string
         values: $values:aws/regions
-      - collapsible: true
+      - applied_by:
+          - stack
+        collapsible: true
         default: << ref.input.execution_environment_id >>
         description: Override the VPC, subnet, and security group for Pipeline Terraform runners. Must use the same AWS account as selected above.
         id: execution_environment_id
         label: Terraform execution environment
         type: string
         values: $values:ravion/execution_environments
-      - id: section_vpc
+      - applied_by: []
+        id: section_vpc
         label: VPC
         type: section
-      - default: <<ref.stack.output.vpc_id>>
+      - applied_by:
+          - stack
+        default: <<ref.stack.output.vpc_id>>
         id: vpc_id
         immutable: true
         label: VPC ID
         required: true
         type: string
       - add_button_label: Add private subnet ID
+        applied_by:
+          - stack
         default: <<ref.stack.output.private_subnet_ids>>
         description: Used for the Aurora DB subnet group when the database is not publicly accessible. Use at least two subnets in different Availability Zones.
         id: private_subnet_ids
@@
         required: true
         type: string_array
       - add_button_label: Add public subnet ID
+        applied_by:
+          - stack
         default: <<ref.stack.output.public_subnet_ids>>
         description: Used for the Aurora DB subnet group when Publicly accessible is enabled. AWS requires public subnets for public database access.
         id: public_subnet_ids
@@
   - id: section_database
     label: Database
     type: section
-  - default: <<project.given_id>>-<<environment.given_id>>
+  - applied_by:
+      - stack
+    default: <<project.given_id>>-<<environment.given_id>>
     description: Name of the Aurora cluster and prefix for related resources.
     id: name
     immutable: true
@@
         pattern: ^[a-z]([a-z0-9-]{0,61}[a-z0-9])?$
     required: true
     type: string
-  - default: none
+  - applied_by:
+      - stack
+    default: none
     id: restore_mode
     immutable: true
     label: Create or restore
@@
         value: snapshot
       - label: Point-in-time restore
         value: point_in_time
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: Name for an automatically created database on the cluster.
     id: database_name
     immutable: true
@@
     show_when:
       restore_mode: none
     type: string
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     default: dbadmin
     id: master_username
     immutable: true
@@
     show_when:
       restore_mode: none
     type: string
-  - description: Snapshot identifier or ARN to restore into this new Aurora cluster.
+  - applied_by:
+      - stack
+    description: Snapshot identifier or ARN to restore into this new Aurora cluster.
     id: snapshot_identifier
     immutable: true
     label: Snapshot to restore
@@
     show_when:
       restore_mode: snapshot
     type: string
-  - description: Source Aurora cluster identifier to restore from.
+  - applied_by:
+      - stack
+    description: Source Aurora cluster identifier to restore from.
     id: point_in_time_source_cluster_identifier
     immutable: true
     label: Source cluster identifier
@@
     show_when:
       restore_mode: point_in_time
     type: string
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     default: full-copy
     id: point_in_time_restore_type
     immutable: true
@@
         value: full-copy
       - label: Copy on write
         value: copy-on-write
-  - default: true
+  - applied_by:
+      - stack
+    default: true
     description: Restore to the latest time AWS can recover from the selected source cluster backup.
     id: point_in_time_use_latest_restorable_time
     immutable: true
@@
     show_when:
       restore_mode: point_in_time
     type: boolean
-  - description: Restore to this UTC timestamp instead of the latest restorable time.
+  - applied_by:
+      - stack
+    description: Restore to this UTC timestamp instead of the latest restorable time.
     id: point_in_time_restore_time
     immutable: true
     label: Restore time
@@
   - id: section_version
     label: Version
     type: section
-  - default: aurora-postgresql
+  - applied_by:
+      - stack
+    default: aurora-postgresql
     id: engine
     immutable: true
     label: Engine
@@
         value: aurora-postgresql
       - label: Aurora MySQL
         value: aurora-mysql
-  - description: "Examples: 16 for Aurora PostgreSQL or 8.0 for Aurora MySQL."
+  - applied_by:
+      - stack
+    description: "Examples: 16 for Aurora PostgreSQL or 8.0 for Aurora MySQL."
     id: engine_major_version
     label: Engine major version
     placeholder: "16"
     required: true
     type: string
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: "Optional minor engine version appended to the major version. Example: 4 becomes 16.4 for Aurora PostgreSQL; 3.08.0 becomes 8.0.mysql_aurora.3.08.0 for Aurora MySQL."
     id: engine_minor_version
     label: Engine minor version
     placeholder: "4"
     required: false
     type: string
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     default: true
     description: Enable automatic minor engine version upgrades during the configured maintenance window.
     id: minor_version_auto_upgrade_enabled
@@
   - id: section_capacity
     label: Capacity
     type: section
-  - default: provisioned
+  - applied_by:
+      - stack
+    default: provisioned
     description: Choose fixed DB instances or Aurora Serverless v2 capacity.
     id: capacity_mode
     label: Capacity mode
@@
         value: provisioned
       - label: Serverless v2
         value: serverless_v2
-  - default: db.t4g.medium
+  - applied_by:
+      - stack
+    default: db.t4g.medium
     description: Aurora writer instance size, such as db.t4g.medium or db.r6g.large.
     id: instance_class
     label: Instance class
@@
     show_when:
       capacity_mode: provisioned
     type: string
-  - default: 1
+  - applied_by:
+      - stack
+    default: 1
     description: Minimum Aurora Serverless v2 capacity units. Must not exceed max capacity.
     id: serverless_min_capacity
     label: Min capacity (ACUs)
@@
     show_when:
       capacity_mode: serverless_v2
     type: number
-  - default: 4
+  - applied_by:
+      - stack
+    default: 4
     description: Maximum Aurora Serverless v2 capacity units. Must be at least min capacity.
     id: serverless_max_capacity
     label: Max capacity (ACUs)
@@
   - id: section_storage
     label: Storage & cluster
     type: section
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     default: aurora
     id: storage_type
     label: Storage type
@@
         value: aurora
       - label: Aurora I/O-Optimized
         value: aurora-iopt1
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     id: kms_key_id
     immutable: true
     label: Storage KMS key ARN
     placeholder: arn:aws:kms:...
     required: false
     type: string
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     id: ca_certificate_identifier
     label: CA certificate identifier
     required: false
     type: string
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     default: IPV4
     id: network_type
     label: Network type
@@
   - id: section_access
     label: Network access
     type: section
-  - default: false
+  - applied_by:
+      - stack
+    default: false
     description: Keep disabled for production databases unless public access is intentional.
     id: public_access_enabled
     label: Publicly accessible
     type: boolean
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: "Leave blank to use the engine default port: 5432 for PostgreSQL or 3306 for MySQL."
     id: port
     label: Port
@@
     min: 1
     required: false
     type: number
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     default: true
     id: security_group_creation_enabled
     immutable: true
     label: Security group creation
     type: boolean
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     id: security_group_id
     label: Existing security group ID
     placeholder: sg-...
@@
       security_group_creation_enabled: false
     type: string
   - add_button_label: Add security group ID
+    applied_by:
+      - stack
     collapsible: true
     id: allowed_security_group_ids
     label: Allowed security groups
@@
       security_group_creation_enabled: true
     type: string_array
   - add_button_label: Add CIDR block
+    applied_by:
+      - stack
     collapsible: true
     id: allowed_cidr_blocks
     label: Allowed CIDR blocks
@@
   - id: section_proxy
     label: Connection pooling
     type: section
-  - default: false
+  - applied_by:
+      - stack
+    default: false
     description: Create an RDS Proxy in front of the cluster for connection pooling and improved failover handling. Applications keep connecting to the cluster endpoint until you update their connection string to the proxy endpoint output.
     id: proxy_creation_enabled
     label: RDS Proxy
     type: boolean
   - add_button_label: Add secret ARN
+    applied_by:
+      - stack
     collapsible: true
     description: Secrets Manager secrets containing database credentials for the proxy. Leave blank to use the managed master user secret.
     id: proxy_auth_secret_arns
@@
       proxy_creation_enabled: true
     type: string_array
   - add_button_label: Add KMS key ARN
+    applied_by:
+      - stack
     collapsible: true
     description: KMS keys used to encrypt the auth secrets when using customer-managed keys. The master user secret KMS key is included automatically.
     id: proxy_secret_kms_key_arns
@@
     show_when:
       proxy_creation_enabled: true
     type: string_array
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     default: false
     description: Require IAM authentication for client connections to the proxy.
     id: proxy_iam_auth_enabled
@@
     show_when:
       proxy_creation_enabled: true
     type: boolean
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     default: true
     description: Require TLS for client connections to the proxy.
     id: proxy_tls_requirement_enabled
@@
     show_when:
       proxy_creation_enabled: true
     type: boolean
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     default: false
     description: Log detailed connection information, including SQL statements, to CloudWatch Logs.
     id: proxy_debug_logging_enabled
@@
     show_when:
       proxy_creation_enabled: true
     type: boolean
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     default: 1800
     id: proxy_idle_client_timeout
 
... diff truncated ...

rvn-aws-alb 1.0.1 -> 1.0.2

--- remote
+++ compiled
 inputs:
-  - id: network
+  - applied_by:
+      - stack
+    id: network
     immutable: true
     label: VPC network
     mapped_inputs:
-      - id: section_aws
+      - applied_by: []
+        id: section_aws
         label: AWS account & region
         type: section
-      - default: << ref.input.aws_account_id >>
+      - applied_by:
+          - stack
+        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 >>
+      - applied_by:
+          - stack
+        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
-      - collapsible: true
+      - applied_by:
+          - stack
+        collapsible: true
         default: << ref.input.execution_environment_id >>
         description: Override the VPC, subnet, and security group for Terraform runners. Must use the same AWS account as selected above.
         id: execution_environment_id
         label: Terraform execution environment
         type: string
         values: $values:ravion/execution_environments
-      - id: section_vpc
+      - applied_by: []
+        id: section_vpc
         label: VPC
         type: section
-      - default: <<ref.stack.output.vpc_id>>
+      - applied_by:
+          - stack
+        default: <<ref.stack.output.vpc_id>>
         id: vpc_id
         immutable: true
         label: VPC ID
         required: true
         type: string
       - add_button_label: Add private subnet ID
+        applied_by:
+          - stack
         default: <<ref.stack.output.private_subnet_ids>>
         description: Required by Terraform. Used for private workloads and private load balancers.
         id: private_subnet_ids
@@
         required: true
         type: string_array
       - add_button_label: Add public subnet ID
+        applied_by:
+          - stack
         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
@@
   - id: section_load_balancer
     label: Load balancer
     type: section
-  - default: <<project.given_id>>-<<environment.given_id>>-<<module.given_id>>
+  - applied_by:
+      - stack
+    default: <<project.given_id>>-<<environment.given_id>>-<<module.given_id>>
     description: Name for the load balancer and related resources.
     id: name
     immutable: true
@@
         pattern: ^[a-z0-9]([a-z0-9-]{0,30}[a-z0-9])?$
     required: true
     type: string
-  - default: false
+  - applied_by:
+      - stack
+    default: false
     description: Create an internal load balancer reachable only inside the VPC. Turn off for an internet-facing load balancer in the public subnets.
     id: internal_load_balancer_enabled
     label: Internal load balancer
     type: boolean
-  - default: true
+  - applied_by:
+      - stack
+    default: true
     description: Prevent accidental deletion of the load balancer via the AWS API.
     id: deletion_protection_enabled
     label: Deletion protection
     type: boolean
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     default: 60
     description: Seconds a connection is allowed to be idle before the load balancer closes it.
     id: idle_timeout
@@
   - id: section_listeners
     label: Listeners
     type: section
-  - default: true
+  - applied_by:
+      - stack
+    default: true
     description: Create an HTTP listener.
     id: http_listener_enabled
     label: HTTP
     type: boolean
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     default: 80
     id: http_listener_port
     label: HTTP port
@@
     show_when:
       http_listener_enabled: true
     type: number
-  - default: false
+  - applied_by:
+      - stack
+    default: false
     description: Create an HTTPS listener. Select an ACM certificate when enabled.
     id: https_listener_enabled
     label: HTTPS
     type: boolean
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     default: 443
     id: https_listener_port
     label: HTTPS port
@@
     show_when:
       https_listener_enabled: true
     type: number
-  - description: Primary ACM certificate module for HTTPS. The certificate must use the same AWS account and region as the load balancer.
+  - applied_by:
+      - stack
+    description: Primary ACM certificate module for HTTPS. The certificate must use the same AWS account and region as the load balancer.
     id: certificate
     label: Certificate
     mapped_inputs:
       - add_button_label: Add certificate ARN
+        applied_by:
+          - stack
         default:
           - <<ref.stack.output.certificate_arn>>
         description: ACM certificate ARNs resolved from the selected module. The first ARN is the default certificate.
@@
       https_listener_enabled: true
     type: $ref:rvn-acm-certificate
   - add_button_label: Add certificate ARN
+    applied_by:
+      - stack
     collapsible: true
     default: []
     description: Additional ACM certificate ARNs attached to the HTTPS listener for SNI.
@@
     show_when:
       https_listener_enabled: true
     type: string_array
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: SSL policy for the HTTPS listener.
     id: ssl_policy
     label: SSL policy
@@
     show_when:
       https_listener_enabled: true
     type: string
-  - default: true
+  - applied_by:
+      - stack
+    default: true
     description: Redirect HTTP traffic to the HTTPS listener. Applies only when both listeners are enabled.
     id: http_to_https_redirect_enabled
     label: Redirect HTTP to HTTPS
@@
     label: Security
     type: section
   - add_button_label: Add CIDR block
+    applied_by:
+      - stack
     collapsible: true
     description: IPv4 CIDR blocks allowed to reach the load balancer. Defaults to public internet access for an internet-facing load balancer and RFC1918 private ranges for an internal load balancer. Use an empty list to allow no IPv4 ingress.
     id: ingress_cidr_blocks
@@
     placeholder: 0.0.0.0/0
     type: string_array
   - add_button_label: Add IPv6 CIDR block
+    applied_by:
+      - stack
     collapsible: true
     description: IPv6 CIDR blocks allowed to reach the load balancer. Defaults to public internet access for an internet-facing load balancer and no IPv6 ingress for an internal load balancer. Use an empty list to allow no IPv6 ingress.
     id: ingress_ipv6_cidr_blocks
     label: Ingress IPv6 CIDRs
     placeholder: ::/0
     type: string_array
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: WAFv2 Web ACL to associate with the load balancer.
     id: web_acl_arn
     label: WAF web ACL ARN
@@
   - id: section_access_logs
     label: Access logs
     type: section
-  - default: false
+  - applied_by:
+      - stack
+    default: false
     description: Write load balancer access logs to S3.
     id: access_logs_enabled
     label: Access logs
     type: boolean
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: Existing S3 bucket for access logs. Leave blank to create a bucket.
     id: access_logs_bucket_arn
     label: Access logs bucket ARN
@@
     show_when:
       access_logs_enabled: true
     type: string
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     default: 90
     description: Days to retain access logs in the created bucket.
     id: access_logs_retention_days
@@
   - id: section_misc
     label: Misc
     type: section
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: A map of tags to assign to all resources. Default tags are `Owner`, `ProjectGivenId`, `EnvironmentGivenId`, `ModuleGivenId`, `ModuleId`
     id: tags
     label: Tags
@@
   - id: section_advanced
     label: Terraform settings
     type: section
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: Override the environment's default version for this module
     id: opentofu_version
     label: OpenTofu version override
     required: false
     type: string
     values: $values:opentofu/versions
-  - collapsible: true
+  - applied_by:
+      - stack
+    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
+  - applied_by:
+      - stack
+    collapsible: true
     default: {}
     description: Optional raw Terraform variable overrides for advanced module inputs or one-off overrides. Values here override the generated variables above.
     id: advanced_terraform_variables
@@
 
   The load balancer intentionally serves no traffic by itself. Services that reference this module, such as EC2 services, create their own target groups and listener rules on the shared listeners.
 
-  Terraform source: [ravionhq/modules/networking/alb](https://github.com/ravionhq/modules/tree/rvn-aws-alb@1.0.1/networking/alb)
+  Terraform source: [ravionhq/modules/networking/alb](https://github.com/ravionhq/modules/tree/rvn-aws-alb@1.0.2/networking/alb)
 
   ## Use cases
 
@@
         base_path: networking/alb
         branch: main
         execution_environment_id: << module.input.execution_environment_id >>
-        ref: rvn-aws-alb@1.0.1
+        ref: rvn-aws-alb@1.0.2
         repo: https://github.com/ravionhq/modules
         stack_id: <<stack.id>>
         terraform_variables:

rvn-aws-iam-policy 1.0.1 -> 1.0.2

--- remote
+++ compiled
   - id: section_aws
     label: AWS account & region
     type: section
-  - id: aws_account_id
+  - applied_by:
+      - stack
+    id: aws_account_id
     immutable: true
     label: AWS account
     required: true
     type: string
     values: $values:ravion/aws_accounts
-  - id: aws_region
+  - applied_by:
+      - stack
+    id: aws_region
     immutable: true
     label: Region
     required: true
@@
   - id: section_policy
     label: IAM policy
     type: section
-  - default: <<module.given_id>>
+  - applied_by:
+      - stack
+    default: <<module.given_id>>
     description: Name of the customer-managed IAM policy. Policy names must be unique within their path in the AWS account.
     id: name
     immutable: true
@@
         pattern: ^[A-Za-z0-9+=,.@_-]{1,128}$
     required: true
     type: string
-  - description: Optional description stored on the IAM policy. AWS does not allow this value to be changed after creation.
+  - applied_by:
+      - stack
+    description: Optional description stored on the IAM policy. AWS does not allow this value to be changed after creation.
     id: description
     immutable: true
     label: Description
@@
       - message: 1000 characters or fewer.
         pattern: ^.{0,1000}$
     type: string
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     default: /
     description: IAM path for organizing the policy. Most policies should use the root path.
     id: path
@@
   - id: section_document
     label: Policy document
     type: section
-  - default: structured
+  - applied_by: []
+    default: structured
     description: Build the policy with structured statements or provide a complete JSON document.
     id: policy_document_mode
     label: Policy document format
@@
         value: structured
       - label: JSON document
         value: json
-  - default: []
+  - applied_by:
+      - stack
+    default: []
     description: Define permissions this policy grants or denies. Each statement matches Action or NotAction values against Resource or NotResource ARNs and can add conditions to narrow access. Prefer explicit actions and resource ARNs over wildcards.
     id: policy_statements
     item_inputs:
-      - description: Optional IAM statement ID.
+      - applied_by:
+          - stack
+        description: Optional IAM statement ID.
         id: sid
         label: SID
         required: false
         type: string
-      - default: Allow
+      - applied_by:
+          - stack
+        default: Allow
         description: Whether this statement allows or denies the listed actions.
         id: effect
         label: Effect
@@
             value: Allow
           - label: Deny
             value: Deny
-      - default: Action
+      - applied_by:
+          - stack
+        default: Action
         description: Match the listed actions or every applicable action except those listed.
         id: action_match_mode
         label: Action matching
@@
           - label: All except listed actions
             value: NotAction
       - add_button_label: Add action
+        applied_by:
+          - stack
         description: IAM actions granted or denied by this statement.
         id: actions
         label: Actions
@@
           action_match_mode: Action
         type: string_array
       - add_button_label: Add excluded action
+        applied_by:
+          - stack
         description: IAM actions excluded from this statement's match. NotAction can create broad permissions and should be used carefully.
         id: not_actions
         label: Excluded actions (NotAction)
@@
         show_when:
           action_match_mode: NotAction
         type: string_array
-      - default: Resource
+      - applied_by:
+          - stack
+        default: Resource
         description: Match the listed resources or every applicable resource except those listed.
         id: resource_match_mode
         label: Resource matching
@@
           - label: All except listed resources
             value: NotResource
       - add_button_label: Add resource
+        applied_by:
+          - stack
         description: Resource ARNs covered by this statement. Use wildcards only when the AWS service requires them.
         id: resources
         label: Resources
@@
           resource_match_mode: Resource
         type: string_array
       - add_button_label: Add excluded resource
+        applied_by:
+          - stack
         description: Resource ARNs excluded from this statement's match. NotResource can create broad permissions and should be used carefully.
         id: not_resources
         label: Excluded resources (NotResource)
@@
         show_when:
           resource_match_mode: NotResource
         type: string_array
-      - default: []
+      - applied_by:
+          - stack
+        default: []
         description: Optional IAM conditions that further restrict this statement.
         id: conditions
         item_inputs:
-          - default: StringEquals
+          - applied_by:
+              - stack
+            default: StringEquals
             description: IAM condition operator used to compare the condition key and values. Common operators are listed, and custom IAM operators such as ForAnyValue:StringLike can be entered manually.
             id: test
             label: Condition operator
@@
                 value: ArnNotLike
               - label: "Null"
                 value: "Null"
-          - description: IAM context key evaluated by the condition.
+          - applied_by:
+              - stack
+            description: IAM context key evaluated by the condition.
             id: variable
             label: Condition key
             placeholder: aws:ResourceAccount
             required: true
             type: string
           - add_button_label: Add condition value
+            applied_by:
+              - stack
             description: Allowed or matched values for the condition key.
             id: values
             label: Condition values
@@
     show_when:
       policy_document_mode: structured
     type: object_array
-  - description: Complete IAM policy JSON document. This is used instead of structured statements.
+  - applied_by:
+      - stack
+    description: Complete IAM policy JSON document. This is used instead of structured statements.
     id: policy_json
     label: Policy JSON
     patterns:
@@
   - id: section_misc
     label: Misc
     type: section
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: A map of tags to assign to all resources. Default tags are `Owner`, `ProjectGivenId`, `EnvironmentGivenId`, `ModuleGivenId`, `ModuleId`
     id: tags
     label: Tags
@@
   - id: section_advanced
     label: Terraform settings
     type: section
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: Override the environment's default version for this module
     id: opentofu_version
     label: OpenTofu version override
     required: false
     type: string
     values: $values:opentofu/versions
-  - collapsible: true
+  - applied_by:
+      - stack
+    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
+  - applied_by:
+      - stack
+    collapsible: true
     default: {}
     description: Optional raw Terraform variable overrides for advanced module inputs or one-off overrides. Values here override the generated variables above.
     id: advanced_terraform_variables
     label: Advanced Terraform variables
     required: false
     type: object
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: Override the execution environment for Terraform runners. Must use the same AWS account as selected above.
     id: execution_environment_id
     label: Terraform execution environment
@@
   - [IAM managed policies](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.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/ravionhq/modules/tree/rvn-aws-iam-policy@1.0.1/security/iam_policy)
+  - [Source module](https://github.com/ravionhq/modules/tree/rvn-aws-iam-policy@1.0.2/security/iam_policy)
 stack:
   pipelines:
     change:
@@
         base_path: security/iam_policy
         branch: main
         execution_environment_id: << module.input.execution_environment_id >>
-        ref: rvn-aws-iam-policy@1.0.1
+        ref: rvn-aws-iam-policy@1.0.2
         repo: https://github.com/ravionhq/modules
         stack_id: <<stack.id>>
         terraform_variables:

rvn-aws-iam-role 1.0.1 -> 1.0.2

--- remote
+++ compiled
   - id: section_aws
     label: AWS account & region
     type: section
-  - id: aws_account_id
+  - applied_by:
+      - stack
+    id: aws_account_id
     immutable: true
     label: AWS account
     required: true
     type: string
     values: $values:ravion/aws_accounts
-  - id: aws_region
+  - applied_by:
+      - stack
+    id: aws_region
     immutable: true
     label: Region
     required: true
@@
   - id: section_role
     label: IAM role
     type: section
-  - default: <<project.given_id>>-<<environment.given_id>>-<<module.given_id>>
+  - applied_by:
+      - stack
+    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
@@
         pattern: ^[A-Za-z0-9+=,.@_-]{1,64}$
     required: true
     type: string
-  - description: Description stored on the IAM role.
+  - applied_by:
+      - stack
+    description: Description stored on the IAM role.
     id: description
     label: Description
     type: string
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     default: /
     description: IAM path for the role. Most roles should use the root path.
     id: path
@@
         pattern: ^/$|^/.*/$
     required: true
     type: string
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     default: 3600
     description: Maximum STS session duration in seconds for this role.
     id: max_session_duration
@@
     max: 43200
     min: 3600
     type: number
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     default: true
     description: Detach managed policies before destroying the role.
     id: policy_force_detach_enabled
@@
     label: Trust relationships
     type: section
   - add_button_label: Add service principal
+    applied_by:
+      - stack
     default: []
     description: AWS service principals that can assume this role.
     id: trusted_services
@@
     placeholder: ecs-tasks.amazonaws.com
     type: string_array
   - add_button_label: Add AWS principal
+    applied_by:
+      - stack
     default: []
     description: AWS account IDs or IAM ARNs that can assume this role.
     id: trusted_aws_principals
@@
         pattern: ^(\d{12}|arn:aws(-cn|-us-gov)?:iam::.+)$
     placeholder: arn:aws:iam::123456789012:root
     type: string_array
-  - default: []
+  - applied_by:
+      - stack
+    default: []
     description: OIDC identity providers that can assume this role, with STS condition checks.
     id: trusted_oidc_providers
     item_inputs:
-      - description: IAM OIDC provider that issues tokens for this trust relationship.
+      - applied_by:
+          - stack
+        description: IAM OIDC provider that issues tokens for this trust relationship.
         id: provider_arn
         label: OIDC provider ARN
         patterns:
@@
         placeholder: arn:aws:iam::123456789012:oidc-provider/token.actions.githubusercontent.com
         required: true
         type: string
-      - default: []
+      - applied_by:
+          - stack
+        default: []
         description: STS condition checks that restrict which OIDC identities can assume the role.
         id: conditions
         item_inputs:
-          - default: StringEquals
+          - applied_by:
+              - stack
+            default: StringEquals
             description: IAM condition operator used to compare the condition key and values. Common operators are listed, and custom IAM operators such as ForAnyValue:StringLike can be entered manually.
             id: test
             label: Condition operator
@@
                 value: ArnNotLike
               - label: "Null"
                 value: "Null"
-          - description: IAM context key evaluated by the condition.
+          - applied_by:
+              - stack
+            description: IAM context key evaluated by the condition.
             id: variable
             label: Condition key
             placeholder: token.actions.githubusercontent.com:sub
             required: true
             type: string
           - add_button_label: Add condition value
+            applied_by:
+              - stack
             description: Allowed or matched values for the condition key.
             id: values
             label: Condition values
@@
     required: false
     type: object_array
   - add_button_label: Add SAML provider
+    applied_by:
+      - stack
     default: []
     description: SAML provider ARNs that can assume this role.
     id: trusted_saml_providers
@@
         pattern: ^arn:aws(-cn|-us-gov)?:iam::\d{12}:saml-provider/.+$
     placeholder: arn:aws:iam::123456789012:saml-provider/MySAMLProvider
     type: string_array
-  - default: []
+  - applied_by:
+      - stack
+    default: []
     description: STS condition checks added to every generated trust policy statement.
     id: assume_role_conditions
     item_inputs:
-      - default: Bool
+      - applied_by:
+          - stack
+        default: Bool
         description: IAM condition operator used to compare the condition key and values. Common operators are listed, and custom IAM operators such as ForAnyValue:StringLike can be entered manually.
         id: test
         label: Condition operator
@@
             value: ArnNotLike
           - label: "Null"
             value: "Null"
-      - description: IAM context key evaluated by the condition.
+      - applied_by:
+          - stack
+        description: IAM context key evaluated by the condition.
         id: variable
         label: Condition key
         placeholder: aws:MultiFactorAuthPresent
         required: true
         type: string
       - add_button_label: Add condition value
+        applied_by:
+          - stack
         description: Allowed or matched values for the condition key.
         id: values
         label: Condition values
@@
     label: Shared trust conditions
     required: false
     type: object_array
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: Optional complete assume role policy JSON. When set, this overrides all trust relationship inputs above.
     id: custom_assume_role_policy
     label: Custom assume role policy JSON
@@
     label: Permission policies
     type: section
   - add_button_label: Add managed policy ARN
+    applied_by:
+      - stack
     default: []
     description: AWS managed or customer managed policy ARNs to attach to the role.
     id: managed_policy_arns
@@
         pattern: ^arn:aws(-cn|-us-gov)?:iam::(aws|\d{12}):policy/.+$
     placeholder: arn:aws:iam::aws:policy/ReadOnlyAccess
     type: string_array
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     default: {}
     description: Map of inline policy names to JSON policy documents.
     id: inline_policies
     label: Inline JSON policies
     placeholder: "s3-read: '{\"Version\":\"2012-10-17\",\"Statement\":[{\"Effect\":\"Allow\",\"Action\":[\"s3:GetObject\"],\"Resource\":[\"arn:aws:s3:::my-bucket/*\"]}]}'"
     type: object
-  - default: []
+  - applied_by:
+      - stack
+    default: []
     description: Structured IAM statements combined into one inline policy.
     id: inline_policy_statements
     item_inputs:
-      - description: Optional IAM statement ID.
+      - applied_by:
+          - stack
+        description: Optional IAM statement ID.
         id: sid
         label: SID
         required: false
         type: string
-      - default: Allow
+      - applied_by:
+          - stack
+        default: Allow
         description: Whether this statement allows or denies the listed actions.
         id: effect
         label: Effect
@@
           - label: Deny
             value: Deny
       - add_button_label: Add action
+        applied_by:
+          - stack
         description: IAM actions for this statement.
         id: actions
         label: Actions
@@
         required: true
         type: string_array
       - add_button_label: Add resource
+        applied_by:
+          - stack
         description: Resource ARNs covered by this statement.
         id: resources
         label: Resources
         placeholder: arn:aws:s3:::my-bucket/*
         required: true
         type: string_array
-      - default: []
+      - applied_by:
+          - stack
+        default: []
         description: Optional IAM conditions for this statement.
         id: conditions
         item_inputs:
-          - default: StringEquals
+          - applied_by:
+              - stack
+            default: StringEquals
             description: IAM condition operator used to compare the condition key and values. Common operators are listed, and custom IAM operators such as ForAnyValue:StringLike can be entered manually.
             id: test
             label: Condition operator
@@
                 value: ArnNotLike
               - label: "Null"
                 value: "Null"
-          - description: IAM context key evaluated by the condition.
+          - applied_by:
+              - stack
+            description: IAM context key evaluated by the condition.
             id: variable
             label: Condition key
             required: true
             type: string
           - add_button_label: Add condition value
+            applied_by:
+              - stack
             description: Allowed or matched values for the condition key.
             id: values
             label: Condition values
@@
     label: Inline policy statements
     required: false
     type: object_array
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: Optional permissions boundary policy ARN for the role.
     id: permission_boundary_arn
     label: Permission boundary ARN
@@
   - id: section_instance_profile
     label: Instance profile
     type: section
-  - default: false
+  - applied_by:
+      - stack
+    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.
+  - applied_by:
+      - stack
+    description: Instance profile name. Defaults to the role name when empty.
     id: instance_profile_name
     immutable: true
     label: Instance profile name
@@
     show_when:
       instance_profile_creation_enabled: true
     type: string
-  - description: IAM path for the instance profile. Defaults to the role path when empty.
+  - applied_by:
+      - stack
+    description: IAM path for the instance profile. Defaults to the role path when empty.
     id: instance_profile_path
     immutable: true
     label: Instance profile path
@@
   - id: section_misc
     label: Misc
     type: section
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: A map of tags to assign to all resources. Default tags are `Owner`, `ProjectGivenId`, `EnvironmentGivenId`, `ModuleGivenId`, `ModuleId`
     id: tags
     label: Tags
@@
   - id: section_advanced
     label: Terraform settings
     type: section
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: Override the environment's default version for this module
     id: opentofu_version
     label: OpenTofu version override
     required: false
     type: string
     values: $values:opentofu/versions
-  - collapsible: true
+  - applied_by:
+      - stack
+    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
+  - applied_by:
+  
... diff truncated ...

rvn-aws-network 1.0.1 -> 1.0.2

--- remote
+++ compiled
   - id: section_aws
     label: AWS account & region
     type: section
-  - id: aws_account_id
+  - applied_by:
+      - stack
+    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.
+  - applied_by:
+      - stack
+    description: Recommend anything but us-east-1 as it has the most outages.
     id: aws_region
     immutable: true
     label: Region
@@
   - id: section_vpc
     label: VPC config
     type: section
-  - default: <<project.given_id>>-<<environment.given_id>>
+  - applied_by:
+      - stack
+    default: <<project.given_id>>-<<environment.given_id>>
     description: Name prefix for all resources created by this module.
     id: name
     immutable: true
@@
         pattern: ^[a-z0-9]([a-z0-9-]{0,34}[a-z0-9])?$
     required: true
     type: string
-  - default: 10.0.0.0/16
+  - applied_by:
+      - stack
+    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
+  - applied_by:
+      - stack
+    collapsible: true
     description: Leave empty to create up to 3 public/private subnet pairs, capped by the availability zones available in the selected region and AWS account.
     id: subnet_count
     label: Subnet pairs
@@
   - id: section_nat
     label: NAT gateway
     type: section
-  - default: true
+  - applied_by:
+      - stack
+    default: true
     description: Needed if you want to access the internet from within private subnets
     id: nat_gateway_enabled
     label: NAT gateway
     type: boolean
-  - default: false
+  - applied_by:
+      - stack
+    default: false
     description: High availability adds NAT Gateway to every AZ. Otherwise single NAT gateway serves all AZs.
     id: nat_gateway_high_availability_enabled
     label: NAT gateway high availability
     type: boolean
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     default: null
     description: |-
       A list of pre-allocated Elastic IP allocation IDs (for example from the
@@
   - id: section_soc2
     label: SOC 2
     type: section
-  - default: false
+  - applied_by:
+      - stack
+    default: false
     description: Enable VPC Flow Logs for network traffic monitoring. Required for SOC 2.
     id: flow_logs_enabled
     label: Flow logs
@@
   - id: section_misc
     label: Misc
     type: section
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: A map of tags to assign to all resources. Default tags are `Owner`, `ProjectGivenId`, `EnvironmentGivenId`, `ModuleGivenId`, `ModuleId`
     id: tags
     label: Tags
@@
   - id: section_peering
     label: VPC peering
     type: section
-  - description: |
+  - applied_by:
+      - stack
+    description: |
       Connect this VPC to other VPCs
 
       NOTE: For cross-account or cross-region peerings, this module cannot manage the
@@
       return routes pointing at the peering connection.
     id: vpc_peering_connections
     item_inputs:
-      - description: The ID of the existing VPC to peer with.
+      - applied_by:
+          - stack
+        description: The ID of the existing VPC to peer with.
         id: peer_vpc_id
         label: Peer VPC ID
         required: true
         type: string
-      - description: CIDR blocks of the peer VPC. Routes will be added in this VPC's route tables for each CIDR pointing at the peering connection.
+      - applied_by:
+          - stack
+        description: CIDR blocks of the peer VPC. Routes will be added in this VPC's route tables for each CIDR pointing at the peering connection.
         id: peer_cidr_blocks
         label: Peer CIDR blocks
         required: true
         type: string_array
-      - description: AWS account ID that owns the peer VPC. Defaults to the current account. Required for cross-account peering.
+      - applied_by:
+          - stack
+        description: AWS account ID that owns the peer VPC. Defaults to the current account. Required for cross-account peering.
         id: peer_owner_id
         label: Peer AWS account ID number
         required: false
         type: string
-      - description: AWS region of the peer VPC. Defaults to the current region. Required for cross-region peering.
+      - applied_by:
+          - stack
+        description: AWS region of the peer VPC. Defaults to the current region. Required for cross-region peering.
         id: peer_region
         label: Peer region
         required: false
         type: string
         values: $values:aws/regions
-      - collapsible: true
+      - applied_by:
+          - stack
+        collapsible: true
         default: false
         description: Allow DNS resolution of private hostnames in the peer VPC from this VPC. Only valid for same-account, same-region peerings.
         id: remote_vpc_dns_resolution_enabled
         label: Remote VPC DNS resolution
         type: boolean
-      - collapsible: true
+      - applied_by:
+          - stack
+        collapsible: true
         default: true
         description: Add routes for peer_cidr_blocks to this VPC's public route table.
         id: public_route_table_routes_enabled
         label: Public route table routes
         type: boolean
-      - collapsible: true
+      - applied_by:
+          - stack
+        collapsible: true
         default: true
         description: Add routes for peer_cidr_blocks to this VPC's private route table(s).
         id: private_route_table_routes_enabled
         label: Private route table routes
         type: boolean
-      - collapsible: true
+      - applied_by:
+          - stack
+        collapsible: true
         description: Optional list of route table IDs in the peer VPC to add return routes to (destination = this VPC's CIDR, target = the peering connection). Only supported for same-account, same-region peerings, since the AWS provider used by this module must have access to the peer's route tables. For cross-account or cross-region peerings, manage the return routes from the peer side instead.
         id: peer_route_table_ids
         label: Peer route table IDs
@@
   - id: section_advanced
     label: Terraform settings
     type: section
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: Override the environment's default version for this module
     id: opentofu_version
     label: OpenTofu version override
     required: false
     type: string
     values: $values:opentofu/versions
-  - collapsible: true
+  - applied_by:
+      - stack
+    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
+  - applied_by:
+      - stack
+    collapsible: true
     default: {}
     description: Optional raw Terraform variable overrides for advanced module inputs or one-off overrides. Values here override the generated variables above.
     id: advanced_terraform_variables
     label: Advanced Terraform variables
     required: false
     type: object
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: Override the VPC, subnet, and security group for Terraform runners. Must use the same AWS account as selected above.
     id: execution_environment_id
     label: Terraform execution environment
@@
   - **VPC Flow Logs** for network traffic monitoring and SOC 2 compliance
   - **VPC Peering** to connect with existing VPCs across accounts or regions
 
-   Terraform source: [ravionhq/modules/networking/vpc](https://github.com/ravionhq/modules/tree/rvn-aws-network@1.0.1/networking/vpc)
+   Terraform source: [ravionhq/modules/networking/vpc](https://github.com/ravionhq/modules/tree/rvn-aws-network@1.0.2/networking/vpc)
 
   ## Use cases
 
@@
         base_path: networking/vpc
         branch: main
         execution_environment_id: << module.input.execution_environment_id >>
-        ref: rvn-aws-network@1.0.1
+        ref: rvn-aws-network@1.0.2
         repo: https://github.com/ravionhq/modules
         stack_id: <<stack.id>>
         terraform_variables:

rvn-aws-static 1.1.1 -> 1.1.2

--- remote
+++ compiled
   - id: section_aws
     label: AWS account & region
     type: section
-  - id: aws_account_id
+  - applied_by:
+      - stack
+      - build
+      - deploy
+    id: aws_account_id
     immutable: true
     label: AWS account
     required: true
     type: string
     values: $values:ravion/aws_accounts
-  - default: us-east-1
+  - applied_by:
+      - stack
+      - build
+      - deploy
+    default: us-east-1
     description: Region for the S3 bucket. CloudFront and KVS always use us-east-1.
     id: aws_region
     immutable: true
@@
   - id: section_hosting
     label: Static hosting
     type: section
-  - default: <<project.given_id>>-<<environment.given_id>>-<<module.given_id>>
+  - applied_by:
+      - stack
+    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
@@
         pattern: ^[a-z0-9][a-z0-9.-]*[a-z0-9]$
     required: true
     type: string
-  - default: spa
+  - applied_by:
+      - stack
+    default: spa
     description: Use single page app for client-side routers, or Filesystem for static file trees where paths map to index files.
     id: routing
     label: Routing mode
@@
       - description: Each path has its own file
         label: Filesystem
         value: filesystem
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     default: index.html
     description: Object name resolved when a viewer requests the distribution root.
     id: default_root_object
     label: Default root object
     type: string
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     default: main
     description: Fallback version prefix and initial active KVS value.
     id: default_version
@@
   - id: section_build
     label: Build config
     type: section
-  - default: railpack
+  - applied_by:
+      - build
+      - deploy
+    default: railpack
     id: build_source
     label: Build source
     required: true
@@
       - description: Skip the build step and promote a directory you upload to the hosting S3 bucket yourself.
         label: Manual upload to S3
         value: s3_directory
-  - description: Repository containing the application source for Dockerfile or Railpack builds.
+  - applied_by:
+      - build
+      - deploy
+    description: Repository containing the application source for Dockerfile or Railpack builds.
     id: source_repo
     label: Git repository
     required: true
@@
         - railpack
         - nixpacks
     type: gitrepo
-  - default: .
+  - applied_by:
+      - build
+      - deploy
+    default: .
     description: Repository-relative source and build root.
     id: source_base_path
     label: Source base path
@@
         - railpack
         - nixpacks
     type: string
-  - default: dist
+  - applied_by:
+      - build
+      - deploy
+    default: dist
     description: Directory produced by the build and uploaded to S3.
     id: output_directory
     label: Output directory
@@
     show_when:
       build_source: dockerfile
     type: section
-  - description: Path to the Dockerfile to use for the build, relative to the repository root or configured source base path.
+  - applied_by:
+      - build
+      - deploy
+    description: Path to the Dockerfile to use for the build, relative to the repository root or configured source base path.
     id: dockerfile
     label: Dockerfile path
     placeholder: Dockerfile
     show_when:
       build_source: dockerfile
     type: string
-  - description: Directory to use as the Docker build context, relative to the repository root or configured source base path.
+  - applied_by:
+      - build
+      - deploy
+    description: Directory to use as the Docker build context, relative to the repository root or configured source base path.
     id: dockerfile_context
     label: Docker build context path
     placeholder: .
@@
         - railpack
         - nixpacks
     type: section
-  - collapsible: true
+  - applied_by:
+      - build
+      - deploy
+    collapsible: true
     description: Optional Railpack version to use for the build. Leave blank to use the Ravion default.
     id: railpack_version
     label: Railpack version
@@
         - railpack
         - nixpacks
     type: string
-  - description: Optional dependency installation command. Leave blank to use Railpack detection.
+  - applied_by:
+      - build
+      - deploy
+    description: Optional dependency installation command. Leave blank to use Railpack detection.
     id: railpack_install_cmd
     label: Install command
     placeholder: Railpack default
@@
         - railpack
         - nixpacks
     type: string
-  - description: Optional application build command. Leave blank to use Railpack detection.
+  - applied_by:
+      - build
+      - deploy
+    description: Optional application build command. Leave blank to use Railpack detection.
     id: railpack_build_cmd
     label: Build command
     placeholder: Railpack default
@@
         - railpack
         - nixpacks
     type: string
-  - description: Environment variables available during builds. Values can be plain strings or references loaded from Parameter Store or Secrets Manager.
+  - applied_by:
+      - build
+      - deploy
+    description: Environment variables available during builds. Values can be plain strings or references loaded from Parameter Store or Secrets Manager.
     id: build_environment_variables
     label: Build environment variables
     placeholder: |-
@@
         - railpack
         - nixpacks
     type: object
-  - default: false
+  - applied_by:
+      - build
+      - deploy
+    default: false
     description: Pass build environment variables into Dockerfile builds as build arguments.
     id: dockerfile_inject_env_variables
     label: Inject environment variables in Dockerfile
@@
   - id: section_cloudfront
     label: CloudFront settings
     type: section
-  - description: Required if using domain aliases. The certificate module must be in us-east-1.
+  - applied_by:
+      - stack
+    description: Required if using domain aliases. The certificate module must be in us-east-1.
     id: distribution_acm_certificate
     label: ACM certificate
     mapped_inputs:
-      - default: <<ref.stack.output.certificate_arn>>
+      - applied_by:
+          - stack
+        default: <<ref.stack.output.certificate_arn>>
         id: distribution_acm_certificate_arn
         label: CloudFront certificate ARN
         type: string
     required: false
     type: $ref:rvn-acm-certificate
   - add_button_label: Add domain alias
+    applied_by:
+      - stack
     default: []
     description: Custom domain names like app.example.com. Leave empty to use the default cloudfront.net domain.
     id: distribution_aliases
     label: Domain aliases
     type: string_array
-  - default: PriceClass_All
+  - applied_by:
+      - stack
+    default: PriceClass_All
     description: You can reduce edge locations for some cost savings if it becomes an issue.
     id: price_class
     label: Price class
@@
         value: PriceClass_200
       - label: US, Canada, Europe
         value: PriceClass_100
-  - default: none
+  - applied_by:
+      - stack
+    default: none
     id: geo_restriction_type
     label: Geo restriction
     type: string
@@
         value: whitelist
       - label: Blacklist
         value: blacklist
-  - default: []
+  - applied_by:
+      - stack
+    default: []
     id: geo_restriction_locations
     label: Geo restriction country codes
     show_when:
@@
         - whitelist
         - blacklist
     type: string_array
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: Optional WAFv2 web ACL to associate with the distribution. Must be a global (CloudFront) web ACL.
     id: web_acl_id
     label: WAF web ACL ARN
     placeholder: arn:aws:wafv2:us-east-1:123456789012:global/webacl/name/abc-123
     required: false
     type: string
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     default: false
     description: Add a CloudFront Origin Shield caching layer in front of the S3 bucket to improve cache hit ratio and reduce S3 load for high-traffic sites. The Origin Shield region is chosen automatically based on the bucket region.
     id: origin_shield_enabled
@@
   - id: section_cache_headers
     label: Cache and headers
     type: section
-  - default: true
+  - applied_by:
+      - stack
+    default: true
     description: Attach a CloudFront Function that sets Cache-Control headers for HTML and asset responses.
     id: cache_control_enabled
     label: Manage Cache-Control headers
     type: boolean
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     default: null
     description: Cache-Control header for HTML responses, routes without file extensions, dotted paths, and configured HTML path overrides. Steers browser caching only. Defaults to public, max-age=0, must-revalidate so browsers pick up new deploys on the next navigation.
     id: html_cache_control
@@
     show_when:
       cache_control_enabled: true
     type: string
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: Cache-Control header for versioned static assets such as JavaScript, CSS, images, and fonts. Defaults to public, max-age=31536000, immutable
     id: assets_cache_control
     label: Asset Cache-Control
@@
       cache_control_enabled: true
     type: string
   - add_button_label: Add path override
+    applied_by:
+      - stack
     collapsible: true
     description: Exact viewer paths that should receive the HTML Cache-Control header even when they have a file extension.
     id: html_path_overrides
@@
     show_when:
       cache_control_enabled: true
     type: string_array
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     default:
       - security_headers
     description: AWS managed response header sets applied when no custom response headers policy is configured. Selections combine into a single AWS managed policy.
@@
       - description: Allow CORS requests from any origin, including OPTIONS preflight.
         label: CORS with preflight
         value: cors_preflight
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: Optional externally managed CloudFront response headers policy ID for security headers, CORS, or custom headers. Replaces the default security headers policy.
     id: response_headers_policy_id
     label: Response headers policy ID
     required: false
     type: string
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: Optional module-managed CloudFront response headers policy for security headers, CORS, custom headers, and removed headers.
     id: response_headers_policy
     label: Managed response headers policy
     required: false
     type: object
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: CloudFront cache policy ID for the default behavior. By default the module manages a policy that caches at the edge for up to a year, which is safe because every deploy changes the cache key.
     id: cache_policy_id
     label: Cache policy ID
     type: string
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: CloudFront origin request policy ID. Defaults to AWS managed CORS-S3Origin.
     id: origin_request_policy_id
     label: Origin request policy ID
     type: string
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     default: []
     description: Path patterns that should bypass CloudFront caching. Versioned deploys usually do not need this.
     id: no_cache_paths
@@
   - id: 
... diff truncated ...

rvn-cloudfront 1.2.2 -> 1.2.3

--- remote
+++ compiled
   - id: section_aws
     label: AWS account & region
     type: section
-  - id: aws_account_id
+  - applied_by:
+      - stack
+    id: aws_account_id
     immutable: true
     label: AWS account
     required: true
     type: string
     values: $values:ravion/aws_accounts
-  - default: us-east-1
+  - applied_by:
+      - stack
+    default: us-east-1
     description: CloudFront is global. Access logs go to CloudWatch Logs in us-east-1 by default; this region is used for the optional S3 logging bucket.
     id: aws_region
     immutable: true
@@
   - id: section_distribution
     label: Distribution
     type: section
-  - default: <<project.given_id>>-<<environment.given_id>>-<<module.given_id>>
+  - applied_by:
+      - stack
+    default: <<project.given_id>>-<<environment.given_id>>-<<module.given_id>>
     description: Name prefix for the distribution comment, origin access control, and logging bucket.
     id: name
     immutable: true
@@
     required: true
     type: string
   - add_button_label: Add domain alias
+    applied_by:
+      - stack
     default: []
     description: Custom domain names like app.example.com. Leave empty to use the default cloudfront.net domain. Aliases must match the domain host rules on the origin load balancer when it routes by host.
     id: distribution_aliases
     label: Domain aliases
     type: string_array
-  - description: Certificate for the domain aliases. Required when aliases are set. CloudFront requires the certificate to be issued in us-east-1.
+  - applied_by:
+      - stack
+    description: Certificate for the domain aliases. Required when aliases are set. CloudFront requires the certificate to be issued in us-east-1.
     id: certificate
     label: ACM certificate
     mapped_inputs:
-      - default: <<ref.stack.output.certificate_arn>>
+      - applied_by:
+          - stack
+        default: <<ref.stack.output.certificate_arn>>
         description: Certificate ARN from the selected ACM certificate module. Must be in us-east-1.
         id: acm_certificate_arn
         label: ACM certificate ARN
@@
     id: section_origin
     label: Origin
     type: section
-  - default: ecs_web_service
+  - applied_by:
+      - stack
+    default: ecs_web_service
     description: Choose an existing ECS module, standalone ALB module, private S3 bucket, or custom origin domain name.
     id: origin_source
     label: Origin source
@@
       - description: Enter any origin domain name, such as a load balancer, API endpoint, or S3 website endpoint.
         label: Custom domain
         value: custom
-  - description: ECS web service whose load balancer becomes the origin. The service must be on rvn-ecs-web 0.8.0 or later so its stack exposes the load balancer DNS name.
+  - applied_by:
+      - stack
+    description: ECS web service whose load balancer becomes the origin. The service must be on rvn-ecs-web 0.8.0 or later so its stack exposes the load balancer DNS name.
     id: ecs_web_service
     label: ECS web service
     mapped_inputs:
-      - default: <<ref.stack.output.load_balancer_dns_name>>
+      - applied_by:
+          - stack
+        default: <<ref.stack.output.load_balancer_dns_name>>
         description: Load balancer DNS name from the selected ECS web service, used as the origin domain. If this is empty, update the service to rvn-ecs-web 0.8.0 or later and apply its stack, then re-select the service.
         id: ecs_web_alb_dns_name
         label: Service load balancer DNS name
         required: true
         type: string
-      - default: <<ref.stack.output.load_balancer_arn>>
+      - applied_by:
+          - stack
+        default: <<ref.stack.output.load_balancer_arn>>
         description: Load balancer ARN from the selected ECS web service, used to create the CloudFront VPC origin when private origin is enabled. If this is empty, update the service to rvn-ecs-web 0.8.0 or later and apply its stack, then re-select the service.
         id: ecs_web_alb_arn
         label: Service load balancer ARN
@@
     show_when:
       origin_source: ecs_web_service
     type: $ref:rvn-ecs-web
-  - description: Existing standalone ALB whose DNS name becomes the origin. The ALB must be internal when private origin is enabled.
+  - applied_by:
+      - stack
+    description: Existing standalone ALB whose DNS name becomes the origin. The ALB must be internal when private origin is enabled.
     id: alb
     label: Application Load Balancer
     mapped_inputs:
-      - default: <<ref.stack.output.alb_dns_name>>
+      - applied_by:
+          - stack
+        default: <<ref.stack.output.alb_dns_name>>
         description: DNS name from the selected standalone ALB module, used as the origin domain.
         id: alb_dns_name
         label: ALB DNS name
         required: true
         type: string
-      - default: <<ref.stack.output.alb_arn>>
+      - applied_by:
+          - stack
+        default: <<ref.stack.output.alb_arn>>
         description: ARN from the selected standalone ALB module, used to create the CloudFront VPC origin when private origin is enabled.
         id: alb_arn
         label: ALB ARN
@@
     show_when:
       origin_source: alb
     type: $ref:rvn-aws-alb
-  - default: false
+  - applied_by:
+      - stack
+    default: false
     description: Connect to the ECS web service's load balancer or standalone ALB through a CloudFront VPC origin instead of over the public internet. Use when the load balancer is internal.
     id: origin_vpc_enabled
     label: Private origin (VPC origin)
@@
         - ecs_web_service
         - alb
     type: boolean
-  - description: Host name CloudFront uses as the origin domain and Host header. With HTTPS to the origin, it must be covered by the load balancer's TLS certificate and match the ECS service's or standalone ALB's host-based listener rule. No public DNS record is required.
+  - applied_by:
+      - stack
+    description: Host name CloudFront uses as the origin domain and Host header. With HTTPS to the origin, it must be covered by the load balancer's TLS certificate and match the ECS service's or standalone ALB's host-based listener rule. No public DNS record is required.
     id: origin_vpc_domain_name
     label: VPC origin domain name
     placeholder: my-service.private.example.com
@@
     show_when:
       origin_vpc_enabled: true
     type: string
-  - description: ECS cluster whose public ALB becomes the origin. Listener rules on the ALB keep routing requests to the right services.
+  - applied_by:
+      - stack
+    description: ECS cluster whose public ALB becomes the origin. Listener rules on the ALB keep routing requests to the right services.
     id: ecs_cluster
     label: ECS cluster
     mapped_inputs:
-      - default: <<ref.stack.output.public_alb_dns_name>>
+      - applied_by:
+          - stack
+        default: <<ref.stack.output.public_alb_dns_name>>
         description: Public ALB DNS name from the selected ECS cluster, used as the origin domain. If this is empty, the selected cluster has no public ALB or has not applied its stack.
         id: ecs_cluster_alb_dns_name
         label: Cluster public ALB DNS name
@@
     show_when:
       origin_source: ecs_cluster
     type: $ref:rvn-ecs-cluster
-  - description: Domain name CloudFront connects to for the primary origin.
+  - applied_by:
+      - stack
+    description: Domain name CloudFront connects to for the primary origin.
     id: origin_domain_name
     label: Origin domain name
     placeholder: my-alb-1234567890.us-east-1.elb.amazonaws.com
@@
     show_when:
       origin_source: custom
     type: string
-  - description: Private S3 bucket to serve through CloudFront Origin Access Control. After this CloudFront stack applies, add its distribution ARN to the S3 bucket's CloudFront OAC read policy template.
+  - applied_by:
+      - stack
+    description: Private S3 bucket to serve through CloudFront Origin Access Control. After this CloudFront stack applies, add its distribution ARN to the S3 bucket's CloudFront OAC read policy template.
     id: s3_bucket
     label: S3 bucket
     mapped_inputs:
-      - default: <<ref.stack.output.bucket_regional_domain_name>>
+      - applied_by:
+          - stack
+        default: <<ref.stack.output.bucket_regional_domain_name>>
         description: Regional S3 bucket domain name from the selected S3 bucket module.
         id: s3_bucket_regional_domain_name
         label: S3 bucket regional domain name
@@
     show_when:
       origin_source: s3_bucket
     type: $ref:rvn-s3
-  - default: https-only
+  - applied_by:
+      - stack
+    default: https-only
     description: How CloudFront connects to the origin. HTTPS only requires the origin load balancer to serve a certificate valid for the forwarded host.
     id: origin_protocol_policy
     label: Origin protocol policy
@@
         value: http-only
       - label: Match viewer
         value: match-viewer
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     default: []
     description: Headers CloudFront adds to every request sent to the primary origin. Use them for origin authentication or routing.
     id: origin_custom_headers
     item_inputs:
-      - id: name
+      - applied_by:
+          - stack
+        id: name
         label: Header name
         placeholder: X-Origin-Auth
         required: true
         type: string
-      - id: value
+      - applied_by:
+          - stack
+        id: value
         label: Header value
         required: true
         type: string
@@
         - alb
         - custom
     type: object_array
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     default: []
     description: Optional extra origins that custom cache behaviors can route paths to. Each origin needs a unique ID.
     id: additional_origins
     item_description: "{domain_name}"
     item_inputs:
-      - description: Unique identifier referenced by cache behaviors. The primary origin uses the ID primary.
+      - applied_by:
+          - stack
+        description: Unique identifier referenced by cache behaviors. The primary origin uses the ID primary.
         id: origin_id
         label: Origin ID
         required: true
         type: string
-      - id: domain_name
+      - applied_by:
+          - stack
+        id: domain_name
         label: Domain name
         placeholder: assets.example.com
         required: true
         type: string
-      - description: Optional path prefix CloudFront adds to requests sent to this origin.
+      - applied_by:
+          - stack
+        description: Optional path prefix CloudFront adds to requests sent to this origin.
         id: origin_path
         label: Origin path
         placeholder: /base-path
         required: false
         type: string
-      - default: https-only
+      - applied_by:
+          - stack
+        default: https-only
         id: origin_protocol_policy
         label: Origin protocol policy
         required: true
@@
             value: http-only
           - label: Match viewer
             value: match-viewer
-      - collapsible: true
+      - applied_by:
+          - stack
+        collapsible: true
         default: []
         description: Headers CloudFront adds to every request sent to this origin.
         id: custom_headers
         item_inputs:
-          - id: name
+          - applied_by:
+              - stack
+            id: name
             label: Header name
             placeholder: X-Origin-Auth
             required: true
             type: string
-          - id: value
+          - applied_by:
+              - stack
+            id: value
             label: Header value
             required: true
             type: string
@@
     id: section_edge_redirects
     label: Edge redirects
     type: section
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible:
... diff truncated ...

rvn-ec2-service 1.4.0 -> 1.3.1

--- remote
+++ compiled
   timeout: 86400
   type: aws:ec2
 inputs:
-  - description: Existing Ravion network that supplies the AWS account, region, VPC, and public and private subnets for the instances.
+  - applied_by:
+      - stack
+      - build
+      - deploy
+    description: Existing Ravion network that supplies the AWS account, region, VPC, and public and private subnets for the instances.
     id: network
     immutable: true
     label: VPC network
     mapped_inputs:
-      - id: section_aws
+      - applied_by: []
+        id: section_aws
         label: AWS account & region
         type: section
-      - default: << ref.input.aws_account_id >>
+      - applied_by:
+          - stack
+          - build
+          - deploy
+        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 >>
+      - applied_by:
+          - stack
+          - build
+          - deploy
+        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
-      - collapsible: true
+      - applied_by:
+          - stack
+          - build
+          - deploy
+        collapsible: true
         default: << ref.input.execution_environment_id >>
         description: Override the VPC, subnet, and security group for Terraform runners. Must use the same AWS account as selected above.
         id: execution_environment_id
         label: Terraform execution environment
         type: string
         values: $values:ravion/execution_environments
-      - id: section_vpc
+      - applied_by: []
+        id: section_vpc
         label: VPC
         type: section
-      - default: <<ref.stack.output.vpc_id>>
+      - applied_by:
+          - stack
+        default: <<ref.stack.output.vpc_id>>
         id: vpc_id
         immutable: true
         label: VPC ID
         required: true
         type: string
       - add_button_label: Add private subnet ID
+        applied_by:
+          - stack
         default: <<ref.stack.output.private_subnet_ids>>
         description: Required by Terraform. Used for private workloads and private load balancers.
         id: private_subnet_ids
@@
         required: true
         type: string_array
       - add_button_label: Add public subnet ID
+        applied_by:
+          - stack
         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
@@
         type: string_array
     required: true
     type: $ref:rvn-aws-network
-  - default: true
+  - applied_by:
+      - stack
+    default: true
     description: Recommended. Requires a NAT gateway or equivalent for internet access and a static IP.
     id: private_subnet_placement_enabled
     label: Run in private subnets
@@
   - id: section_service
     label: EC2 service
     type: section
-  - default: <<project.given_id>>-<<environment.given_id>>-<<module.given_id>>
+  - applied_by:
+      - stack
+    default: <<project.given_id>>-<<environment.given_id>>-<<module.given_id>>
     description: Name for the instance group and related resources.
     id: name
     immutable: true
@@
         pattern: ^[a-z0-9]([a-z0-9-]{0,26}[a-z0-9])?$
     required: true
     type: string
-  - id: instance_type
+  - applied_by:
+      - stack
+    id: instance_type
     label: Instance type
     no_options_message: Select a VPC Network, or enter an AWS account and region, to load available EC2 instance types.
     required: true
     type: string
     values: $values:aws/ec2/instances?awsAccountId=<<module.input.aws_account_id>>&region=<<module.input.aws_region>>
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: Custom AMI for new instances. Leave blank for the latest architecture-matched Amazon Linux 2023 AMI.
     id: ami_id
     label: Custom AMI ID
     placeholder: ami-...
     required: false
     type: string
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: Optional EC2 key pair for SSH access.
     id: key_name
     label: SSH key pair name
     required: false
     type: string
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: Shell script run as root after Ravion's bootstrap on every newly launched instance.
     id: additional_user_data
     label: Additional user data
     required: false
     type: text
-  - default: true
+  - applied_by:
+      - stack
+    default: true
     description: Off for a worker. On to serve HTTP traffic through a load balancer.
     id: http_traffic_enabled
     label: Serve HTTP traffic
     type: boolean
-  - default: container
+  - applied_by:
+      - stack
+      - build
+      - deploy
+    default: container
     description: Choose in-place container image deploys or host-level shell commands.
     id: deploy_type
     label: Deploy type
@@
     show_when:
       deploy_type: container
     type: section
-  - default: dockerfile
+  - applied_by:
+      - stack
+      - build
+      - deploy
+    default: dockerfile
     description: Build a container image from source with Dockerfile or Railpack, or deploy an existing image from a configured registry repository.
     id: build_source
     label: Build source
@@
       - description: Deploy an image from a registry configured on this module. Provide only the tag or digest at deploy time.
         label: Pull from image registry
         value: image_registry
-  - description: Repository containing the application source for Dockerfile or Railpack builds.
+  - applied_by:
+      - build
+      - deploy
+    description: Repository containing the application source for Dockerfile or Railpack builds.
     id: source_repo
     label: Git repository
     required: true
@@
         - railpack
       deploy_type: container
     type: gitrepo
-  - default: .
+  - applied_by:
+      - build
+      - deploy
+    default: .
     description: Repository-relative source and build root.
     id: source_base_path
     label: Source base path
@@
         - railpack
       deploy_type: container
     type: string
-  - description: Repository without a tag or digest, such as `nginx` or `123456789012.dkr.ecr.us-east-1.amazonaws.com/app`. Registries requiring Docker credentials are unsupported. Same-region private ECR also needs a repository policy that lets the service instance role pull images.
+  - applied_by:
+      - deploy
+    description: Repository without a tag or digest, such as `nginx` or `123456789012.dkr.ecr.us-east-1.amazonaws.com/app`. Registries requiring Docker credentials are unsupported. Same-region private ECR also needs a repository policy that lets the service instance role pull images.
     id: image_repository
     label: Image repository
     placeholder: nginx
@@
       build_source: image_registry
       deploy_type: container
     type: string
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: Optional command string that overrides the image CMD. The image ENTRYPOINT is preserved.
     id: container_start_command
     label: Start command override
@@
     show_when:
       deploy_type: container
     type: string
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     default: false
     description: "Mount the host Docker socket into the container and add the host docker group's GID. This grants the container root-equivalent control of the instance: it can start privileged containers, read the host filesystem, and use the instance role. The container image must include a docker CLI for this to be useful."
     id: docker_socket_mount_enabled
@@
       build_source: dockerfile
       deploy_type: container
     type: section
-  - description: Path to the Dockerfile to use for the build, relative to the repository root or configured source base path.
+  - applied_by:
+      - build
+      - deploy
+    description: Path to the Dockerfile to use for the build, relative to the repository root or configured source base path.
     id: dockerfile
     label: Dockerfile path
     placeholder: Dockerfile
@@
       build_source: dockerfile
       deploy_type: container
     type: string
-  - description: Directory to use as the Docker build context, relative to the repository root or configured source base path.
+  - applied_by:
+      - build
+      - deploy
+    description: Directory to use as the Docker build context, relative to the repository root or configured source base path.
     id: dockerfile_context
     label: Docker build context path
     placeholder: .
@@
       build_source: railpack
       deploy_type: container
     type: section
-  - collapsible: true
+  - applied_by:
+      - build
+      - deploy
+    collapsible: true
     description: Optional Railpack version to use for the build. Leave blank to use the Ravion default.
     id: railpack_version
     label: Railpack version
@@
       build_source: railpack
       deploy_type: container
     type: string
-  - description: Optional dependency installation command. Leave blank to use Railpack detection.
+  - applied_by:
+      - build
+      - deploy
+    description: Optional dependency installation command. Leave blank to use Railpack detection.
     id: railpack_install_cmd
     label: Install command
     placeholder: Railpack default
@@
       build_source: railpack
       deploy_type: container
     type: string
-  - description: Optional application build command. Leave blank to use Railpack detection.
+  - applied_by:
+      - build
+      - deploy
+    description: Optional application build command. Leave blank to use Railpack detection.
     id: railpack_build_cmd
     label: Build command
     placeholder: Railpack default
@@
       build_source: railpack
       deploy_type: container
     type: string
-  - description: Optional start command embedded in the Railpack-built image. Leave blank to use Railpack detection.
+  - applied_by:
+      - build
+      - deploy
+    description: Optional start command embedded in the Railpack-built image. Leave blank to use Railpack detection.
     id: railpack_start_cmd
     label: Start command
     placeholder: Railpack default
@@
   - id: section_deployment
     label: Deployment
     type: section
-  - description: Optional repository to check out before manual deploy commands run. Leave blank to run the commands without a managed source checkout.
+  - applied_by:
+      - deploy
+    description: Optional repository to check out before manual deploy commands run. Leave blank to run the commands without a managed source checkout.
     id: deploy_source_repo
     label: Git repository
     required: false
     show_when:
       deploy_type: manual
     type: gitrepo
-  - default: .
+  - applied_by:
+      - deploy
+    default: .
     description: Repository-relative working directory for manual deploy and start commands when a Git repository is selected.
     id: deploy_source_base_path
     label: Source base path
@@
       deploy_type: manual
     type: string
   - add_button_label: Add command
+    applied_by:
+      - deploy
     description: Release preparation commands run as root, in order, on every instance during each manual deploy. Keep them idempotent; any command that exits non-zero fails that instance's deploy.
     id: deploy_commands
     label: Deploy commands
@@
     show_when:
       deploy_type: manual
     type: string_array
-  - description: Long-running foreground app command that supervisord runs as root after preparation and restarts if it 
... diff truncated ...

rvn-ecs-cluster 1.0.1 -> 1.0.2

--- remote
+++ compiled
 inputs:
-  - id: network
+  - applied_by:
+      - stack
+    id: network
     immutable: true
     label: VPC network
     mapped_inputs:
-      - id: section_aws
+      - applied_by: []
+        id: section_aws
         label: AWS account & region
         type: section
-      - default: << ref.input.aws_account_id >>
+      - applied_by:
+          - stack
+        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 >>
+      - applied_by:
+          - stack
+        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
-      - collapsible: true
+      - applied_by:
+          - stack
+        collapsible: true
         default: << ref.input.execution_environment_id >>
         description: Override the VPC, subnet, and security group for Terraform runners. Must use the same AWS account as selected above.
         id: execution_environment_id
         label: Terraform execution environment
         type: string
         values: $values:ravion/execution_environments
-      - id: section_vpc
+      - applied_by: []
+        id: section_vpc
         label: VPC
         type: section
-      - default: <<ref.stack.output.vpc_id>>
+      - applied_by:
+          - stack
+        default: <<ref.stack.output.vpc_id>>
         id: vpc_id
         immutable: true
         label: VPC ID
         required: true
         type: string
       - add_button_label: Add private subnet ID
+        applied_by:
+          - stack
         default: <<ref.stack.output.private_subnet_ids>>
         description: Required by Terraform. Used for private workloads and private load balancers.
         id: private_subnet_ids
@@
         required: true
         type: string_array
       - add_button_label: Add public subnet ID
+        applied_by:
+          - stack
         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
@@
   - id: section_cluster
     label: ECS cluster
     type: section
-  - default: <<project.given_id>>-<<environment.given_id>>
+  - applied_by:
+      - stack
+    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
@@
         pattern: ^[a-z0-9]([a-z0-9-]{0,26}[a-z0-9])?$
     required: true
     type: string
-  - default: true
+  - applied_by:
+      - stack
+    default: true
     description: Prevent accidental deletion of load balancers created by this module.
     id: load_balancer_deletion_protection_enabled
     label: Load balancer deletion protection
     type: boolean
-  - default: enhanced
+  - applied_by:
+      - stack
+    default: enhanced
     description: Configures CloudWatch Container Insights for the ECS cluster. Enhanced observability adds detailed task and container metrics and may increase CloudWatch costs.
     id: container_insights
     label: Container insights
@@
   - id: section_capacity
     label: Capacity providers
     type: section
-  - default: true
+  - applied_by:
+      - stack
+    default: true
     description: Allows ECS services in this cluster to use Fargate for serverless task capacity.
     id: fargate_enabled
     label: Fargate
     type: boolean
-  - default: true
+  - applied_by:
+      - stack
+    default: true
     description: Allows ECS services in this cluster to use Fargate Spot for lower-cost, interruptible serverless task capacity.
     id: fargate_spot_enabled
     label: Fargate spot
     type: boolean
-  - description: Enables the EC2 capacity provider when set. Leave blank to use only Fargate/Fargate Spot.
+  - applied_by:
+      - stack
+    description: Enables the EC2 capacity provider when set. Leave blank to use only Fargate/Fargate Spot.
     id: ec2_instance_type
     label: EC2 instance type
     no_options_message: Select a VPC Network, or enter an AWS account and region, to load available EC2 instance types.
@@
       ec2_instance_type:
         not: ""
     type: section
-  - description: Minimum EC2 instances in the Auto Scaling Group. To speed up deployments and autoscaling, set this high enough to keep spare capacity for all ECS services using this cluster. As a starting point, use about 2x the total desired task instances across those services.
+  - applied_by:
+      - stack
+    description: Minimum EC2 instances in the Auto Scaling Group. To speed up deployments and autoscaling, set this high enough to keep spare capacity for all ECS services using this cluster. As a starting point, use about 2x the total desired task instances across those services.
     id: ec2_min_size
     label: Min instances
     min: 0
@@
       ec2_instance_type:
         not: ""
     type: number
-  - description: Maximum EC2 instances in the Auto Scaling Group. Must be high enough to accommodate 2x the total max task instances across all ECS services using this cluster, otherwise deployments can fail.
+  - applied_by:
+      - stack
+    description: Maximum EC2 instances in the Auto Scaling Group. Must be high enough to accommodate 2x the total max task instances across all ECS services using this cluster, otherwise deployments can fail.
     id: ec2_max_size
     label: Max instances
     min: 1
@@
       ec2_instance_type:
         not: ""
     type: section
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: Root EBS volume size for EC2 capacity instances.
     id: ec2_root_volume_size
     label: Root volume size (GB)
@@
         not: ""
     type: number
   - add_button_label: Add security group ID
+    applied_by:
+      - stack
     collapsible: true
     description: Additional security groups attached to EC2 capacity instances.
     id: ec2_security_group_ids
@@
       ec2_instance_type:
         not: ""
     type: string_array
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     default: false
     description: Use Spot instances in the EC2 Auto Scaling Group.
     id: ec2_spot_enabled
@@
         not: ""
     type: boolean
   - add_button_label: Add instance type
+    applied_by:
+      - stack
     collapsible: true
     description: Additional instance types for Spot capacity.
     id: ec2_spot_instance_types
@@
         not: ""
       ec2_spot_enabled: true
     type: string_array
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: Custom AMI for EC2 capacity. Leave blank to use the latest ECS-optimized AMI.
     id: ec2_ami_id
     label: Custom AMI ID
@@
       ec2_instance_type:
         not: ""
     type: string
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: Key pair for SSH access to EC2 capacity instances.
     id: ec2_key_name
     label: SSH key pair name
@@
       ec2_instance_type:
         not: ""
     type: string
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: Root EBS volume type.
     id: ec2_root_volume_type
     label: Root volume type
@@
         value: io1
       - label: io2
         value: io2
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: Additional user data script appended after ECS config.
     id: ec2_user_data
     label: Additional user data
@@
       ec2_instance_type:
         not: ""
     type: text
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     default: true
     description: Managed termination protection for EC2 capacity.
     id: ec2_managed_termination_protection_enabled
@@
       ec2_instance_type:
         not: ""
     type: boolean
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     default: true
     description: Lets ECS automatically scale the EC2 Auto Scaling Group to match task demand. Disable to manage the instance count yourself.
     id: ec2_managed_scaling_enabled
@@
       ec2_instance_type:
         not: ""
     type: boolean
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: Defaults to 100% which means ECS autoscales EC2 instances to have zero extra capacity (cheapest). Reduce to something like 80-90% if you want to pay for spare capacity for faster autoscaling.
     id: ec2_managed_scaling_target_capacity
     label: Managed scaling target capacity (%)
@@
     id: section_public_alb
     label: Public application load balancer
     type: section
-  - default: true
+  - applied_by:
+      - stack
+    default: true
     id: public_alb_enabled
     label: Public load balancer
     type: boolean
-  - default: true
+  - applied_by:
+      - stack
+    default: true
     description: Enable HTTPS listener on the public ALB.
     id: public_alb_https_enabled
     label: HTTPS
     show_when:
       public_alb_enabled: true
     type: boolean
-  - description: Primary ACM certificate module for public ALB HTTPS.
+  - applied_by:
+      - stack
+    description: Primary ACM certificate module for public ALB HTTPS.
     id: public_alb_certificate
     label: Certificate
     mapped_inputs:
       - add_button_label: Add certificate ARN
+        applied_by:
+          - stack
         default:
           - <<ref.stack.output.certificate_arn>>
         description: ACM certificate ARNs resolved from the selected module. The first ARN is the default certificate.
@@
       public_alb_https_enabled: true
     type: $ref:rvn-acm-certificate
   - add_button_label: Add certificate ARN
+    applied_by:
+      - stack
     collapsible: true
     default: []
     description: Additional ACM certificate ARNs attached to the public ALB HTTPS listener for SNI.
@@
       public_alb_enabled: true
       public_alb_https_enabled: true
     type: string_array
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: SSL policy for public ALB HTTPS.
     id: public_alb_ssl_policy
     label: SSL policy
@@
       public_alb_enabled: true
       public_alb_https_enabled: true
     type: string
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: Idle timeout for the public ALB.
     id: public_alb_idle_timeout
     label: Idle timeout (seconds)
@@
     show_when:
       public_alb_enabled: true
     type: number
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: WAFv2 Web ACL ARN for the public ALB.
     id: public_alb_web_acl_arn
     label: WAF web ACL ARN
@@
     show_when:
       public_alb_enabled: true
     type: string
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     default: false
     description: Enable public ALB access logging.
     id: public_alb_access_logs_enabled
@@
     show_when:
       public_alb_enabled: true
     type: boolean
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: Existing S3 bucket ARN for public ALB access logs.
     id: public_alb_access_logs_bucket_arn
     label: Access logs bucket ARN
@@
     id: section_private_alb
     label: Private application load balancer
     type: section
-  - default: false
+  - applied_by:
+      - stack
+    default: false
     id: private_alb_enabled
     label: Private load balancer
     type: boolean
-  - default: false
+  - applied_by:
+      - stack
+    default: false
     description: Enable HTTPS listener on the private A
... diff truncated ...

rvn-ecs-nlb 1.1.0 -> 1.1.1

--- remote
+++ compiled
   - id: section_cluster
     label: ECS cluster
     type: section
-  - id: cluster
+  - applied_by:
+      - stack
+      - build
+      - deploy
+    id: cluster
     immutable: true
     label: ECS cluster
     mapped_inputs:
-      - default: <<ref.input.aws_account_id>>
+      - applied_by:
+          - stack
+          - build
+          - deploy
+        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>>
+      - applied_by:
+          - stack
+          - build
+          - deploy
+        default: <<ref.input.aws_region>>
         id: aws_region
         immutable: true
         label: Region
         type: string
         values: $values:aws/regions
-      - collapsible: true
+      - applied_by:
+          - stack
+          - build
+          - deploy
+        collapsible: true
         default: << ref.input.execution_environment_id >>
         description: Terraform execution environment inherited from the selected ECS cluster.
         id: execution_environment_id
         label: Terraform execution environment
         type: string
         values: $values:ravion/execution_environments
-      - default: <<ref.stack.output.cluster_arn>>
+      - applied_by:
+          - stack
+        default: <<ref.stack.output.cluster_arn>>
         id: cluster_arn
         immutable: true
         label: Cluster ARN
         required: true
         type: string
-      - default: <<ref.input.vpc_id>>
+      - applied_by:
+          - stack
+        default: <<ref.input.vpc_id>>
         id: vpc_id
         immutable: true
         label: VPC ID
         required: true
         type: string
       - add_button_label: Add private subnet ID
+        applied_by:
+          - stack
+          - deploy
         default: <<ref.input.private_subnet_ids>>
         description: Private subnets available from the selected ECS cluster network.
         id: private_subnet_ids
@@
         required: true
         type: string_array
       - add_button_label: Add public subnet ID
+        applied_by:
+          - stack
+          - deploy
         default: <<ref.input.public_subnet_ids>>
         description: Public subnets available from the selected ECS cluster network.
         id: public_subnet_ids
@@
         label: Public subnet IDs
         type: string_array
       - add_button_label: Add subnet ID
+        applied_by: []
         collapsible: true
         default: <<ref.input.private_subnet_ids>>
         description: Legacy service subnet override. Leave blank to derive subnets from the public/private service setting.
@@
         label: Private subnet IDs
         required: false
         type: string_array
-      - id: section_cluster_capacity
+      - applied_by: []
+        id: section_cluster_capacity
         label: Cluster capacity providers
         type: section
-      - default: <<ref.stack.output.fargate_capacity_provider_name>>
+      - applied_by:
+          - stack
+          - deploy
+        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>>
+      - applied_by:
+          - stack
+          - deploy
+        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: ""
+      - applied_by:
+          - stack
+          - deploy
+        default: ""
         description: EC2 capacity provider name from the selected cluster. Required only when using EC2 capacity.
         id: ec2_capacity_provider_name
         immutable: true
@@
         show_when:
           capacity_provider: ec2
         type: string
-      - id: section_cluster_nlb
+      - applied_by: []
+        id: section_cluster_nlb
         label: Cluster network load balancers
         type: section
-      - default: <<ref.stack.output.public_nlb_arn>>
+      - applied_by:
+          - stack
+        default: <<ref.stack.output.public_nlb_arn>>
         id: public_nlb_arn
         immutable: true
         label: Public NLB ARN
         type: string
-      - default: <<ref.stack.output.public_nlb_arn_suffix>>
+      - applied_by: []
+        default: <<ref.stack.output.public_nlb_arn_suffix>>
         id: public_nlb_arn_suffix
         immutable: true
         label: Public NLB ARN suffix
         type: string
-      - default: <<ref.stack.output.public_nlb_security_group_id>>
+      - applied_by:
+          - stack
+        default: <<ref.stack.output.public_nlb_security_group_id>>
         id: public_nlb_security_group_id
         immutable: true
         label: Public NLB security group ID
         type: string
-      - default: <<ref.stack.output.private_nlb_arn>>
+      - applied_by:
+          - stack
+        default: <<ref.stack.output.private_nlb_arn>>
         id: private_nlb_arn
         immutable: true
         label: Private NLB ARN
         type: string
-      - default: <<ref.stack.output.private_nlb_arn_suffix>>
+      - applied_by: []
+        default: <<ref.stack.output.private_nlb_arn_suffix>>
         id: private_nlb_arn_suffix
         immutable: true
         label: Private NLB ARN suffix
         type: string
-      - default: <<ref.stack.output.private_nlb_security_group_id>>
+      - applied_by:
+          - stack
+        default: <<ref.stack.output.private_nlb_security_group_id>>
         id: private_nlb_security_group_id
         immutable: true
         label: Private NLB security group ID
@@
   - id: section_service
     label: Network service
     type: section
-  - default: <<project.given_id>>-<<environment.given_id>>-<<module.given_id>>
+  - applied_by:
+      - stack
+    default: <<project.given_id>>-<<environment.given_id>>-<<module.given_id>>
     description: Name for the ECS service and related resources.
     id: name
     immutable: true
@@
         pattern: ^[A-Za-z0-9][A-Za-z0-9_-]{0,254}$
     required: true
     type: string
-  - default: true
+  - applied_by:
+      - stack
+    default: true
     description: Expose this service through the public NLB. Turn off to use the private NLB.
     id: public_nlb_service_enabled
     label: Public network service
     type: boolean
-  - default: true
+  - applied_by:
+      - stack
+      - deploy
+    default: true
     description: Recommended. Requires a NAT gateway or equivalent for internet access and keeps tasks off public subnets.
     id: private_subnet_placement_enabled
     label: Run in private subnets
@@
   - id: section_build
     label: Build config
     type: section
-  - default: dockerfile
+  - applied_by:
+      - stack
+      - build
+      - deploy
+    default: dockerfile
     id: build_source
     label: Build source
     required: true
@@
       - description: Deploy an image from a registry configured on this module. Provide only the tag or digest at deploy time.
         label: Pull from image registry
         value: image_registry
-  - description: Repository containing the application source for Dockerfile or Railpack builds.
+  - applied_by:
+      - build
+      - deploy
+    description: Repository containing the application source for Dockerfile or Railpack builds.
     id: source_repo
     label: Git repository
     required: true
@@
         - dockerfile
         - railpack
     type: gitrepo
-  - default: .
+  - applied_by:
+      - build
+      - deploy
+    default: .
     description: Repository-relative source and build root.
     id: source_base_path
     label: Source base path
@@
         - dockerfile
         - railpack
     type: string
-  - description: Image repository without a tag or digest, such as `nginx`, `ghcr.io/org/app`, or `123456789012.dkr.ecr.us-east-1.amazonaws.com/app`.
+  - applied_by:
+      - deploy
+    description: Image repository without a tag or digest, such as `nginx`, `ghcr.io/org/app`, or `123456789012.dkr.ecr.us-east-1.amazonaws.com/app`.
     id: image_repository
     label: Image repository
     placeholder: nginx
@@
     show_when:
       build_source: image_registry
     type: string
-  - collapsible: true
+  - applied_by:
+      - deploy
+    collapsible: true
     description: Secrets Manager secret ARN for private registries such as GHCR or Docker Hub. The secret must use the ECS repository credentials JSON format. Not needed for public images or normal same-account ECR.
     id: image_registry_credentials_secret_arn
     label: Registry credentials secret ARN
@@
       build_source: image_registry
     type: string
   - add_button_label: Add cmd segment
+    applied_by:
+      - deploy
     default: []
     description: Optional command arguments that override the image default command. For shell behavior, use `/bin/sh`, `-lc`, and your command string as separate arguments.
     id: image_start_command
@@
     show_when:
       build_source: dockerfile
     type: section
-  - description: Path to the Dockerfile to use for the build, relative to the repository root or configured source base path.
+  - applied_by:
+      - build
+      - deploy
+    description: Path to the Dockerfile to use for the build, relative to the repository root or configured source base path.
     id: dockerfile
     label: Dockerfile path
     placeholder: Dockerfile
     show_when:
       build_source: dockerfile
     type: string
-  - description: Directory to use as the Docker build context, relative to the repository root or configured source base path.
+  - applied_by:
+      - build
+      - deploy
+    description: Directory to use as the Docker build context, relative to the repository root or configured source base path.
     id: dockerfile_context
     label: Docker build context path
     placeholder: .
@@
     show_when:
       build_source: railpack
     type: section
-  - collapsible: true
+  - applied_by:
+      - build
+      - deploy
+    collapsible: true
     description: Optional Railpack version to use for the build. Leave blank to use the Ravion default.
     id: railpack_version
     label: Railpack version
@@
     show_when:
       build_source: railpack
     type: string
-  - description: Optional dependency installation command. Leave blank to use Railpack detection.
+  - applied_by:
+      - build
+      - deploy
+    description: Optional dependency installation command. Leave blank to use Railpack detection.
     id: railpack_install_cmd
     label: Install command
     placeholder: Railpack default
     show_when:
       build_source: railpack
     type: string
-  - description: Optional application build command. Leave blank to use Railpack detection.
+  - applied_by:
+      - build
+      - deploy
+    description: Optional application build command. Leave blank to use Railpack detection.
     id: railpack_build_cmd
     label: Build command
     placeholder: Railpack default
     show_when:
       build_source: railpack
     type: string
-  - id: railpack_start_cmd
+  - applied_by:
+      - build
+      - deploy
+    id: railpack_start_cmd
     label: Start command
     placeholder: Railpack default
     show_when:
@@
   - id: section_listener
     label: Network listeners
     type: section
-  - default:
+  - applied_by:
+      - stack
+      - deploy
+    default:
       - container_port: 3000
         listener_port: 80
         listener_protocol: TCP
@@
     immutable: true
     item_description: "Container port: {container_port}"
     item_inputs:
-      - default: 80
+      - applied_by:
+          - stack
+        default: 80
         description: Port the NLB listens on. Each listener port must be unique.
         id: listener_port
         la
... diff truncated ...

rvn-ecs-web 1.1.0 -> 1.1.1

--- remote
+++ compiled
   - id: section_cluster
     label: ECS cluster
     type: section
-  - id: cluster
+  - applied_by:
+      - stack
+      - build
+      - deploy
+    id: cluster
     immutable: true
     label: ECS cluster
     mapped_inputs:
-      - default: <<ref.input.aws_account_id>>
+      - applied_by:
+          - stack
+          - build
+          - deploy
+        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>>
+      - applied_by:
+          - stack
+          - build
+          - deploy
+        default: <<ref.input.aws_region>>
         id: aws_region
         immutable: true
         label: Region
         type: string
         values: $values:aws/regions
-      - collapsible: true
+      - applied_by:
+          - stack
+          - build
+          - deploy
+        collapsible: true
         default: << ref.input.execution_environment_id >>
         description: Terraform execution environment inherited from the selected ECS cluster.
         id: execution_environment_id
         label: Terraform execution environment
         type: string
         values: $values:ravion/execution_environments
-      - default: <<ref.stack.output.cluster_arn>>
+      - applied_by:
+          - stack
+        default: <<ref.stack.output.cluster_arn>>
         id: cluster_arn
         immutable: true
         label: Cluster ARN
         required: true
         type: string
-      - default: <<ref.input.vpc_id>>
+      - applied_by:
+          - stack
+        default: <<ref.input.vpc_id>>
         id: vpc_id
         immutable: true
         label: VPC ID
         required: true
         type: string
       - add_button_label: Add private subnet ID
+        applied_by:
+          - stack
+          - deploy
         default: <<ref.input.private_subnet_ids>>
         description: Private subnets available from the selected ECS cluster network.
         id: private_subnet_ids
@@
         required: true
         type: string_array
       - add_button_label: Add public subnet ID
+        applied_by:
+          - stack
+          - deploy
         default: <<ref.input.public_subnet_ids>>
         description: Public subnets available from the selected ECS cluster network.
         id: public_subnet_ids
@@
         label: Public subnet IDs
         type: string_array
       - add_button_label: Add subnet ID
+        applied_by: []
         collapsible: true
         default: <<ref.input.private_subnet_ids>>
         description: Legacy service subnet override. Leave blank to derive subnets from the public/private service setting.
@@
         label: Private subnet IDs
         required: false
         type: string_array
-      - id: section_cluster_capacity
+      - applied_by: []
+        id: section_cluster_capacity
         label: Cluster capacity providers
         type: section
-      - default: <<ref.stack.output.fargate_capacity_provider_name>>
+      - applied_by:
+          - stack
+          - deploy
+        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>>
+      - applied_by:
+          - stack
+          - deploy
+        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: ""
+      - applied_by:
+          - stack
+          - deploy
+        default: ""
         description: EC2 capacity provider name from the selected cluster. Required only when using EC2 capacity.
         id: ec2_capacity_provider_name
         immutable: true
@@
         show_when:
           capacity_provider: ec2
         type: string
-      - id: section_cluster_alb
+      - applied_by: []
+        id: section_cluster_alb
         label: Cluster load balancers
         type: section
-      - default: <<ref.stack.output.public_alb_http_listener_arn>>
+      - applied_by:
+          - stack
+        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
+      - applied_by:
+          - stack
+        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
@@
         label: Public ALB HTTPS listener ARN
         required: false
         type: string
-      - default: <<ref.stack.output.public_alb_security_group_id>>
+      - applied_by:
+          - stack
+        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>>
+      - applied_by:
+          - stack
+        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
+      - applied_by:
+          - stack
+        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
@@
         label: Private ALB HTTPS listener ARN
         required: false
         type: string
-      - default: <<ref.stack.output.private_alb_security_group_id>>
+      - applied_by:
+          - stack
+        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
-      - default: <<ref.stack.output.public_alb_arn_suffix>>
+      - applied_by: []
+        default: <<ref.stack.output.public_alb_arn_suffix>>
         id: public_alb_arn_suffix
         immutable: true
         label: Public ALB ARN suffix
         type: string
-      - default: <<ref.stack.output.private_alb_arn_suffix>>
+      - applied_by: []
+        default: <<ref.stack.output.private_alb_arn_suffix>>
         id: private_alb_arn_suffix
         immutable: true
         label: Private ALB ARN suffix
@@
   - id: section_service
     label: Web service
     type: section
-  - default: <<project.given_id>>-<<environment.given_id>>-<<module.given_id>>
+  - applied_by:
+      - stack
+    default: <<project.given_id>>-<<environment.given_id>>-<<module.given_id>>
     description: Name for the ECS service and related resources.
     id: name
     immutable: true
@@
         pattern: ^[A-Za-z0-9][A-Za-z0-9_-]{0,254}$
     required: true
     type: string
-  - default: true
+  - applied_by:
+      - stack
+    default: true
     description: Expose this service through the public ALB. Turn off to use the private ALB.
     id: public_web_service_enabled
     label: Public web service
     type: boolean
-  - default: true
+  - applied_by:
+      - stack
+      - deploy
+    default: true
     description: Recommended. Requires a NAT gateway or equivalent for internet access and a static IP.
     id: private_subnet_placement_enabled
     label: Run in private subnets
@@
   - id: section_build
     label: Build config
     type: section
-  - default: dockerfile
+  - applied_by:
+      - stack
+      - build
+      - deploy
+    default: dockerfile
     id: build_source
     label: Build source
     required: true
@@
       - description: Deploy an image from a registry configured on this module. Provide only the tag or digest at deploy time.
         label: Pull from image registry
         value: image_registry
-  - description: Repository containing the application source for Dockerfile or Railpack builds.
+  - applied_by:
+      - build
+      - deploy
+    description: Repository containing the application source for Dockerfile or Railpack builds.
     id: source_repo
     label: Git repository
     required: true
@@
         - dockerfile
         - railpack
     type: gitrepo
-  - default: .
+  - applied_by:
+      - build
+      - deploy
+    default: .
     description: Repository-relative source and build root.
     id: source_base_path
     label: Source base path
@@
         - dockerfile
         - railpack
     type: string
-  - description: Image repository without a tag or digest, such as `nginx`, `ghcr.io/org/app`, or `123456789012.dkr.ecr.us-east-1.amazonaws.com/app`.
+  - applied_by:
+      - deploy
+    description: Image repository without a tag or digest, such as `nginx`, `ghcr.io/org/app`, or `123456789012.dkr.ecr.us-east-1.amazonaws.com/app`.
     id: image_repository
     label: Image repository
     placeholder: nginx
@@
     show_when:
       build_source: image_registry
     type: string
-  - collapsible: true
+  - applied_by:
+      - deploy
+    collapsible: true
     description: Secrets Manager secret ARN for private registries such as GHCR or Docker Hub. The secret must use the ECS repository credentials JSON format. Not needed for public images or normal same-account ECR.
     id: image_registry_credentials_secret_arn
     label: Registry credentials secret ARN
@@
       build_source: image_registry
     type: string
   - add_button_label: Add cmd segment
+    applied_by:
+      - deploy
     default: []
     description: Optional command arguments that override the image default command. For shell behavior, use `/bin/sh`, `-lc`, and your command string as separate arguments.
     id: image_start_command
@@
     show_when:
       build_source: dockerfile
     type: section
-  - description: Path to the Dockerfile to use for the build, relative to the repository root or configured source base path.
+  - applied_by:
+      - build
+      - deploy
+    description: Path to the Dockerfile to use for the build, relative to the repository root or configured source base path.
     id: dockerfile
     label: Dockerfile path
     placeholder: Dockerfile
     show_when:
       build_source: dockerfile
     type: string
-  - description: Directory to use as the Docker build context, relative to the repository root or configured source base path.
+  - applied_by:
+      - build
+      - deploy
+    description: Directory to use as the Docker build context, relative to the repository root or configured source base path.
     id: dockerfile_context
     label: Docker build context path
     placeholder: .
@@
     show_when:
       build_source: railpack
     type: section
-  - collapsible: true
+  - applied_by:
+      - build
+      - deploy
+    collapsible: true
     description: Optional Railpack version to use for the build. Leave blank to use the Ravion default.
     id: railpack_version
     label: Railpack version
@@
     show_when:
       build_source: railpack
     type: string
-  - description: Optional dependency installation command. Leave blank to use Railpack detection.
+  - applied_by:
+      - build
+      - deploy
+    description: Optional dependency installation command. Leave blank to use Railpack detection.
     id: railpack_install_cmd
     label: Install command
     placeholder: Railpack default
     show_when:
       build_source: railpack
     type: string
-  - description: Optional application build command. Leave blank to use Railpack detection.
+  - applied_by:
+      - build
+      - deploy
+    description: Optional 
... diff truncated ...

rvn-ecs-worker 1.1.0 -> 1.1.1

--- remote
+++ compiled
   - id: section_cluster
     label: ECS cluster
     type: section
-  - id: cluster
+  - applied_by:
+      - stack
+      - build
+      - deploy
+    id: cluster
     immutable: true
     label: ECS cluster
     mapped_inputs:
-      - default: <<ref.input.aws_account_id>>
+      - applied_by:
+          - stack
+          - build
+          - deploy
+        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>>
+      - applied_by:
+          - stack
+          - build
+          - deploy
+        default: <<ref.input.aws_region>>
         id: aws_region
         immutable: true
         label: Region
         type: string
         values: $values:aws/regions
-      - collapsible: true
+      - applied_by:
+          - stack
+          - build
+          - deploy
+        collapsible: true
         default: << ref.input.execution_environment_id >>
         description: Terraform execution environment inherited from the selected ECS cluster.
         id: execution_environment_id
         label: Terraform execution environment
         type: string
         values: $values:ravion/execution_environments
-      - default: <<ref.stack.output.cluster_arn>>
+      - applied_by:
+          - stack
+        default: <<ref.stack.output.cluster_arn>>
         id: cluster_arn
         immutable: true
         label: Cluster ARN
         required: true
         type: string
-      - default: <<ref.input.vpc_id>>
+      - applied_by:
+          - stack
+        default: <<ref.input.vpc_id>>
         id: vpc_id
         immutable: true
         label: VPC ID
         required: true
         type: string
       - add_button_label: Add private subnet ID
+        applied_by:
+          - stack
+          - deploy
         default: <<ref.input.private_subnet_ids>>
         description: Private subnets available from the selected ECS cluster network.
         id: private_subnet_ids
@@
         required: true
         type: string_array
       - add_button_label: Add public subnet ID
+        applied_by:
+          - stack
+          - deploy
         default: <<ref.input.public_subnet_ids>>
         description: Public subnets available from the selected ECS cluster network.
         id: public_subnet_ids
@@
         label: Public subnet IDs
         type: string_array
       - add_button_label: Add subnet ID
+        applied_by: []
         collapsible: true
         default: <<ref.input.private_subnet_ids>>
         description: Legacy service subnet override. Leave blank to derive subnets from the public/private service setting.
@@
         label: Private subnet IDs
         required: false
         type: string_array
-      - id: section_cluster_capacity
+      - applied_by: []
+        id: section_cluster_capacity
         label: Cluster capacity providers
         type: section
-      - default: <<ref.stack.output.fargate_capacity_provider_name>>
+      - applied_by:
+          - stack
+          - deploy
+        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>>
+      - applied_by:
+          - stack
+          - deploy
+        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: ""
+      - applied_by:
+          - stack
+          - deploy
+        default: ""
         description: EC2 capacity provider name from the selected cluster. Required only when using EC2 capacity.
         id: ec2_capacity_provider_name
         immutable: true
@@
   - id: section_service
     label: Worker service
     type: section
-  - default: <<project.given_id>>-<<environment.given_id>>-<<module.given_id>>
+  - applied_by:
+      - stack
+    default: <<project.given_id>>-<<environment.given_id>>-<<module.given_id>>
     description: Name for the ECS worker service and related resources.
     id: name
     immutable: true
@@
         pattern: ^[A-Za-z0-9][A-Za-z0-9_-]{0,254}$
     required: true
     type: string
-  - default: true
+  - applied_by:
+      - stack
+      - deploy
+    default: true
     description: Recommended. Requires a NAT gateway or equivalent for internet access and keeps worker tasks off public subnets.
     id: private_subnet_placement_enabled
     label: Run in private subnets
@@
   - id: section_build
     label: Build config
     type: section
-  - default: dockerfile
+  - applied_by:
+      - stack
+      - build
+      - deploy
+    default: dockerfile
     id: build_source
     label: Build source
     required: true
@@
       - description: Deploy an image from a registry configured on this module. Provide only the tag or digest at deploy time.
         label: Pull from image registry
         value: image_registry
-  - description: Repository containing the application source for Dockerfile or Railpack builds.
+  - applied_by:
+      - build
+      - deploy
+    description: Repository containing the application source for Dockerfile or Railpack builds.
     id: source_repo
     label: Git repository
     required: true
@@
         - dockerfile
         - railpack
     type: gitrepo
-  - default: .
+  - applied_by:
+      - build
+      - deploy
+    default: .
     description: Repository-relative source and build root.
     id: source_base_path
     label: Source base path
@@
         - dockerfile
         - railpack
     type: string
-  - description: Image repository without a tag or digest, such as `nginx`, `ghcr.io/org/app`, or `123456789012.dkr.ecr.us-east-1.amazonaws.com/app`.
+  - applied_by:
+      - deploy
+    description: Image repository without a tag or digest, such as `nginx`, `ghcr.io/org/app`, or `123456789012.dkr.ecr.us-east-1.amazonaws.com/app`.
     id: image_repository
     label: Image repository
     placeholder: nginx
@@
     show_when:
       build_source: image_registry
     type: string
-  - collapsible: true
+  - applied_by:
+      - deploy
+    collapsible: true
     description: Secrets Manager secret ARN for private registries such as GHCR or Docker Hub. The secret must use the ECS repository credentials JSON format. Not needed for public images or normal same-account ECR.
     id: image_registry_credentials_secret_arn
     label: Registry credentials secret ARN
@@
       build_source: image_registry
     type: string
   - add_button_label: Add cmd segment
+    applied_by:
+      - deploy
     default: []
     description: Optional command arguments that override the image default command. For shell behavior, use `/bin/sh`, `-lc`, and your command string as separate arguments.
     id: image_start_command
@@
     show_when:
       build_source: dockerfile
     type: section
-  - description: Path to the Dockerfile to use for the build, relative to the repository root or configured source base path.
+  - applied_by:
+      - build
+      - deploy
+    description: Path to the Dockerfile to use for the build, relative to the repository root or configured source base path.
     id: dockerfile
     label: Dockerfile path
     placeholder: Dockerfile
     show_when:
       build_source: dockerfile
     type: string
-  - description: Directory to use as the Docker build context, relative to the repository root or configured source base path.
+  - applied_by:
+      - build
+      - deploy
+    description: Directory to use as the Docker build context, relative to the repository root or configured source base path.
     id: dockerfile_context
     label: Docker build context path
     placeholder: .
@@
     show_when:
       build_source: railpack
     type: section
-  - collapsible: true
+  - applied_by:
+      - build
+      - deploy
+    collapsible: true
     description: Optional Railpack version to use for the build. Leave blank to use the Ravion default.
     id: railpack_version
     label: Railpack version
@@
     show_when:
       build_source: railpack
     type: string
-  - description: Optional dependency installation command. Leave blank to use Railpack detection.
+  - applied_by:
+      - build
+      - deploy
+    description: Optional dependency installation command. Leave blank to use Railpack detection.
     id: railpack_install_cmd
     label: Install command
     placeholder: Railpack default
     show_when:
       build_source: railpack
     type: string
-  - description: Optional application build command. Leave blank to use Railpack detection.
+  - applied_by:
+      - build
+      - deploy
+    description: Optional application build command. Leave blank to use Railpack detection.
     id: railpack_build_cmd
     label: Build command
     placeholder: Railpack default
     show_when:
       build_source: railpack
     type: string
-  - id: railpack_start_cmd
+  - applied_by:
+      - build
+      - deploy
+    id: railpack_start_cmd
     label: Start command
     placeholder: Railpack default
     show_when:
@@
   - id: section_task
     label: Container resources
     type: section
-  - default: fargate
+  - applied_by:
+      - stack
+      - deploy
+    default: fargate
     description: Choose the primary capacity provider. Most services should use only one provider.
     id: capacity_provider
     label: Capacity provider
@@
         value: fargate_spot
       - label: EC2
         value: ec2
-  - collapsible: true
+  - applied_by:
+      - stack
+      - deploy
+    collapsible: true
     default: false
     description: Add Fargate to the capacity provider strategy in addition to the primary provider.
     id: additional_fargate_capacity_enabled
@@
       capacity_provider:
         not: fargate
     type: boolean
-  - collapsible: true
+  - applied_by:
+      - stack
+      - deploy
+    collapsible: true
     default: false
     description: Add lower-cost interruptible Fargate spot capacity in addition to the primary provider.
     id: additional_fargate_spot_capacity_enabled
@@
       capacity_provider:
         not: fargate_spot
     type: boolean
-  - collapsible: true
+  - applied_by:
+      - stack
+      - deploy
+    collapsible: true
     default: false
     description: Add EC2 capacity from the selected cluster in addition to the primary provider.
     id: additional_ec2_capacity_enabled
@@
       capacity_provider:
         not: ec2
     type: boolean
-  - default:
+  - applied_by:
+      - stack
+      - deploy
+    default:
       memory_gb: 4
       vcpu: 2
     description: CPU and memory for Fargate tasks. Prices are estimated from AWS Fargate pricing for the selected region, architecture, and capacity provider.
@@
         - fargate_spot
     type: compound
     values: $values:aws/fargate/sizes?region=<<module.input.aws_region>>&cpuArchitecture=<<module.input.cpu_architecture>>&operatingSystem=linux&capacityProvider=<<module.input.capacity_provider>>
-  - collapsible: true
+  - applied_by:
+      - stack
+      - deploy
+    collapsible: true
     description: Optional ephemeral storage size for each Fargate app task, from 21 to 200 GiB. Leave blank to use the AWS default of 20 GiB.
     id: task_ephemeral_storage_size_gib
     label: App ephemeral storage (GiB)
@@
         - fargate
         - fargate_spot
     type: number
-  - default: "1.5"
+  - applied_by:
+      - stack
+      - deploy
+    default: "1.5"
     description: vCPU reserved for each app task on EC2 capacity. Leave at least 0.25 vCPU unreserved on each EC2 instance for the ECS agent and system processes.
     id: task_cpu
     label: App vCPU
@@
     show_when:
       capacity_provider: ec2
     type: string
-  - default: "3.5"
+  - appl
... diff truncated ...

rvn-efs 1.0.1 -> 1.0.2

--- remote
+++ compiled
 inputs:
-  - id: network
+  - applied_by:
+      - stack
+    id: network
     immutable: true
     label: VPC network
     mapped_inputs:
-      - id: section_aws
+      - applied_by: []
+        id: section_aws
         label: AWS account & region
         type: section
-      - default: << ref.input.aws_account_id >>
+      - applied_by:
+          - stack
+        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 >>
+      - applied_by:
+          - stack
+        default: << ref.input.aws_region >>
         description: AWS region for this file system.
         id: aws_region
         immutable: true
         label: Region
         type: string
         values: $values:aws/regions
-      - collapsible: true
+      - applied_by:
+          - stack
+        collapsible: true
         default: << ref.input.execution_environment_id >>
         description: Override the VPC, subnet, and security group for Terraform runners. Must use the same AWS account as selected above.
         id: execution_environment_id
         label: Terraform execution environment
         type: string
         values: $values:ravion/execution_environments
-      - id: section_vpc
+      - applied_by: []
+        id: section_vpc
         label: VPC
         type: section
-      - default: <<ref.stack.output.vpc_id>>
+      - applied_by:
+          - stack
+        default: <<ref.stack.output.vpc_id>>
         id: vpc_id
         immutable: true
         label: VPC ID
         required: true
         type: string
       - add_button_label: Add private subnet ID
+        applied_by:
+          - stack
         default: <<ref.stack.output.private_subnet_ids>>
         description: Subnets where EFS mount targets are created, one per subnet. Use private subnets in distinct availability zones.
         id: subnet_ids
@@
   - id: section_file_system
     label: File system
     type: section
-  - default: <<project.given_id>>-<<environment.given_id>>-<<module.given_id>>
+  - applied_by:
+      - stack
+    default: <<project.given_id>>-<<environment.given_id>>-<<module.given_id>>
     description: Name prefix for all EFS resources.
     id: name
     immutable: true
@@
         pattern: ^[a-zA-Z0-9]([a-zA-Z0-9_-]{0,62}[a-zA-Z0-9])?$
     required: true
     type: string
-  - default: true
+  - applied_by:
+      - stack
+    default: true
     description: Encrypt file system data at rest. Cannot be changed after creation.
     id: encrypted
     immutable: true
     label: Encryption at rest
     type: boolean
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: KMS key for encryption at rest. Leave blank to use the AWS managed key for EFS.
     id: kms_key_id
     label: KMS key ARN
@@
     show_when:
       encrypted: true
     type: string
-  - default: generalPurpose
+  - applied_by:
+      - stack
+    default: generalPurpose
     description: General purpose fits most workloads. Max I/O trades higher latency for higher aggregate throughput and cannot be changed after creation.
     id: performance_mode
     immutable: true
@@
       - description: Higher aggregate throughput and operations per second at the cost of latency. Not supported with elastic throughput.
         label: Max I/O
         value: maxIO
-  - default: bursting
+  - applied_by:
+      - stack
+    default: bursting
     description: How the file system scales throughput.
     id: throughput_mode
     label: Throughput mode
@@
       - description: Fixed throughput independent of the amount of data stored.
         label: Provisioned
         value: provisioned
-  - default: 128
+  - applied_by:
+      - stack
+    default: 128
     description: Throughput to provision for the file system.
     id: provisioned_throughput_in_mibps
     label: Provisioned throughput (MiB/s)
@@
   - id: section_lifecycle
     label: Lifecycle & backups
     type: section
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: Move files not accessed for this period to the lower-cost Infrequent Access storage class. Leave blank to keep files in Standard storage.
     id: transition_to_ia
     label: Transition to Infrequent Access
@@
         value: AFTER_270_DAYS
       - label: After 365 days
         value: AFTER_365_DAYS
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: Move files not accessed for this period to the Archive storage class. Requires a Transition to Infrequent Access period.
     id: transition_to_archive
     label: Transition to Archive
@@
         value: AFTER_270_DAYS
       - label: After 365 days
         value: AFTER_365_DAYS
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: Move files back to Standard storage on first access, avoiding repeated Infrequent Access retrieval charges for files that become hot again.
     id: transition_to_primary_storage_class
     label: Transition back to Standard
@@
     values:
       - label: After 1 access
         value: AFTER_1_ACCESS
-  - default: true
+  - applied_by:
+      - stack
+    default: true
     description: Back up the file system automatically through AWS Backup.
     id: backup_enabled
     label: Automatic backups
@@
   - id: section_access_point
     label: Access point
     type: section
-  - default: false
+  - applied_by:
+      - stack
+    default: false
     description: Create an EFS access point that scopes clients to a directory with fixed POSIX ownership. Recommended when containers should not access the whole file system as root.
     id: access_point_enabled
     label: Access point
     type: boolean
-  - default: /data
+  - applied_by:
+      - stack
+    default: /data
     description: Directory exposed through the access point. EFS creates it with the ownership below on first use when the path is not /.
     id: access_point_root_directory_path
     label: Root directory path
@@
     show_when:
       access_point_enabled: true
     type: string
-  - default: 1000
+  - applied_by:
+      - stack
+    default: 1000
     description: User ID applied to all requests through the access point and owner of the created directory.
     id: access_point_posix_uid
     label: POSIX user ID
@@
     show_when:
       access_point_enabled: true
     type: number
-  - default: 1000
+  - applied_by:
+      - stack
+    default: 1000
     description: Group ID applied to all requests through the access point and owner of the created directory.
     id: access_point_posix_gid
     label: POSIX group ID
@@
     show_when:
       access_point_enabled: true
     type: number
-  - default: "755"
+  - applied_by:
+      - stack
+    default: "755"
     description: Octal permissions for the created root directory.
     id: access_point_permissions
     label: Directory permissions
@@
     label: Security
     type: section
   - add_button_label: Add security group ID
+    applied_by:
+      - stack
     collapsible: true
     description: Extra security groups allowed to reach the mount targets over NFS, beyond the managed client security group.
     id: allowed_security_group_ids
@@
     placeholder: sg-...
     type: string_array
   - add_button_label: Add CIDR block
+    applied_by:
+      - stack
     collapsible: true
     description: IPv4 CIDR blocks allowed to reach the mount targets over NFS.
     id: allowed_cidr_blocks
@@
     placeholder: 10.0.0.0/16
     type: string_array
   - add_button_label: Add IPv6 CIDR block
+    applied_by:
+      - stack
     collapsible: true
     description: IPv6 CIDR blocks allowed to reach the mount targets over NFS.
     id: allowed_ipv6_cidr_blocks
@@
   - id: section_misc
     label: Misc
     type: section
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: A map of tags to assign to all resources. Default tags are `Owner`, `ProjectGivenId`, `EnvironmentGivenId`, `ModuleGivenId`, `ModuleId`
     id: tags
     label: Tags
@@
   - id: section_advanced
     label: Terraform settings
     type: section
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: Override the environment's default version for this module
     id: opentofu_version
     label: OpenTofu version override
     required: false
     type: string
     values: $values:opentofu/versions
-  - collapsible: true
+  - applied_by:
+      - stack
+    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
+  - applied_by:
+      - stack
+    collapsible: true
     default: {}
     description: Optional raw Terraform variable overrides for advanced module inputs or one-off overrides. Values here override the generated variables above.
     id: advanced_terraform_variables
@@
 
   ECS services can reference this module directly: the service mounts the file system into the app container and attaches the client security group automatically.
 
-  Terraform source: [ravionhq/modules/storage/efs](https://github.com/ravionhq/modules/tree/rvn-efs@1.0.1/storage/efs)
+  Terraform source: [ravionhq/modules/storage/efs](https://github.com/ravionhq/modules/tree/rvn-efs@1.0.2/storage/efs)
 
   ## Use cases
 
@@
         base_path: storage/efs
         branch: main
         execution_environment_id: << module.input.execution_environment_id >>
-        ref: rvn-efs@1.0.1
+        ref: rvn-efs@1.0.2
         repo: https://github.com/ravionhq/modules
         stack_id: <<stack.id>>
         terraform_variables:

rvn-elasticache 1.0.1 -> 1.0.2

--- remote
+++ compiled
 inputs:
-  - id: network
+  - applied_by:
+      - stack
+    id: network
     immutable: true
     label: VPC network
     mapped_inputs:
-      - id: section_aws
+      - applied_by: []
+        id: section_aws
         label: AWS account & region
         type: section
-      - default: << ref.input.aws_account_id >>
+      - applied_by:
+          - stack
+        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 >>
+      - applied_by:
+          - stack
+        default: << ref.input.aws_region >>
         description: AWS region for this cache.
         id: aws_region
         immutable: true
         label: Region
         type: string
         values: $values:aws/regions
-      - collapsible: true
+      - applied_by:
+          - stack
+        collapsible: true
         default: << ref.input.execution_environment_id >>
         description: Override the VPC, subnet, and security group for Terraform runners. Must use the same AWS account as selected above.
         id: execution_environment_id
         label: Terraform execution environment
         type: string
         values: $values:ravion/execution_environments
-      - id: section_vpc
+      - applied_by: []
+        id: section_vpc
         label: VPC
         type: section
-      - default: <<ref.stack.output.vpc_id>>
+      - applied_by:
+          - stack
+        default: <<ref.stack.output.vpc_id>>
         id: vpc_id
         immutable: true
         label: VPC ID
         required: true
         type: string
       - add_button_label: Add private subnet ID
+        applied_by:
+          - stack
         default: <<ref.stack.output.private_subnet_ids>>
         description: Subnets for the ElastiCache subnet group or serverless cache. Use private subnets for normal cache deployments.
         id: subnet_ids
@@
   - id: section_cache
     label: Cache
     type: section
-  - default: <<project.given_id>>-<<environment.given_id>>
+  - applied_by:
+      - stack
+    default: <<project.given_id>>-<<environment.given_id>>
     description: Name prefix for all ElastiCache resources.
     id: name
     immutable: true
@@
   - id: section_version
     label: Version
     type: section
-  - default: valkey
+  - applied_by:
+      - stack
+    default: valkey
     description: Choose Valkey for Redis-compatible workloads with lower AWS pricing, Redis for Redis OSS compatibility requirements, or Memcached for simple non-persistent object caching without Redis data structures. AWS prices Valkey 20% lower than Redis OSS for node-based ElastiCache and 33% lower for Serverless, with a 90% lower Serverless minimum data storage size.
     id: engine
     immutable: true
@@
       - description: Best for simple volatile object caching where you do not need Redis commands, persistence, replicas, or cluster-mode sharding.
         label: Memcached
         value: memcached
-  - description: Major engine version. Current latest major versions include Valkey 9, Redis OSS 7, and Memcached 1.6.
+  - applied_by:
+      - stack
+    description: Major engine version. Current latest major versions include Valkey 9, Redis OSS 7, and Memcached 1.6.
     id: engine_major_version
     immutable: true
     label: Engine major version
     placeholder: "9"
     required: true
     type: string
-  - description: Minor or patch version appended to the major version.
+  - applied_by:
+      - stack
+    description: Minor or patch version appended to the major version.
     id: engine_minor_version
     label: Engine minor version
     placeholder: "0"
     required: true
     type: string
-  - default: true
+  - applied_by:
+      - stack
+    default: true
     description: Enable automatic minor engine version upgrades during the maintenance window.
     id: minor_version_auto_upgrade_enabled
     label: Auto minor version upgrades
@@
   - id: section_size
     label: Size & topology
     type: section
-  - default: false
+  - applied_by:
+      - stack
+    default: false
     description: Create an ElastiCache Serverless cache instead of provisioned nodes. Supported for Redis and Valkey.
     id: serverless_enabled
     immutable: true
@@
         - redis
         - valkey
     type: boolean
-  - default: cache.t4g.micro
+  - applied_by:
+      - stack
+    default: cache.t4g.micro
     description: ElastiCache node size for provisioned clusters.
     id: node_type
     label: Node type
@@
     show_when:
       serverless_enabled: false
     type: string
-  - default: 1
+  - applied_by:
+      - stack
+    default: 1
     description: Number of Memcached cache nodes.
     id: num_cache_nodes
     label: Cache nodes
@@
       engine: memcached
       serverless_enabled: false
     type: number
-  - default: false
+  - applied_by:
+      - stack
+    default: false
     description: Enable cluster mode when one primary shard is not enough for your data size or throughput. Leave disabled for simpler Redis or Valkey deployments with one primary and optional replicas.
     id: cluster_mode_enabled
     label: Cluster mode
@@
         - valkey
       serverless_enabled: false
     type: boolean
-  - default: 1
+  - applied_by:
+      - stack
+    default: 1
     description: Number of Redis or Valkey shards. Use 1 when cluster mode is disabled.
     id: num_node_groups
     label: Node groups
@@
         - valkey
       serverless_enabled: false
     type: number
-  - default: 0
+  - applied_by:
+      - stack
+    default: 0
     description: Number of replica nodes in each Redis or Valkey node group.
     id: replicas_per_node_group
     label: Replicas per node group
@@
         - valkey
       serverless_enabled: false
     type: number
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: Port where the cache accepts connections. Leave blank for engine defaults.
     id: port
     label: Port
     max: 65535
     min: 1
     type: number
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     default: ipv4
     description: Network type for the replication group.
     id: network_type
@@
         value: ipv6
       - label: Dual stack
         value: dual_stack
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     default: ipv4
     description: IP address discovery method.
     id: ip_discovery
@@
   - id: section_security
     label: Security
     type: section
-  - default: true
+  - applied_by:
+      - stack
+    default: true
     description: Create a security group with ingress rules for this cache.
     id: security_group_creation_enabled
     label: Security group creation
     type: boolean
-  - description: Existing security group ID to use when security group creation is disabled.
+  - applied_by:
+      - stack
+    description: Existing security group ID to use when security group creation is disabled.
     id: security_group_id
     label: Security group ID
     patterns:
@@
       security_group_creation_enabled: false
     type: string
   - add_button_label: Add security group ID
+    applied_by:
+      - stack
     description: Security groups allowed to connect to this cache.
     id: allowed_security_group_ids
     label: Allowed security groups
@@
     placeholder: sg-...
     type: string_array
   - add_button_label: Add CIDR block
+    applied_by:
+      - stack
     collapsible: true
     description: IPv4 CIDR blocks allowed to connect to this cache.
     id: allowed_cidr_blocks
@@
     placeholder: 10.0.0.0/16
     type: string_array
   - add_button_label: Add IPv6 CIDR block
+    applied_by:
+      - stack
     collapsible: true
     description: IPv6 CIDR blocks allowed to connect to this cache.
     id: allowed_ipv6_cidr_blocks
     label: Allowed IPv6 CIDR blocks
     placeholder: 2001:db8::/64
     type: string_array
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     default: true
     description: Enable TLS encryption for Redis and Valkey traffic.
     id: transit_encryption_enabled
@@
         - redis
         - valkey
     type: boolean
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     default: true
     description: Enable encryption at rest for Redis and Valkey.
     id: at_rest_encryption_enabled
@@
         - redis
         - valkey
     type: boolean
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: KMS key ARN for at-rest encryption. Leave blank to use the AWS managed key.
     id: kms_key_arn
     label: KMS key ARN
@@
         - redis
         - valkey
     type: string
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     default: true
     description: Generate an AUTH token for Redis or Valkey when no token is provided. Requires transit encryption.
     id: auth_token_enabled
@@
         - valkey
       transit_encryption_enabled: true
     type: boolean
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: Optional explicit AUTH token. Leave blank to generate one when AUTH token generation is enabled.
     id: auth_token
     label: AUTH token
@@
         - valkey
       transit_encryption_enabled: true
     type: string
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     default: 32
     description: Length of the generated AUTH token.
     id: auth_token_length
@@
         - valkey
       serverless_enabled: false
     type: section
-  - default: false
+  - applied_by:
+      - stack
+    default: false
     description: Enable automatic failover. Requires at least one replica.
     id: automatic_failover_enabled
     label: Automatic failover
@@
         - valkey
       serverless_enabled: false
     type: boolean
-  - default: false
+  - applied_by:
+      - stack
+    default: false
     description: Enable Multi-AZ support for the replication group.
     id: multi_az_enabled
     label: Multi-AZ
@@
         - valkey
       serverless_enabled: false
     type: boolean
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     default: false
     description: Enable data tiering for r6gd or r7gd node types.
     id: data_tiering_enabled
@@
         - redis
         - valkey
     type: section
-  - default: 0
+  - applied_by:
+      - stack
+    default: 0
     description: Number of days to retain automatic snapshots. Set to 0 to disable backups.
     id: snapshot_retention_limit
     label: Snapshot retention days
@@
         - valkey
       serverless_enabled: false
     type: number
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: Daily UTC window for automatic snapshots.
     id: snapshot_window
     label: Snapshot window
@@
         - valkey
       serverless_enabled: false
     type: string
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: Final snapshot name to create when deleting the replication group. Leave blank to skip final snapshot creation.
     id: final_snapshot_identifier
     label: Final snapshot identifier
@@
         - valkey
       serverless_enabled: false
     type: string
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: Snapshot ARNs to restore into the serverless cache.
     id: serverless_snapshot_arns_to_restore
     label: Serverless snapshot ARNs to restore
@@
         - valkey
       serverless_enabled: true
     type: string_array
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: Daily UTC time for serverless automated snapshots.
     id: serverless_daily_snapshot_time
     label: Serverless daily snapshot time
@@
     show_when:
... diff truncated ...

rvn-lambda 1.1.0 -> 1.1.1

--- remote
+++ compiled
   - id: section_aws
     label: AWS account & region
     type: section
-  - id: aws_account_id
+  - applied_by:
+      - stack
+      - build
+      - deploy
+    id: aws_account_id
     immutable: true
     label: AWS account
     required: true
     type: string
     values: $values:ravion/aws_accounts
-  - id: aws_region
+  - applied_by:
+      - stack
+      - build
+      - deploy
+    id: aws_region
     immutable: true
     label: Region
     required: true
@@
   - id: section_function
     label: Lambda function
     type: section
-  - default: regional
+  - applied_by:
+      - stack
+      - build
+      - deploy
+    default: regional
     id: lambda_type
     immutable: true
     label: Lambda type
@@
         value: regional
       - label: CloudFront Lambda@Edge
         value: edge
-  - default: <<project.given_id>>-<<environment.given_id>>-<<module.given_id>>
+  - applied_by:
+      - stack
+    default: <<project.given_id>>-<<environment.given_id>>-<<module.given_id>>
     description: Name for the Lambda function and related resources.
     id: name
     immutable: true
@@
         pattern: ^[A-Za-z0-9_-]{1,64}$
     required: true
     type: string
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: Description shown for the Lambda function in AWS.
     id: description
     label: Function description
     required: false
     type: string
-  - default: Zip
+  - applied_by:
+      - stack
+      - build
+      - deploy
+    default: Zip
     id: package_type
     immutable: true
     label: Package type
@@
         show_when:
           lambda_type: regional
         value: Image
-  - default: x86_64
+  - applied_by:
+      - stack
+    default: x86_64
     description: CPU architecture used by the function.
     id: architecture
     label: Architecture
@@
         value: x86_64
       - label: arm64
         value: arm64
-  - default: false
+  - applied_by:
+      - stack
+    default: false
     description: Publish a new immutable Lambda version on function updates. Required for Lambda@Edge and aliases that target published versions.
     id: version_publishing_enabled
     label: Version publishing
@@
     show_when:
       package_type: Zip
     type: section
-  - default: $values:first
+  - applied_by:
+      - stack
+    default: $values:first
     description: Lambda runtime for Zip packages.
     id: runtime
     label: Runtime
@@
         value: dotnet8
       - label: Go provided AL2023
         value: provided.al2023
-  - description: Function entrypoint for the zip package, such as index.handler.
+  - applied_by:
+      - stack
+    description: Function entrypoint for the zip package, such as index.handler.
     id: handler
     label: Handler
     placeholder: index.handler
@@
     show_when:
       package_type: Zip
     type: string
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: S3 bucket containing the deployment package. Leave empty to create a managed code bucket.
     id: s3_bucket
     label: Package S3 bucket
     show_when:
       package_type: Zip
     type: string
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: S3 key of the deployment package. Required when Package S3 bucket is set.
     id: s3_key
     label: Package S3 key
     show_when:
       package_type: Zip
     type: string
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: Name for the s3 bucket used for Lambda zip artifacts. Must be globally unique. Defaults to <function-name>-code-<account-id>.
     id: code_bucket_name
     immutable: true
@@
     show_when:
       package_type: Zip
     type: string
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     default: true
     description: Delete the code bucket even when it contains package objects during stack destroy.
     id: code_bucket_force_destroy_enabled
@@
     show_when:
       package_type: Zip
     type: boolean
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     default: bootstrap-package.zip
     description: S3 key for the initial bootstrap deployment package in the managed code bucket.
     id: placeholder_object_key
@@
   - id: section_build
     label: Build config
     type: section
-  - default: dockerfile
+  - applied_by:
+      - stack
+      - build
+      - deploy
+    default: dockerfile
     id: build_source
     label: Build source
     required: true
@@
         show_when:
           package_type: Image
         value: image_registry
-  - description: Repository containing the application source for Dockerfile or Railpack builds.
+  - applied_by:
+      - build
+      - deploy
+    description: Repository containing the application source for Dockerfile or Railpack builds.
     id: source_repo
     label: Git repository
     required: true
@@
         - nixpacks
         - dockerfile
     type: gitrepo
-  - default: .
+  - applied_by:
+      - build
+      - deploy
+    default: .
     description: Repository-relative source and build root.
     id: source_base_path
     label: Source base path
@@
         - nixpacks
         - dockerfile
     type: string
-  - default: /app
+  - applied_by:
+      - build
+      - deploy
+    default: /app
     description: Directory inside the built image that contains the Lambda package files.
     id: output_directory
     label: Package output directory
@@
         - dockerfile
       package_type: Zip
     type: string
-  - description: ECR repository URI without a tag or digest, such as 123456789012.dkr.ecr.us-east-1.amazonaws.com/my-function. The repository must be in the same region as the function. A repository in a different AWS account works when its repository policy grants pull access to the function's account and the Lambda service principal.
+  - applied_by:
+      - stack
+      - deploy
+    description: ECR repository URI without a tag or digest, such as 123456789012.dkr.ecr.us-east-1.amazonaws.com/my-function. The repository must be in the same region as the function. A repository in a different AWS account works when its repository policy grants pull access to the function's account and the Lambda service principal.
     id: image_repository
     label: Image repository
     placeholder: 123456789012.dkr.ecr.us-east-1.amazonaws.com/my-function
@@
       build_source: image_registry
       package_type: Image
     type: string
-  - description: Tag or digest used only to create the function before its first deployment. It must already exist in the image repository above. Deployments promote the tag or digest you pass at deploy time; changing this value afterward has no effect. Do not include the repository URI.
+  - applied_by:
+      - stack
+    description: Tag or digest used only to create the function before its first deployment. It must already exist in the image repository above. Deployments promote the tag or digest you pass at deploy time; changing this value afterward has no effect. Do not include the repository URI.
     id: initial_image_ref
     label: Initial image tag or digest
     placeholder: sha256:... or latest
@@
       package_type: Image
     type: string
   - add_button_label: Add cmd segment
+    applied_by:
+      - stack
     default: []
     description: Optional command arguments that override the image default command (CMD). Leave empty to use the image default.
     id: image_start_command
@@
       package_type: Image
     type: string_array
   - add_button_label: Add entry point segment
+    applied_by:
+      - stack
     collapsible: true
     default: []
     description: Optional entry point arguments that override the image default ENTRYPOINT.
@@
       lambda_type: regional
       package_type: Image
     type: string_array
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: Optional working directory override inside the image.
     id: image_working_directory
     label: Working directory
@@
     show_when:
       build_source: dockerfile
     type: section
-  - description: Path to the Dockerfile to use for the build, relative to the repository root or configured source base path.
+  - applied_by:
+      - build
+      - deploy
+    description: Path to the Dockerfile to use for the build, relative to the repository root or configured source base path.
     id: dockerfile
     label: Dockerfile path
     placeholder: Dockerfile
     show_when:
       build_source: dockerfile
     type: string
-  - description: Directory to use as the Docker build context, relative to the repository root or configured source base path.
+  - applied_by:
+      - build
+      - deploy
+    description: Directory to use as the Docker build context, relative to the repository root or configured source base path.
     id: dockerfile_context
     label: Docker build context path
     placeholder: .
@@
     show_when:
       build_source: nixpacks
     type: section
-  - id: nixpacks_install_cmd
+  - applied_by:
+      - build
+      - deploy
+    id: nixpacks_install_cmd
     label: Install command
     placeholder: Intelligent default based on your language & framework
     show_when:
       build_source: nixpacks
     type: string
-  - id: nixpacks_build_cmd
+  - applied_by:
+      - build
+      - deploy
+    id: nixpacks_build_cmd
     label: Build command
     placeholder: Intelligent default based on your language & framework
     show_when:
       build_source: nixpacks
     type: string
-  - id: nixpacks_start_cmd
+  - applied_by:
+      - build
+      - deploy
+    id: nixpacks_start_cmd
     label: Start command
     placeholder: Intelligent default based on your language & framework
     show_when:
       build_source: nixpacks
       package_type: Image
     type: string
-  - collapsible: true
+  - applied_by:
+      - build
+      - deploy
+    collapsible: true
     description: Path to a custom Nixpacks config file, relative to the repository root or configured source base path.
     id: nixpacks_config_file_path
     label: Nixpacks config file path
     show_when:
       build_source: nixpacks
     type: string
-  - collapsible: true
+  - applied_by:
+      - build
+      - deploy
+    collapsible: true
     description: Application path for Nixpacks to build, relative to the repository root or configured source base path.
     id: nixpacks_build_path
     label: Nixpacks build path
     show_when:
       build_source: nixpacks
     type: string
-  - collapsible: true
+  - applied_by:
+      - build
+      - deploy
+    collapsible: true
     description: Optional Nixpacks version to use for the build. Leave blank to use the default version.
     id: nixpacks_version
     label: Nixpacks version
     show_when:
       build_source: nixpacks
     type: string
-  - collapsible: true
+  - applied_by:
+      - build
+      - deploy
+    collapsible: true
     description: Additional Nix packages to install during the Nixpacks build.
     id: nixpacks_nix_pkgs
     label: Nix packages
     show_when:
       build_source: nixpacks
     type: string_array
-  - collapsible: true
+  - applied_by:
+      - build
+      - deploy
+    collapsible: true
     description: Additional APT packages to install during the Nixpacks build.
     id: nixpacks_apt_pkgs
     label: APT packages
     show_when:
       build_source: nixpacks
     type: string_array
-  - collapsible: true
+  - applied_by:
+      - build
+      - deploy
+    collapsible: true
     description: Additional Nix libraries to make available during the Nixpacks build.
     id: nixpacks_nix_libs
     label: Nix libraries
@@
     show_when:
       lambda_type: regional
     type: section
-  - default: 128
+  - applied_by:
+      - stack
+    default: 128
     description: Memory allocated to the function. Lambda CPU scales with memory.
     id:
... diff truncated ...

rvn-rds 1.2.0 -> 1.2.1

--- remote
+++ compiled
 inputs:
-  - id: network
+  - applied_by:
+      - stack
+    id: network
     immutable: true
     label: VPC network
     mapped_inputs:
-      - id: section_aws
+      - applied_by: []
+        id: section_aws
         label: AWS account & region
         type: section
-      - default: << ref.input.aws_account_id >>
+      - applied_by:
+          - stack
+        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 >>
+      - applied_by:
+          - stack
+        default: << ref.input.aws_region >>
         id: aws_region
         immutable: true
         label: Region
         type: string
         values: $values:aws/regions
-      - collapsible: true
+      - applied_by:
+          - stack
+        collapsible: true
         default: << ref.input.execution_environment_id >>
         description: Override the VPC, subnet, and security group for Pipeline Terraform runners. Must use the same AWS account as selected above.
         id: execution_environment_id
         label: Terraform execution environment
         type: string
         values: $values:ravion/execution_environments
-      - id: section_vpc
+      - applied_by: []
+        id: section_vpc
         label: VPC
         type: section
-      - default: <<ref.stack.output.vpc_id>>
+      - applied_by:
+          - stack
+        default: <<ref.stack.output.vpc_id>>
         id: vpc_id
         immutable: true
         label: VPC ID
         required: true
         type: string
       - add_button_label: Add private subnet ID
+        applied_by:
+          - stack
         default: <<ref.stack.output.private_subnet_ids>>
         description: Subnets for the RDS DB subnet group. Use private subnets for normal database deployments.
         id: subnet_ids
@@
   - id: section_database
     label: Database
     type: section
-  - default: <<project.given_id>>-<<environment.given_id>>
+  - applied_by:
+      - stack
+    default: <<project.given_id>>-<<environment.given_id>>
     description: Name prefix for all RDS resources.
     id: name
     immutable: true
@@
         pattern: ^[a-z0-9]([a-z0-9-]{0,38}[a-z0-9])?$
     required: true
     type: string
-  - default: none
+  - applied_by:
+      - stack
+    default: none
     id: restore_mode
     immutable: true
     label: Create or restore
@@
         value: snapshot
       - label: Point-in-time restore
         value: point_in_time
-  - id: db_name
+  - applied_by:
+      - stack
+    id: db_name
     immutable: true
     label: Database name
     patterns:
@@
         - oracle-se2-cdb
       restore_mode: none
     type: string
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     default: dbadmin
     id: username
     immutable: true
@@
     show_when:
       restore_mode: none
     type: string
-  - description: Snapshot identifier or ARN to restore into this new database. The snapshot must be compatible with the selected engine and instance settings.
+  - applied_by:
+      - stack
+    description: Snapshot identifier or ARN to restore into this new database. The snapshot must be compatible with the selected engine and instance settings.
     id: snapshot_identifier
     immutable: true
     label: Snapshot to restore
@@
     show_when:
       restore_mode: snapshot
     type: string
-  - default: true
+  - applied_by:
+      - stack
+    default: true
     description: Restore to the latest time AWS can recover from the selected source database backup.
     id: point_in_time_use_latest_restorable_time
     immutable: true
@@
     show_when:
       restore_mode: point_in_time
     type: boolean
-  - description: Restore to this UTC timestamp instead of the latest restorable time.
+  - applied_by:
+      - stack
+    description: Restore to this UTC timestamp instead of the latest restorable time.
     id: point_in_time_restore_time
     immutable: true
     label: Restore time
@@
       point_in_time_use_latest_restorable_time: false
       restore_mode: point_in_time
     type: string
-  - description: Source DB instance identifier to restore from.
+  - applied_by:
+      - stack
+    description: Source DB instance identifier to restore from.
     id: point_in_time_source_db_instance_identifier
     immutable: true
     label: Source DB instance identifier
@@
     show_when:
       restore_mode: point_in_time
     type: string
-  - description: ARN of the source automated backups to restore from. Use this for cross-region or retained automated backup restores.
+  - applied_by:
+      - stack
+    description: ARN of the source automated backups to restore from. Use this for cross-region or retained automated backup restores.
     id: point_in_time_source_db_instance_automated_backups_arn
     immutable: true
     label: Source automated backups ARN
@@
     show_when:
       restore_mode: point_in_time
     type: string
-  - description: Source DB resource ID to restore from when using automated backups.
+  - applied_by:
+      - stack
+    description: Source DB resource ID to restore from when using automated backups.
     id: point_in_time_source_dbi_resource_id
     immutable: true
     label: Source DB resource ID
@@
   - id: section_version
     label: Version
     type: section
-  - default: postgres
+  - applied_by:
+      - stack
+    default: postgres
     id: engine
     immutable: true
     label: Engine
@@
         value: sqlserver-ex
       - label: SQL Server Web
         value: sqlserver-web
-  - description: "Examples: 15 for PostgreSQL or SQL Server, 8.0 for MySQL, 19 for Oracle."
+  - applied_by:
+      - stack
+    description: "Examples: 15 for PostgreSQL or SQL Server, 8.0 for MySQL, 19 for Oracle."
     id: engine_major_version
     immutable: true
     label: Engine major version
     placeholder: "15"
     required: true
     type: string
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: "Optional minor engine version appended to the major version. Example: major 15 and minor 4 becomes 15.4."
     id: engine_minor_version
     label: Engine minor version
     placeholder: "4"
     required: false
     type: string
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     default: true
     description: Enable automatic minor engine version upgrades during the configured maintenance window.
     id: minor_version_auto_upgrade_enabled
@@
   - id: section_size
     label: Size & Storage
     type: section
-  - default: db.t4g.micro
+  - applied_by:
+      - stack
+    default: db.t4g.micro
     description: RDS instance size, such as db.t4g.micro or db.r6g.large.
     id: instance_class
     label: Instance class
     placeholder: db.t4g.micro
     required: true
     type: string
-  - default: 20
+  - applied_by:
+      - stack
+    default: 20
     description: AWS supports increasing allocated storage after creation, but not reducing it in place.
     id: allocated_storage
     label: Allocated storage (GiB)
@@
     min: 20
     required: true
     type: number
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     default: 0
     description: Upper limit for RDS storage autoscaling. Use 0 to disable. AWS can grow storage up to this limit, but storage cannot be reduced in place.
     id: max_allocated_storage
@@
     max: 65536
     min: 0
     type: number
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     default: gp3
     id: storage_type
     label: Storage type
@@
         value: io2
       - label: standard
         value: standard
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     id: iops
     label: Provisioned IOPS
     max: 256000
@@
         - io1
         - io2
     type: number
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     id: storage_throughput
     label: Storage throughput (MiB/s)
     max: 1000
@@
     show_when:
       storage_type: gp3
     type: number
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     id: kms_key_id
     immutable: true
     label: Storage KMS key ARN
     placeholder: arn:aws:kms:...
     required: false
     type: string
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     id: ca_cert_identifier
     label: CA certificate identifier
     required: false
@@
   - id: section_access
     label: Network access
     type: section
-  - default: false
+  - applied_by:
+      - stack
+    default: false
     description: Keep disabled for production databases unless public access is intentional.
     id: public_access_enabled
     label: Publicly accessible
     type: boolean
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: Leave blank to use the engine default port.
     id: port
     label: Port
@@
     min: 1
     required: false
     type: number
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     default: true
     id: security_group_creation_enabled
     immutable: true
     label: Security group creation
     type: boolean
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     id: security_group_id
     label: Existing security group ID
     placeholder: sg-...
@@
       security_group_creation_enabled: false
     type: string
   - add_button_label: Add security group ID
+    applied_by:
+      - stack
     collapsible: true
     id: allowed_security_group_ids
     label: Allowed security groups
@@
       security_group_creation_enabled: true
     type: string_array
   - add_button_label: Add CIDR block
+    applied_by:
+      - stack
     collapsible: true
     id: allowed_cidr_blocks
     label: Allowed CIDR blocks
@@
         - sqlserver-ex
         - sqlserver-web
     type: section
-  - default: false
+  - applied_by:
+      - stack
+    default: false
     description: Create an RDS Proxy in front of the database for connection pooling and improved failover handling. Applications keep connecting to the database endpoint until you update their connection string to the proxy endpoint output.
     id: proxy_creation_enabled
     label: RDS Proxy
@@
         - sqlserver-web
     type: boolean
   - add_button_label: Add secret ARN
+    applied_by:
+      - stack
     collapsible: true
     description: Secrets Manager secrets containing database credentials for the proxy. Leave blank to use the managed master user secret.
     id: proxy_auth_secret_arns
@@
       proxy_creation_enabled: true
     type: string_array
   - add_button_label: Add KMS key ARN
+    applied_by:
+      - stack
     collapsible: true
     description: KMS keys used to encrypt the auth secrets when using customer-managed keys. The master user secret KMS key is included automatically.
     id: proxy_secret_kms_key_arns
@@
     show_when:
       proxy_creation_enabled: true
     type: string_array
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     default: false
     description: Require IAM authentication for client connections to the proxy.
     id: proxy_iam_auth_enabled
@@
     show_when:
       proxy_creation_enabled: true
     type: boolean
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     default: true
     description: Require TLS for client connections to the proxy.
     id: proxy_tls_requirement_enabled
@@
     show_when:
       proxy_creation_enabled: true
     type: boolean
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     default: false
     description: Log detailed connection information, including SQL statements, to CloudWatch Logs.
     id: proxy_debug_logging_enabled
@@
     show_when:
       proxy_creat
... diff truncated ...

rvn-rds-proxy 0.1.0 -> 0.1.1

--- remote
+++ compiled
 inputs:
-  - id: network
+  - applied_by:
+      - stack
+    id: network
     immutable: true
     label: VPC network
     mapped_inputs:
-      - id: section_aws
+      - applied_by: []
+        id: section_aws
         label: AWS account & region
         type: section
-      - default: << ref.input.aws_account_id >>
+      - applied_by:
+          - stack
+        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 >>
+      - applied_by:
+          - stack
+        default: << ref.input.aws_region >>
         id: aws_region
         immutable: true
         label: Region
         type: string
         values: $values:aws/regions
-      - collapsible: true
+      - applied_by:
+          - stack
+        collapsible: true
         default: << ref.input.execution_environment_id >>
         description: Override the VPC, subnet, and security group for Pipeline Terraform runners. Must use the same AWS account as selected above.
         id: execution_environment_id
         label: Terraform execution environment
         type: string
         values: $values:ravion/execution_environments
-      - id: section_vpc
+      - applied_by: []
+        id: section_vpc
         label: VPC
         type: section
-      - default: <<ref.stack.output.vpc_id>>
+      - applied_by:
+          - stack
+        default: <<ref.stack.output.vpc_id>>
         id: vpc_id
         immutable: true
         label: VPC ID
         required: true
         type: string
       - add_button_label: Add private subnet ID
+        applied_by:
+          - stack
         default: <<ref.stack.output.private_subnet_ids>>
         description: Subnets for the RDS Proxy. Use private subnets for normal deployments.
         id: subnet_ids
@@
   - id: section_proxy
     label: Proxy
     type: section
-  - default: <<project.given_id>>-<<environment.given_id>>-proxy
+  - applied_by:
+      - stack
+    default: <<project.given_id>>-<<environment.given_id>>-proxy
     description: Name prefix for all proxy resources.
     id: name
     immutable: true
@@
         pattern: ^[a-z0-9]([a-z0-9-]{0,38}[a-z0-9])?$
     required: true
     type: string
-  - default: POSTGRESQL
+  - applied_by:
+      - stack
+    default: POSTGRESQL
     description: Must match the engine of the target database.
     id: engine_family
     immutable: true
@@
   - id: section_target
     label: Target database
     type: section
-  - default: db_instance
+  - applied_by: []
+    default: db_instance
     description: Register an RDS instance or an Aurora cluster as the proxy target.
     id: target_type
     label: Target type
@@
         value: db_instance
       - label: Aurora cluster
         value: db_cluster
-  - description: RDS database module to register as the proxy target. Add this proxy's security group to that module's allowed security groups so the database accepts proxy connections.
+  - applied_by:
+      - stack
+    description: RDS database module to register as the proxy target. Add this proxy's security group to that module's allowed security groups so the database accepts proxy connections.
     id: rds_database
     label: RDS database
     mapped_inputs:
-      - default: <<ref.stack.output.db_instance_identifier>>
+      - applied_by:
+          - stack
+        default: <<ref.stack.output.db_instance_identifier>>
         description: Instance identifier from the selected RDS module, or the identifier of an existing RDS instance.
         id: rds_db_instance_identifier
         label: DB instance identifier
         placeholder: my-db
         required: true
         type: string
-      - default: <<ref.stack.output.master_user_secret_arn>>
+      - applied_by:
+          - stack
+        default: <<ref.stack.output.master_user_secret_arn>>
         description: Managed master user secret from the selected RDS module. Blank when that database does not manage its password in Secrets Manager; add auth secret ARNs instead.
         id: rds_master_user_secret_arn
         label: Master user secret ARN
         placeholder: arn:aws:secretsmanager:...
         required: false
         type: string
-      - default: <<ref.stack.output.port>>
+      - applied_by:
+          - stack
+        default: <<ref.stack.output.port>>
         description: Database port from the selected RDS module. Leave blank to use the engine family default port.
         id: rds_port
         label: Database port
@@
     show_when:
       target_type: db_instance
     type: $ref:rvn-rds
-  - description: Aurora cluster module to register as the proxy target. Add this proxy's security group to that module's allowed security groups so the cluster accepts proxy connections.
+  - applied_by:
+      - stack
+    description: Aurora cluster module to register as the proxy target. Add this proxy's security group to that module's allowed security groups so the cluster accepts proxy connections.
     id: aurora_database
     label: Aurora cluster
     mapped_inputs:
-      - default: <<ref.stack.output.cluster_identifier>>
+      - applied_by:
+          - stack
+        default: <<ref.stack.output.cluster_identifier>>
         description: Cluster identifier from the selected Aurora module, or the identifier of an existing Aurora cluster.
         id: aurora_cluster_identifier
         label: DB cluster identifier
         placeholder: my-aurora
         required: true
         type: string
-      - default: <<ref.stack.output.cluster_master_user_secret_arn>>
+      - applied_by:
+          - stack
+        default: <<ref.stack.output.cluster_master_user_secret_arn>>
         description: Managed master user secret from the selected Aurora module. Blank when that cluster does not manage its password in Secrets Manager; add auth secret ARNs instead.
         id: aurora_master_user_secret_arn
         label: Master user secret ARN
         placeholder: arn:aws:secretsmanager:...
         required: false
         type: string
-      - default: <<ref.stack.output.cluster_port>>
+      - applied_by:
+          - stack
+        default: <<ref.stack.output.cluster_port>>
         description: Cluster port from the selected Aurora module. Leave blank to use the engine family default port.
         id: aurora_port
         label: Database port
@@
     label: Authentication
     type: section
   - add_button_label: Add secret ARN
+    applied_by:
+      - stack
     description: Secrets Manager secrets containing database credentials the proxy uses to connect to the target database. Leave blank to use the managed master user secret of the selected database module.
     id: auth_secret_arns
     label: Auth secret ARNs
@@
     required: false
     type: string_array
   - add_button_label: Add KMS key ARN
+    applied_by:
+      - stack
     collapsible: true
     description: KMS keys used to encrypt the auth secrets when using customer-managed keys.
     id: secret_kms_key_arns
@@
     placeholder: arn:aws:kms:...
     required: false
     type: string_array
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     default: false
     description: Require IAM authentication for client connections to the proxy.
     id: iam_auth_enabled
     label: IAM authentication
     type: boolean
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     default: true
     description: Require TLS for client connections to the proxy.
     id: tls_requirement_enabled
     label: Require TLS
     type: boolean
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     default: true
     description: Create the IAM role the proxy uses to read credentials from Secrets Manager. Disable this only when you want to provide an existing role.
     id: iam_role_creation_enabled
     immutable: true
     label: IAM role creation
     type: boolean
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     id: iam_role_arn
     label: Existing IAM role ARN
     placeholder: arn:aws:iam::...
@@
   - id: section_access
     label: Network access
     type: section
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: "Leave blank to use the port of the selected database module, or the engine family default port: 5432 for PostgreSQL, 3306 for MySQL, or 1433 for SQL Server."
     id: port
     label: Port
@@
     min: 1
     required: false
     type: number
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     default: true
     id: security_group_creation_enabled
     immutable: true
     label: Security group creation
     type: boolean
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     id: security_group_id
     label: Existing security group ID
     placeholder: sg-...
@@
       security_group_creation_enabled: false
     type: string
   - add_button_label: Add security group ID
+    applied_by:
+      - stack
     collapsible: true
     id: allowed_security_group_ids
     label: Allowed security groups
@@
       security_group_creation_enabled: true
     type: string_array
   - add_button_label: Add CIDR block
+    applied_by:
+      - stack
     collapsible: true
     id: allowed_cidr_blocks
     label: Allowed CIDR blocks
@@
   - id: section_pool
     label: Connection pool
     type: section
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     default: 1800
     id: idle_client_timeout
     label: Idle client timeout (seconds)
     max: 28800
     min: 1
     type: number
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     default: 120
     id: connection_borrow_timeout
     label: Connection borrow timeout (seconds)
     min: 0
     type: number
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     default: 100
     description: Maximum size of the connection pool as a percentage of the database max_connections setting.
     id: max_connections_percent
@@
     max: 100
     min: 1
     type: number
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     default: 50
     description: Maximum idle connections kept open, as a percentage of the database max_connections setting.
     id: max_idle_connections_percent
@@
     min: 0
     type: number
   - add_button_label: Add filter
+    applied_by:
+      - stack
     collapsible: true
     id: session_pinning_filters
     label: Session pinning filters
@@
     values:
       - label: EXCLUDE_VARIABLE_SETS
         value: EXCLUDE_VARIABLE_SETS
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: SQL statements the proxy runs when opening each new database connection.
     id: init_query
     label: Initialization query
     placeholder: SET time_zone = 'UTC'
     required: false
     type: string
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     default: false
     description: Log detailed connection information, including SQL statements, to CloudWatch Logs.
     id: debug_logging_enabled
@@
   - id: section_misc
     label: Misc
     type: section
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: A map of tags to assign to all resources. Default tags are `Owner`, `ProjectGivenId`, `EnvironmentGivenId`, `ModuleGivenId`, `ModuleId`
     id: tags
     label: Tags
@@
   - id: section_advanced
     label: Terraform settings
     type: section
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: Override the environment's default version for this module
     id: opentofu_version
     label: OpenTofu version override
     required: false
     type: string
     
... diff truncated ...

rvn-route53 1.0.3 -> 1.0.4

--- remote
+++ compiled
   - id: section_aws
     label: AWS account & region
     type: section
-  - id: aws_account_id
+  - applied_by:
+      - stack
+    id: aws_account_id
     immutable: true
     label: AWS account
     required: true
     type: string
     values: $values:ravion/aws_accounts
-  - id: aws_region
+  - applied_by:
+      - stack
+    id: aws_region
     immutable: true
     label: Region
     required: true
@@
   - id: section_hosted_zone
     label: Hosted zone and name server
     type: section
-  - default: true
+  - applied_by:
+      - stack
+    default: true
     description: Create a new Route 53 hosted zone, which is Route 53's DNS zone and name-server setup for a domain. Disable this to manage records in an existing hosted zone.
     id: zone_creation_enabled
     immutable: true
     label: Create hosted zone
     type: boolean
-  - description: Existing Route 53 hosted zone ID to manage records in. A hosted zone is Route 53's DNS zone and name-server setup for a domain. Required when Create hosted zone is disabled.
+  - applied_by:
+      - stack
+    description: Existing Route 53 hosted zone ID to manage records in. A hosted zone is Route 53's DNS zone and name-server setup for a domain. Required when Create hosted zone is disabled.
     id: zone_id
     immutable: true
     label: Hosted zone ID
@@
     show_when:
       zone_creation_enabled: false
     type: string
-  - description: Fully qualified domain name for the hosted zone.
+  - applied_by:
+      - stack
+    description: Fully qualified domain name for the hosted zone.
     id: name
     immutable: true
     label: Domain name
@@
     show_when:
       zone_creation_enabled: true
     type: string
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     default: Managed in Ravion
     description: Comment stored on the hosted zone.
     id: comment
@@
     show_when:
       zone_creation_enabled: true
     type: string
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     default: false
     description: Destroy all records in the hosted zone when the created zone is destroyed.
     id: record_force_destroy_enabled
@@
     show_when:
       zone_creation_enabled: true
     type: boolean
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: Reusable delegation set ID for a public hosted zone. Use this when you want multiple hosted zones to use the same authoritative name servers, for example to keep registrar or parent-zone delegation consistent across related domains.
     id: delegation_set_id
     label: Delegation set ID
@@
       private_zone_enabled: false
       zone_creation_enabled: true
     type: string
-  - default: false
+  - applied_by:
+      - stack
+    default: false
     description: Create a private hosted zone associated with VPCs instead of a public hosted zone.
     id: private_zone_enabled
     immutable: true
@@
     show_when:
       zone_creation_enabled: true
     type: boolean
-  - description: VPCs to associate with the private hosted zone.
+  - applied_by:
+      - stack
+    description: VPCs to associate with the private hosted zone.
     id: vpc_associations
     item_inputs:
-      - description: VPC ID to associate with the private hosted zone.
+      - applied_by:
+          - stack
+        description: VPC ID to associate with the private hosted zone.
         id: vpc_id
         label: VPC ID
         patterns:
@@
         placeholder: vpc-1234567890abcdef0
         required: true
         type: string
-      - description: AWS region for the VPC association. Defaults to the stack region when empty.
+      - applied_by:
+          - stack
+        description: AWS region for the VPC association. Defaults to the stack region when empty.
         id: vpc_region
         label: VPC region
         required: false
@@
   - id: section_records
     label: DNS records
     type: section
-  - description: DNS records to create in the hosted zone.
+  - applied_by:
+      - stack
+    description: DNS records to create in the hosted zone.
     id: records
     item_inputs:
-      - description: DNS record type.
+      - applied_by:
+          - stack
+        description: DNS record type.
         id: type
         label: Record type
         required: true
@@
             value: TXT
           - label: DS
             value: DS
-      - description: Fully qualified record name.
+      - applied_by:
+          - stack
+        description: Fully qualified record name.
         id: name
         label: Record name
         placeholder: www.example.com
         required: true
         type: string
-      - default: standard
+      - applied_by:
+          - stack
+        default: standard
         description: Choose standard record values with a TTL, or an AWS alias target such as a load balancer or CloudFront distribution.
         id: target_type
         label: Target type
@@
             label: Alias target
             value: alias
       - add_button_label: Add record value
+        applied_by:
+          - stack
         description: Values for a standard DNS record. Leave empty for alias records.
         id: records
         label: Record values
@@
               - CNAME
               - SOA
         type: string_array
-      - description: Value for a standard DNS record type that accepts exactly one value.
+      - applied_by:
+          - stack
+        description: Value for a standard DNS record type that accepts exactly one value.
         id: record_value
         label: Record value
         required: true
@@
             - CNAME
             - SOA
         type: string
-      - description: DNS name of the AWS target resource. For an ALB or NLB, use the load balancer DNS name. For CloudFront, use the distribution domain name such as d111111abcdef8.cloudfront.net.
+      - applied_by:
+          - stack
+        description: DNS name of the AWS target resource. For an ALB or NLB, use the load balancer DNS name. For CloudFront, use the distribution domain name such as d111111abcdef8.cloudfront.net.
         id: alias_name
         label: Alias target DNS name
         placeholder: dualstack.example-alb.us-east-1.elb.amazonaws.com
@@
             - A
             - AAAA
         type: string
-      - description: Hosted zone ID of the AWS target resource, not this domain's hosted zone ID. For an ALB/NLB, use the load balancer canonical hosted zone ID from AWS. For CloudFront, use Z2FDTNDATAQYW2. Regional services such as API Gateway or S3 website endpoints have service and region-specific hosted zone IDs.
+      - applied_by:
+          - stack
+        description: Hosted zone ID of the AWS target resource, not this domain's hosted zone ID. For an ALB/NLB, use the load balancer canonical hosted zone ID from AWS. For CloudFront, use Z2FDTNDATAQYW2. Regional services such as API Gateway or S3 website endpoints have service and region-specific hosted zone IDs.
         id: alias_zone_id
         label: Alias target hosted zone ID
         placeholder: Z35SXDOTRQ7X7K
@@
             - A
             - AAAA
         type: string
-      - default: false
+      - applied_by:
+          - stack
+        default: false
         description: Let Route 53 consider the target resource health when answering DNS queries. This is commonly useful for load balancers. Leave disabled for targets that do not support Route 53 target health evaluation, such as CloudFront.
         id: alias_evaluate_target_health
         label: Evaluate target health
@@
             - A
             - AAAA
         type: boolean
-      - collapsible: true
+      - applied_by:
+          - stack
+        collapsible: true
         description: Route 53 health check ID for this record.
         id: health_check_id
         label: Health check ID
         type: string
-      - collapsible: true
+      - applied_by:
+          - stack
+        collapsible: true
         default: false
         description: Allow this record to overwrite an existing Route 53 record.
         id: allow_overwrite
         label: Allow overwrite
         type: boolean
-      - collapsible: true
+      - applied_by:
+          - stack
+        collapsible: true
         default: 300
         description: TTL in seconds for standard records. Lower values update faster but can increase DNS query volume; 300 seconds is a common default.
         id: ttl
@@
           target_type:
             not: alias
         type: number
-      - collapsible: true
+      - applied_by:
+          - stack
+        collapsible: true
         default: simple
         description: Optional Route 53 routing policy for this record.
         id: routing_policy
@@
           - description: Return multiple healthy records in DNS responses. Use this for simple DNS-level load distribution across several endpoints.
             label: Multivalue answer
             value: multivalue
-      - description: Unique identifier for a record that uses a routing policy. Required when multiple records share the same name and type.
+      - applied_by:
+          - stack
+        description: Unique identifier for a record that uses a routing policy. Required when multiple records share the same name and type.
         id: set_identifier
         label: Set identifier
         required: true
@@
           routing_policy:
             not: simple
         type: string
-      - description: Weight for weighted routing.
+      - applied_by:
+          - stack
+        description: Weight for weighted routing.
         id: weighted_routing_policy_weight
         label: Weight
         min: 0
@@
         show_when:
           routing_policy: weighted
         type: number
-      - description: Failover role for failover routing.
+      - applied_by:
+          - stack
+        description: Failover role for failover routing.
         id: failover_routing_policy_type
         label: Failover type
         required: true
@@
             value: PRIMARY
           - label: Secondary
             value: SECONDARY
-      - description: AWS region for latency routing.
+      - applied_by:
+          - stack
+        description: AWS region for latency routing.
         id: latency_routing_policy_region
         label: Latency region
         required: true
@@
           routing_policy: latency
         type: string
         values: $values:aws/regions
-      - description: Continent code for geolocation routing.
+      - applied_by:
+          - stack
+        description: Continent code for geolocation routing.
         id: geolocation_routing_policy_continent
         label: Continent code
         placeholder: NA
         show_when:
           routing_policy: geolocation
         type: string
-      - description: Country code for geolocation routing.
+      - applied_by:
+          - stack
+        description: Country code for geolocation routing.
         id: geolocation_routing_policy_country
         label: Country code
         placeholder: US
         show_when:
           routing_policy: geolocation
         type: string
-      - description: Subdivision code for geolocation routing.
+      - applied_by:
+          - stack
+        description: Subdivision code for geolocation routing.
         id: geolocation_routing_policy_subdivision
         label: Subdivision code
         placeholder: CA
@@
     show_when:
       private_zone_enabled: false
     type: section
-  - default: false
+  - applied_by:
+      - stack
+    default: false
     description: Enable Route 53 query logging for the public hosted zone.
     id: query_logging_enabled
     label: Query logging
     show_when:
       private_zone_enabled: false
     type: boolean
-  - default: true
+  - applied_by:
+      - stack
+    default: true
     description: Create the CloudWatch Logs log group and resource policy in us-east-1 for Route 53 query logs.
     id: query_log_gr
... diff truncated ...

rvn-s3 1.0.1 -> 1.0.2

--- remote
+++ compiled
   - id: section_aws
     label: AWS account & region
     type: section
-  - id: aws_account_id
+  - applied_by:
+      - stack
+    id: aws_account_id
     immutable: true
     label: AWS account
     required: true
     type: string
     values: $values:ravion/aws_accounts
-  - id: aws_region
+  - applied_by:
+      - stack
+    id: aws_region
     immutable: true
     label: Region
     required: true
@@
   - id: section_bucket
     label: Bucket
     type: section
-  - default: <<project.given_id>>-<<environment.given_id>>-<<module.given_id>>
+  - applied_by:
+      - stack
+    default: <<project.given_id>>-<<environment.given_id>>-<<module.given_id>>
     description: Globally unique S3 bucket name.
     id: name
     immutable: true
@@
         pattern: ^(?!xn--)(?!.*-s3alias$).*$
     required: true
     type: string
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     default: false
     description: Delete the bucket even when it contains objects. Use with caution.
     id: force_destroy_enabled
@@
   - id: section_public_access
     label: Public access block
     type: section
-  - default: true
+  - applied_by:
+      - stack
+    default: true
     description: Block public ACLs for this bucket.
     id: block_public_acls
     label: Block public ACLs
     type: boolean
-  - default: true
+  - applied_by:
+      - stack
+    default: true
     description: Block public bucket policies for this bucket.
     id: block_public_policy
     label: Block public policies
     type: boolean
-  - default: true
+  - applied_by:
+      - stack
+    default: true
     description: Ignore public ACLs on this bucket and its objects.
     id: ignore_public_acls
     label: Ignore public ACLs
     type: boolean
-  - default: true
+  - applied_by:
+      - stack
+    default: true
     description: Restrict public bucket policies to AWS service principals and authorized users in this account.
     id: restrict_public_buckets
     label: Restrict public buckets
@@
   - id: section_encryption
     label: Encryption
     type: section
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: Optional AWS KMS key ID or ARN for SSE-KMS. Leave empty to use SSE-S3 AES256 encryption.
     id: kms_key_id
     label: KMS key ID
     placeholder: arn:aws:kms:us-east-1:123456789012:key/abc-123
     type: string
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     default: true
     description: Enable S3 Bucket Keys for SSE-KMS to reduce KMS request costs. Applies only when KMS key ID is set.
     id: bucket_key_enabled
@@
   - id: section_versioning
     label: Versioning
     type: section
-  - default: false
+  - applied_by:
+      - stack
+    default: false
     description: Keep multiple versions of objects in the bucket.
     id: versioning_enabled
     label: Versioning
@@
   - id: section_lifecycle
     label: Lifecycle rules
     type: section
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     default: []
     description: Configure common lifecycle rules with form fields. Use advanced lifecycle rules below for multiple transitions, tag filters, or less common combinations.
     id: lifecycle_rule_forms
     item_inputs:
-      - description: Unique identifier for this lifecycle rule. Use letters, numbers, periods, underscores, or hyphens.
+      - applied_by:
+          - stack
+        description: Unique identifier for this lifecycle rule. Use letters, numbers, periods, underscores, or hyphens.
         id: id
         label: Rule ID
         patterns:
@@
             pattern: ^[A-Za-z0-9._-]{1,255}$
         required: true
         type: string
-      - default: true
+      - applied_by:
+          - stack
+        default: true
         description: Whether this lifecycle rule is enabled.
         id: enabled
         label: Enabled
         type: boolean
-      - description: Object key prefix matched by this rule. Leave empty to apply to the whole bucket.
+      - applied_by:
+          - stack
+        description: Object key prefix matched by this rule. Leave empty to apply to the whole bucket.
         id: prefix
         label: Prefix
         required: false
         type: string
-      - description: Days after object creation when current versions expire.
+      - applied_by:
+          - stack
+        description: Days after object creation when current versions expire.
         id: expiration_days
         label: Expiration days
         min: 1
         required: false
         type: number
-      - description: Date when current versions expire, in YYYY-MM-DD format. Use either expiration days or expiration date, not both.
+      - applied_by:
+          - stack
+        description: Date when current versions expire, in YYYY-MM-DD format. Use either expiration days or expiration date, not both.
         id: expiration_date
         label: Expiration date
         patterns:
@@
             pattern: ^\d{4}-\d{2}-\d{2}$
         required: false
         type: string
-      - default: false
+      - applied_by:
+          - stack
+        default: false
         description: Expire delete markers when they are the only remaining version.
         id: expiration_expired_object_delete_marker_enabled
         label: Expire delete markers
         type: boolean
-      - description: Days after an object becomes noncurrent when noncurrent versions expire.
+      - applied_by:
+          - stack
+        description: Days after an object becomes noncurrent when noncurrent versions expire.
         id: noncurrent_version_expiration_days
         label: Noncurrent expiration days
         min: 1
         required: false
         type: number
-      - description: Number of newer noncurrent versions to retain before noncurrent expiration applies.
+      - applied_by:
+          - stack
+        description: Number of newer noncurrent versions to retain before noncurrent expiration applies.
         id: noncurrent_version_newer_noncurrent_versions
         label: Newer noncurrent versions to retain
         min: 1
         required: false
         type: number
-      - description: Storage class for a current version transition.
+      - applied_by:
+          - stack
+        description: Storage class for a current version transition.
         id: transition_storage_class
         label: Transition storage class
         required: false
@@
             value: DEEP_ARCHIVE
           - label: Glacier Instant Retrieval
             value: GLACIER_IR
-      - description: Days after object creation when the current version transitions.
+      - applied_by:
+          - stack
+        description: Days after object creation when the current version transitions.
         id: transition_days
         label: Transition days
         required: false
         type: number
-      - description: Date when current versions transition, in YYYY-MM-DD format. Use either transition days or transition date, not both.
+      - applied_by:
+          - stack
+        description: Date when current versions transition, in YYYY-MM-DD format. Use either transition days or transition date, not both.
         id: transition_date
         label: Transition date
         patterns:
@@
             pattern: ^\d{4}-\d{2}-\d{2}$
         required: false
         type: string
-      - description: Storage class for a noncurrent version transition.
+      - applied_by:
+          - stack
+        description: Storage class for a noncurrent version transition.
         id: noncurrent_transition_storage_class
         label: Noncurrent transition storage class
         required: false
@@
             value: DEEP_ARCHIVE
           - label: Glacier Instant Retrieval
             value: GLACIER_IR
-      - description: Days after an object becomes noncurrent when it transitions.
+      - applied_by:
+          - stack
+        description: Days after an object becomes noncurrent when it transitions.
         id: noncurrent_transition_days
         label: Noncurrent transition days
         required: false
         type: number
-      - description: Number of newer noncurrent versions to retain before noncurrent transition applies.
+      - applied_by:
+          - stack
+        description: Number of newer noncurrent versions to retain before noncurrent transition applies.
         id: noncurrent_transition_newer_noncurrent_versions
         label: Newer noncurrent versions before transition
         required: false
         type: number
-      - description: Days after initiation when incomplete multipart uploads are aborted.
+      - applied_by:
+          - stack
+        description: Days after initiation when incomplete multipart uploads are aborted.
         id: abort_incomplete_multipart_upload_days
         label: Abort incomplete multipart uploads days
         min: 1
@@
     label: Lifecycle rules
     required: false
     type: object_array
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     default: []
     description: Advanced lifecycle rules in the Terraform lifecycle rule shape. Use this for tag filters, multiple transitions, or other combinations not covered by the form above.
     id: lifecycle_rules_raw
@@
     label: Bucket policy
     type: section
   - add_button_label: Add policy template
+    applied_by:
+      - stack
     default: []
     description: Prebuilt bucket policy statements to add.
     id: policy_templates
@@
         label: CloudFront OAC read
         value: cloudfront_oac_read
   - add_button_label: Add distribution ARN
+    applied_by:
+      - stack
     collapsible: true
     default: []
     description: CloudFront distribution ARNs allowed to read objects when the CloudFront OAC read policy template is selected.
@@
         pattern: ^arn:aws:cloudfront::[0-9]{12}:distribution/[A-Z0-9]+$
     required: false
     type: string_array
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: Custom bucket policy JSON document. If policy templates are also selected, statements are merged.
     id: custom_policy
     label: Custom policy JSON
@@
   - id: section_cors
     label: CORS
     type: section
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     default: []
     description: Configure Cross-Origin Resource Sharing rules for browser access to bucket objects.
     id: cors_rules
     item_inputs:
-      - description: Optional unique identifier for this CORS rule.
+      - applied_by:
+          - stack
+        description: Optional unique identifier for this CORS rule.
         id: id
         label: Rule ID
         required: false
         type: string
       - add_button_label: Add allowed origin
+        applied_by:
+          - stack
         description: Origins allowed to make cross-origin requests to this bucket.
         id: allowed_origins
         label: Allowed origins
@@
         required: true
         type: string_array
       - add_button_label: Add allowed method
+        applied_by:
+          - stack
         description: HTTP methods allowed for cross-origin requests.
         id: allowed_methods
         label: Allowed methods
@@
           - label: DELETE
             value: DELETE
       - add_button_label: Add allowed header
+        applied_by:
+          - stack
         collapsible: true
         default: []
         description: Request headers allowed in cross-origin requests. Use * to allow any header.
@@
         required: false
         type: string_array
       - add_button_label: Add exposed header
+        applied_by:
+          - stack
         collapsible: true
         default: []
         description: Response headers browsers may expose to client code.
@@
         label: Exposed headers
         required: false
         type: string_array
-      - collapsible: true
+
... diff truncated ...

rvn-stack 1.2.4 -> 1.2.5

--- remote
+++ compiled
   - id: section_aws
     label: Where to run Terraform plan & apply
     type: section
-  - description: Where to execute the Terraform plan & apply steps
+  - applied_by:
+      - stack
+    description: Where to execute the Terraform plan & apply steps
     id: aws_account_id
     label: AWS Account
     required: true
@@
       default_networking: true
     type: string
     values: $values:ravion/aws_accounts
-  - default: true
+  - applied_by:
+      - stack
+    default: true
     id: default_networking
     label: Use default VPC, subnet and security group
     type: boolean
-  - description: Where to execute the Terraform plan & apply steps
+  - applied_by:
+      - stack
+    description: Where to execute the Terraform plan & apply steps
     id: aws_region
     label: Region
     required: true
@@
       default_networking: true
     type: string
     values: $values:aws/regions
-  - description: Specify the VPC, subnet, and security group for Pipeline Terraform runners. Defaults to the Environment's default Execution Environment
+  - applied_by:
+      - stack
+    description: Specify the VPC, subnet, and security group for Pipeline Terraform runners. Defaults to the Environment's default Execution Environment
     id: execution_environment_id
     label: Execution environment
     required: false
@@
   - id: section_source
     label: Source code
     type: section
-  - id: repo
+  - applied_by:
+      - stack
+    id: repo
     label: Git repository
     placeholder: https://github.com/org/repo.git
     required: true
     type: gitrepo
-  - default: main
+  - applied_by:
+      - stack
+    default: main
     id: primary_branch
     label: Primary branch
     required: true
     type: string
-  - description: Folder containing your Terraform files (relative to repo root)
+  - applied_by:
+      - stack
+    description: Folder containing your Terraform files (relative to repo root)
     id: base_path
     label: Base path
     placeholder: terraform
     type: string
   - add_button_label: Add path
+    applied_by:
+      - stack
     default:
       - <<module.input.base_path>>/**
     description: File paths glob patterns (e.g., `src/**`) that trigger a pipeline run when changed. Defaults to `**`
@@
     label: Stack inputs
     type: section
   - add_button_label: Add variable file
+    applied_by:
+      - stack
     description: Relative paths from base path to `.tfvars` or `.tfvars.json` files (equivalent to -var-file flags)
     id: terraform_variable_files
     label: Terraform variable files
     placeholder: prod.tfvars
     type: string_array
-  - description: Variables passed to Terraform/OpenTofu (equivalent to -var flags)
+  - applied_by:
+      - stack
+    description: Variables passed to Terraform/OpenTofu (equivalent to -var flags)
     id: tf_variables
     label: Terraform variables
     placeholder: key/value format
     type: object
-  - id: env_variables
+  - applied_by:
+      - stack
+    id: env_variables
     label: Environment variables
     placeholder: key/value format with support for from_parameter_store and from_secrets_manager
     type: object
   - id: section_iac
     label: IaC tool
     type: section
-  - default: opentofu
+  - applied_by:
+      - stack
+    default: opentofu
     description: Terraform is no longer free open source. OpenTofu is the popular community fork with full Terraform compatibility.
     id: tool
     label: Tool
@@
         value: opentofu
       - label: Terraform (FOSS, limited < v1.6.0)
         value: terraform
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     default: $values:first
     id: terraform_version
     label: Terraform version
@@
       tool: terraform
     type: string
     values: $values:terraform/versions
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     default: $values:first
     id: opentofu_version
     label: OpenTofu version
@@
       tool: opentofu
     type: string
     values: $values:opentofu/versions
-  - default: true
+  - applied_by:
+      - stack
+    default: true
     description: Use Ravion-managed state. Your Terraform configuration must include an empty `terraform { cloud {} }` block; Ravion supplies the workspace configuration. Disable to use your own backend, including S3 or Terraform Cloud.
     id: use_ravion_state_backend
     immutable: true
     label: Use Ravion for your Terraform state
     type: boolean
-  - collapsible: true
+  - applied_by:
+      - stack
+    collapsible: true
     description: Override Terraform state backend workspace name. Defaults to project + environment + module given ids.
     id: ravion_state_backend_workspace
     immutable: true

Comment thread tools/ravion-modules/src/compiler.ts Outdated
return;
}
if (typeof value === "string") {
const referencePattern = /\bmodule\.input\.([A-Za-z0-9_-]+(?:\.[A-Za-z0-9_-]+)*)/g;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Indexed references over-attribute phases

When the ECS NLB definition uses module.input.listeners[0].…, this pattern captures only listeners; the parent then passes both stack and deploy phases to every child, causing stack-only TLS fields such as tls_certificate to be stamped with applies_on: ["stack", "deploy"] and incorrectly recommend or initiate a deploy when changed.

Knowledge Base Used: Terraform Stack module and shared partials

Prompt To Fix With AI
This is a comment left during a code review.
Path: tools/ravion-modules/src/compiler.ts
Line: 135

Comment:
**Indexed references over-attribute phases**

When the ECS NLB definition uses `module.input.listeners[0].…`, this pattern captures only `listeners`; the parent then passes both stack and deploy phases to every child, causing stack-only TLS fields such as `tls_certificate` to be stamped with `applies_on: ["stack", "deploy"]` and incorrectly recommend or initiate a deploy when changed.

**Knowledge Base Used:** [Terraform Stack module and shared partials](https://app.greptile.com/flightcontrol/-/custom-context/knowledge-base/ravionhq/modules/-/docs/stack-and-partials.md)

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

devin-ai-integration Bot and others added 4 commits August 8, 2026 22:08
Co-Authored-By: brandon <brandon@flightcontrol.dev>
Co-Authored-By: brandon <brandon@flightcontrol.dev>
Co-Authored-By: brandon <brandon@flightcontrol.dev>
Co-Authored-By: brandon <brandon@flightcontrol.dev>
@devin-ai-integration
devin-ai-integration Bot force-pushed the devin/1786224974-derive-applies-on branch from 9cfbcdb to eea4fad Compare August 8, 2026 22:11
devin-ai-integration Bot and others added 18 commits August 8, 2026 22:13
Co-Authored-By: brandon <brandon@flightcontrol.dev>
Co-Authored-By: brandon <brandon@flightcontrol.dev>
Co-Authored-By: brandon <brandon@flightcontrol.dev>
Co-Authored-By: brandon <brandon@flightcontrol.dev>
Co-Authored-By: brandon <brandon@flightcontrol.dev>
Co-Authored-By: brandon <brandon@flightcontrol.dev>
Co-Authored-By: brandon <brandon@flightcontrol.dev>
Co-Authored-By: brandon <brandon@flightcontrol.dev>
Co-Authored-By: brandon <brandon@flightcontrol.dev>
Co-Authored-By: brandon <brandon@flightcontrol.dev>
Co-Authored-By: brandon <brandon@flightcontrol.dev>
Co-Authored-By: brandon <brandon@flightcontrol.dev>
Co-Authored-By: brandon <brandon@flightcontrol.dev>
Co-Authored-By: brandon <brandon@flightcontrol.dev>
Co-Authored-By: brandon <brandon@flightcontrol.dev>
Co-Authored-By: brandon <brandon@flightcontrol.dev>
Co-Authored-By: brandon <brandon@flightcontrol.dev>
Co-Authored-By: brandon <brandon@flightcontrol.dev>
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