# l1-s3 — S3 bucket primitive The first real L1 module for the v1.1 spike. Single-purpose, substrate-agnostic (the IR type is `aws:s3:bucket`, not a Terraform resource type). ## Interface (the IR-typed contract) See `interface.json`: inputs `bucket_name` + `region` (strings), outputs `bucket_arn` (arn) + `bucket_name` (string), NFR `versioning` (bool, default true). ## IR → Terraform mapping (performed by the adapter) The Terraform adapter (`adapters/terraform/adapter.py`) translates this L1's IR shape to Terraform: | IR | Terraform | |----|-----------| | `resource.type = aws:s3:bucket` | `resource "aws_s3_bucket" "" { ... }` | | `resource.inputs.bucket_name` | `bucket = ` arg | | `resource.inputs.region` | `provider "aws" { region = }` | | `resource.outputs.bucket_arn` | `output "bucket_arn" { value = aws_s3_bucket..arn }` | | `resource.outputs.bucket_name` | `output "bucket_name" { value = aws_s3_bucket..id }` | The adapter is a thin layer (ARCHITECTURE.md §12.2); it does not own L1 content — it only translates. ## Spike instance `spike_instance.json` is a concrete stack instance (with values `bucket_name=acdl-spike-bucket`, `region=us-east-1`) that validates against `schemas/ir.schema.json`. The adapter consumes this instance (not the interface contract) to emit Terraform. ## Versioning (W3.D) `1.0.0` — interface MAJOR, behavior MINOR, lifecycle PATCH. MAJOR bumps require a new registry entry (immutable publication); old entries enter a 12-month deprecation window.