2443909362
---ci--- project: nova-platform milestone: v1.0 status: complete requirements: covered: [REQ-01,REQ-02,REQ-03,REQ-04,REQ-05,REQ-06,REQ-07,REQ-08,REQ-09,REQ-10,REQ-11,REQ-12,REQ-13,REQ-14,REQ-15,REQ-16,REQ-17,REQ-18,REQ-19,REQ-20,REQ-21,REQ-22,REQ-23,REQ-24,REQ-25,REQ-26,REQ-27,REQ-28,REQ-29,REQ-30,REQ-31,REQ-32,REQ-33,REQ-34,REQ-35,REQ-36,REQ-37,REQ-38] partial: [] ---/ci--- v1.0 milestone complete: simplified infrastructure-delivery platform derived from Nova (acdl). 6 phases (P0-P5 + P6 final). 38 REQ-IDs. 38 decisions (D-001..D-038). 76 tests pass. Engine boundary holds. Happy paths green (check-only + CI). 13 L1 + 2 L2 modules. 5 terraform roots. Shell reproducibility. Zero OOS files. Tags: v0.1.0 (P0) → v0.1.1..v0.1.5 (P1..P5) → v0.1.6 (P6 = milestone release on v0.1 patch line).
104 lines
3.9 KiB
Markdown
104 lines
3.9 KiB
Markdown
# Environments
|
|
|
|
A consumer does **not** provide an AWS account, a VPC, a subnet, or an S3
|
|
state bucket. The platform manages environments.
|
|
|
|
## What an environment is
|
|
|
|
A named environment is a **platform-owned** bundle of:
|
|
|
|
- An **AWS account** (or a scoped partition of one).
|
|
- A **network** (VPC + subnets / AZs).
|
|
- A **state backend** (an S3 bucket + DynamoDB lock table for Terraform
|
|
state).
|
|
|
|
A consumer selects an environment **by name** in their contract:
|
|
|
|
```yaml
|
|
environment: dev
|
|
```
|
|
|
|
The platform resolves the name to the underlying account/network/state
|
|
backend at run time. The consumer never sees the raw credentials.
|
|
|
|
## Environment definition shape (D-018)
|
|
|
|
Each environment is a JSON file in `core/environments/`. The field set is
|
|
reduced from the reference — the IAM role, autonomy, and confidence
|
|
threshold fields are out of scope for v1.0.
|
|
|
|
`core/environments/dev.json` (the sample):
|
|
|
|
```json
|
|
{
|
|
"name": "dev",
|
|
"description": "Sample dev environment for offline/local testing. account_id placeholder (000000000000) for offline mode.",
|
|
"account_id": "000000000000",
|
|
"region": "us-east-1",
|
|
"state_backend": {
|
|
"bucket": "nova-tfstate-dev-us-east-1",
|
|
"lock_table": "nova-tfstate-locks"
|
|
},
|
|
"network": {
|
|
"vpc_cidr": "10.0.0.0/16",
|
|
"azs": ["us-east-1a", "us-east-1b"]
|
|
}
|
|
}
|
|
```
|
|
|
|
### Fields
|
|
|
|
| Field | Type | Required | Description |
|
|
|-------|------|----------|-------------|
|
|
| `name` | string | yes | The environment name (`dev`/`qa`/`prod`/`dr`). |
|
|
| `description` | string | no | Human-readable description. |
|
|
| `account_id` | string | yes | The AWS account id (placeholder `000000000000` for offline dev). |
|
|
| `region` | string | yes | The AWS region. |
|
|
| `state_backend.bucket` | string | yes | The S3 state bucket name. |
|
|
| `state_backend.lock_table` | string | yes | The DynamoDB lock table name (`nova-tfstate-locks` per D-022). |
|
|
| `network.vpc_cidr` | string | yes | The VPC CIDR block. |
|
|
| `network.azs` | array | yes | The availability zones. |
|
|
|
|
### Dropped from the reference (D-018)
|
|
|
|
- `runner_role_arn` — identity/authorization is out of scope.
|
|
- `autonomy` — human-in-the-loop gates are out of scope.
|
|
- `confidence_threshold` — the confidence signal is out of scope.
|
|
|
|
## State backend (D-022)
|
|
|
|
The Terraform state backend uses a dedicated DynamoDB lock table named
|
|
`nova-tfstate-locks` (NOT `nova-outbox` — the audit outbox is out of scope
|
|
for v1.0). The S3 state bucket is named `nova-tfstate-<account>-<region>`
|
|
with versioning enabled. See
|
|
[`terraform/bootstrap/README.md`](../../terraform/bootstrap/README.md) for
|
|
the bootstrap runbook that creates both.
|
|
|
|
## Autonomy by environment
|
|
|
|
| Environment | Autonomy | Operator action |
|
|
|-------------|----------|-----------------|
|
|
| dev | Fully autonomous | None — `terraform apply -auto-approve` runs automatically. |
|
|
| qa | Manual | An operator runs `run_platform.sh` against the `qa` contract. |
|
|
| prod | Manual | An operator runs `run_platform.sh` against the `prod` contract. |
|
|
| dr | Manual | An operator runs `run_platform.sh` against the `dr` contract. |
|
|
|
|
`dev` is the only autonomous environment. Higher environments require a
|
|
human operator to invoke the pipeline against the environment's contract
|
|
variant. There are no automated gates or attestation steps — those are out
|
|
of scope for v1.0. Staging does not exist.
|
|
|
|
## Onboarding scaffold (current state)
|
|
|
|
The platform repo ships a minimal onboarding scaffold:
|
|
|
|
- [`core/environments/`](../../core/environments/) — environment definitions
|
|
(a sample `dev.json`).
|
|
- `core/environment_check.py` — checks whether an environment is defined
|
|
for a given contract's environment name; raises `EnvironmentNotFoundError`
|
|
when none is defined (D-019).
|
|
- `scripts/run_platform.sh` calls the check before contract validation.
|
|
|
|
The scaffold is minimal: provisioning a new environment is a platform-team
|
|
action today (bootstrap the state backend + network). Self-service
|
|
environment provisioning is a future milestone. |