# Platform Templates

Shared configuration patterns, constraints, validators, and default values for VAPORA services.

## Directory Structure

```plaintext
platform/
├── schemas/                # Shared schemas for common configuration patterns
│   ├── common/
│   │   ├── server.ncl      # Server configuration (host, port, workers, etc.)
│   │   ├── database.ncl    # Database configuration
│   │   ├── monitoring.ncl  # Monitoring and observability
│   │   └── storage.ncl     # Storage and backup configuration
│   └── README.md
│
├── constraints/            # Validation rules and constraints
│   ├── common.ncl          # Common validation predicates
│   └── README.md
│
├── validators/             # Reusable validation functions
│   ├── port-validator.ncl  # Port range validation
│   ├── budget-validator.ncl# Budget and cost validation
│   └── README.md
│
├── values/                 # Constants and enumeration values
│   ├── limits.ncl          # Platform limits and bounds
│   ├── defaults.ncl        # Default values
│   ├── ranges.ncl          # Valid value ranges and enums
│   └── README.md
│
├── defaults/               # Default configurations per mode
│   ├── common/
│   │   ├── server-defaults.ncl
│   │   ├── database-defaults.ncl
│   │   └── monitoring-defaults.ncl
│   ├── deployment/
│   │   ├── solo.ncl        # Solo mode defaults
│   │   ├── multiuser.ncl   # Multiuser mode defaults
│   │   └── enterprise.ncl  # Enterprise mode defaults
│   └── README.md
│
├── templates/              # Code generation templates
│   ├── configs/            # Configuration file templates
│   ├── kubernetes/         # Kubernetes manifest templates
│   ├── docker-compose/     # Docker Compose templates
│   └── README.md
│
├── configs/                # Composed configurations (Nickel files)
│   ├── vapora.solo.ncl
│   ├── vapora.multiuser.ncl
│   └── vapora.enterprise.ncl
│
├── common/
│   └── helpers.ncl         # Helper functions for composition
│
└── README.md               # This file
```

## Usage

### For Configuration Composition

Import schemas and defaults to compose configurations:

```nickel
let server_schema = import "schemas/common/server.ncl" in
let server_defaults = import "defaults/common/server-defaults.ncl" in
let deployment_defaults = import "defaults/deployment/solo.ncl" in

# Merge: schema → deployment defaults → user customizations
std.record.merge server_schema (std.record.merge server_defaults user_config)
```

### For Validation

Use constraints and validators:

```nickel
let constraints = import "constraints/common.ncl" in
let budget_validator = import "validators/budget-validator.ncl" in

# Validate port
assert constraints.valid_port 8080

# Validate budget configuration
budget_validator.validate_role_limits {
  architect_cents = 500000,
  developer_cents = 300000,
  reviewer_cents = 200000,
  testing_cents = 100000,
}
```

### For Constants

Import values for limits and defaults:

```nickel
let limits = import "values/limits.ncl" in
let ranges = import "values/ranges.ncl" in

# Use port limits
let valid_port = port > limits.port.min && port < limits.port.max in

# Check valid log level
let valid_level = std.array.contains ranges.log_levels level in
```

## Composition Pattern

The typical composition flow:

1. **Schema** → Defines structure and types
2. **Constraints** → Validates values are valid
3. **Defaults** → Provides reasonable defaults per mode
4. **User Config** → Customizations override defaults
5. **Output** → Valid, merged configuration

```
User Input
    ↓
Constraints (validation)
    ↓
Merge with Defaults
    ↓
Merge with Schema
    ↓
Output JSON/TOML
```

## References

- **Nickel Language**: https://nickel-lang.org/
- **Configuration Layout**: `@.claude/layout_conventions.md`
- **Nickel Guidelines**: `@.claude/guidelines/nickel.md`
