# FinOps MVP Phase 1 Implementation

This document describes the MVP implementation for AWS CUR 2.0 data (>= 2025-10-01) to deliver cost analytics in Looker.

**Key Design Decisions (v2.3):**
- Use **dbt** for modular development and version control
- **3-layer architecture**: Staging → Intermediate → Marts
- **39-field schema**: 30 Unified + 9 AWS-Specific fields
- **Dual cost perspective**: `actual_cost_usd` (financial) + `list_cost_usd` (R&D)
- **Single usage mart**: `mart_cost_monthly` with account/service/region/tag dimensions
- **Usage unit-safe modeling**: include `usage_unit` in mart grain
- **Weighted savings_rate**: `SUM(savings_amount) / SUM(list_cost_usd)`

---

## 1. MVP Scope

### In Scope

| Item | Description |
|------|-------------|
| Data Source | AWS CUR 2.0: `gcp-digital-bi.aws_billing_no_payer.aws_billing_*` |
| Time Range | `line_item_usage_start_date >= '2025-10-01'` |
| Target Dataset | `gcp-rd-research-dev.finops_cloud_billing` |
| Staging | `stg_aws_cost` (VIEW - 39 fields: 30 Unified + 9 AWS-Specific) |
| Intermediate | `int_aws_billing_ledger` (VIEW - all charge types) + `int_aws_billing` (VIEW - usage rows only) |
| Marts | `mart_cost_monthly` (single table for usage analytics) |

### Out of Scope (Phase 2+)

- AWS CUR 1.0 data (< 2025-10-01)
- GCP, Azure, Alibaba cloud data
- Multi-cloud unified marts (blocked until BigQuery location strategy is resolved; current GCP billing export is in `US` while analytics is in `us-west2`)
- Extended marts (instance type, SP/RI utilization, tenant allocation)
- Tag-based cost allocation
- Commitment dimension fields

---

## 2. Implementation Artifacts

### 2.1 dbt Project Structure

```
dbt/
├── dbt_project.yml
├── profiles.yml
├── models/
│   ├── staging/
│   │   ├── _sources.yml
│   │   ├── _stg_models.yml
│   │   └── stg_aws_cost.sql
│   ├── intermediate/
│   │   ├── _int_models.yml
│   │   ├── int_aws_billing_ledger.sql  # All charge types + account_mapping
│   │   └── int_aws_billing.sql         # Usage-only view from ledger
│   └── marts/core/
│       ├── _mart_models.yml
│       └── mart_cost_monthly.sql
├── seeds/
│   ├── _seeds.yml
│   └── account_mapping.csv              # Account to cost_center/owner mapping
├── analyses/
│   ├── unmapped_accounts.sql            # Detect unmapped accounts
│   └── validate_stg_vs_raw.sql          # Validate staging vs raw data
└── tests/
    ├── assert_ledger_preserves_staging_totals.sql  # Ensure ledger preserves staging rows/cost
    ├── assert_cost_totals_match.sql             # Verify mart totals match intermediate
    └── assert_no_overlapping_account_mappings.sql  # Validate SCD Type 2 date ranges
```

### 2.2 Model Summary

| Model | Layer | Type | Purpose |
|-------|-------|------|---------|
| `stg_aws_cost` | Staging | VIEW | 1:1 clean from raw, all rows preserved (39 fields) |
| `account_mapping` | Seed | TABLE | Account to cost_center/owner/access_level mapping (SCD Type 2) |
| `int_aws_billing_ledger` | Intermediate | VIEW | Keep all charge types for invoice/reconciliation analysis |
| `int_aws_billing` | Intermediate | VIEW | Usage-only view for optimization marts |
| `mart_cost_monthly` | Mart | TABLE | Unified usage mart (region + service + account + tags + usage_unit) |

---

## 3. Data Flow

```
┌─────────────────────────────────────────────────────────────────────────┐
│ SOURCE (Raw CUR 2.0)                                                    │
│ dbt: _sources.yml                                                       │
│ gcp-digital-bi.aws_billing_no_payer.aws_billing_*                       │
│ Partition: line_item_usage_start_date                                    │
│ Filter: >= 2025-10-01                                                   │
└─────────────────────────────────────────────────────────────────────────┘
                                    │
                                    ▼
┌─────────────────────────────────────────────────────────────────────────┐
│ STAGING (View)                                                          │
│ dbt: models/staging/stg_aws_cost.sql                                    │
│ gcp-rd-research-dev.finops_cloud_billing.stg_aws_cost                   │
│ - Normalizes field names (1:1 clean)                                    │
│ - Type casting, COALESCE for NULLs                                      │
│ - ALL rows preserved (for audit)                                        │
└─────────────────────────────────────────────────────────────────────────┘
                                    │
                                    ▼
┌─────────────────────────────────────────────────────────────────────────┐
│ INTERMEDIATE (View)                                                     │
│ dbt: int_aws_billing_ledger.sql + int_aws_billing.sql                  │
│ gcp-rd-research-dev.finops_cloud_billing.int_aws_billing_ledger        │
│ - Keep all line_item_type rows for finance/reconciliation               │
│ - Add is_usage_row + effective_usage_cost_usd helper metrics            │
│                                                                         │
│ gcp-rd-research-dev.finops_cloud_billing.int_aws_billing               │
│ - Usage-only slice (Usage + SavingsPlanCoveredUsage) for usage marts    │
└─────────────────────────────────────────────────────────────────────────┘
                                    │
                                    ▼
┌─────────────────────────────────────────────────────────────────────────┐
│ MART (Table)                                                            │
│ mart_cost_monthly                                                       │
│ - Unified usage mart for region/service/account/tag analysis            │
│ - Includes SP/RI-aware actual cost, list cost, savings, SP coverage    │
│ - Includes usage_unit in grain for unit-safe usage_amount aggregation   │
│ - Cluster: cloud_provider, account_id, service, region                  │
└─────────────────────────────────────────────────────────────────────────┘
```

---

## 4. Schema Specification (39 Fields)

### 4.1 stg_aws_cost Schema

**Identity Fields (6)**

| # | Field | Type | Source | Notes |
|---|-------|------|--------|-------|
| 1 | cloud_provider | STRING | `'aws'` | Constant for multi-cloud extensibility |
| 2 | usage_date | DATE | `DATE(line_item_usage_start_date)` | Uses START date to align with Cost Explorer |
| 3 | billing_period_month | DATE | `DATE_TRUNC(bill_billing_period_start_date, MONTH)` | First day of month |
| 4 | account_id | STRING | `line_item_usage_account_id` | |
| 5 | account_name | STRING | `line_item_usage_account_name` | |
| 6 | payer_account_id | STRING | `bill_payer_account_id` | |

**Dimension Fields (6)**

| # | Field | Type | Source | Notes |
|---|-------|------|--------|-------|
| 7 | service | STRING | `COALESCE(product_servicecode, 'Unknown')` | e.g., AmazonEC2 |
| 8 | service_category | STRING | `product_product_family` | e.g., Compute Instance |
| 9 | region | STRING | `COALESCE(product.region, product_region_code, 'global')` | product.region covers Data Transfer/VPC |
| 10 | availability_zone | STRING | `line_item_availability_zone` | |
| 11 | resource_id | STRING | `line_item_resource_id` | AWS resource ARN or ID |
| 12 | instance_type | STRING | `product_instance_type` | e.g., m5.large, db.r5.xlarge |

**Cost Fields - Dual Perspective (4)**

| # | Field | Type | Source | Notes |
|---|-------|------|--------|-------|
| 13 | actual_cost_usd | FLOAT64 | `line_item_unblended_cost` | **Financial view** - what we pay |
| 14 | list_cost_usd | FLOAT64 | `pricing_public_on_demand_cost` | **R&D view** - resource at list price |
| 15 | usage_amount | FLOAT64 | `line_item_usage_amount` | |
| 16 | usage_unit | STRING | `pricing_unit` | |

**Classification Fields (4)**

| # | Field | Type | Source | Notes |
|---|-------|------|--------|-------|
| 17 | line_item_type | STRING | `line_item_line_item_type` | **Original value preserved** |
| 18 | charge_type | STRING | CASE mapping | Simplified: Usage/Tax/Discount/Credit/Fee/Refund/Other |
| 19 | pricing_model | STRING | CASE mapping | OnDemand/Reserved/SavingsPlan/Spot/Discount/Fee |
| 20 | pricing_term | STRING | `pricing_term` | Original value |

**Tag Fields (8) - Business Tag Extractions**

| # | Field | Type | Source | Notes |
|---|-------|------|--------|-------|
| 21 | tags | STRING | `TO_JSON_STRING(resource_tags)` | Full tags as JSON |
| 22 | tag_environment | STRING | Extract from resource_tags | 基础标签: user:env or user:environment |
| 23 | tag_service_type | STRING | Extract from resource_tags | 基础标签: user:servicetype |
| 24 | tag_usedby | STRING | Extract from resource_tags | 基础标签: user:usedby |
| 25 | tag_component | STRING | Extract from resource_tags | 模块标签: user:component |
| 26 | tag_tenant | STRING | Extract from resource_tags | 用户标签: user:tenant |
| 27 | tag_project | STRING | Extract from resource_tags | 用户标签: user:project |
| 28 | tag_cluster | STRING | Extract from resource_tags | 用户标签: user:cluster |

**AWS-Specific Fields (9) - For SP/RI Deep Analysis**

| # | Field | Type | Source | Notes |
|---|-------|------|--------|-------|
| 29 | aws_product_code | STRING | `product_servicecode` | |
| 30 | aws_operation | STRING | `line_item_operation` | e.g., RunInstances |
| 31 | aws_usage_type | STRING | `line_item_usage_type` | e.g., BoxUsage:m5.large |
| 32 | aws_line_item_desc | STRING | `line_item_line_item_description` | |
| 33 | aws_sku_id | STRING | `product_sku` | |
| 34 | aws_savings_plan_arn | STRING | `savings_plan_savings_plan_a_r_n` | For SP-covered usage |
| 35 | aws_reservation_arn | STRING | `reservation_reservation_a_r_n` | For RI-covered usage |
| 36 | aws_sp_effective_cost | FLOAT64 | `savings_plan_savings_plan_effective_cost` | SP effective cost |
| 37 | aws_amortized_cost | FLOAT64 | `reservation_effective_cost` | RI amortized cost |

**Metadata Fields (2)**

| # | Field | Type | Source | Notes |
|---|-------|------|--------|-------|
| 38 | _source_table | STRING | `_TABLE_SUFFIX` | Lineage: MMDD format |
| 39 | _row_id | STRING | `CONCAT(_TABLE_SUFFIX, ':', identity_line_item_id)` | Staging lineage/debug ID only; do not use as PK/dedup/join key (not globally unique) |

---

## 5. Intermediate Models

The Intermediate layer now has two models:

1. `int_aws_billing_ledger`: all charge types for invoice/reconciliation use cases.
2. `int_aws_billing`: usage-only slice for optimization marts.

**Metadata note:** `_row_id` is kept in `stg_aws_cost` for source traceability only and is intentionally not exposed in intermediate models to avoid misuse as a business key.

### 5.1 Usage Row Filter (in int_aws_billing)

```sql
-- int_aws_billing.sql
WHERE line_item_type IN (
    'Usage',                    -- OnDemand usage
    'SavingsPlanCoveredUsage'   -- SP-covered usage
    -- Note: CUR 2.0 does NOT have 'DiscountedUsage' (that was CUR 1.0)
)
```

### 5.2 Why Keep Both Ledger + Usage Views?

| Model | Scope | Purpose |
|-------|-------|---------|
| `int_aws_billing_ledger` | All row types | Invoice/reconciliation/finance drill-down |
| `int_aws_billing` | Usage + SavingsPlanCoveredUsage | Resource optimization and usage marts |

### 5.3 Calculated Fields

| Field | Formula | Purpose |
|-------|---------|---------|
| `savings_amount` | `list_cost_usd - effective_usage_cost_usd` | Absolute savings in USD |
| `savings_rate` | `savings_amount / list_cost_usd` | Discount percentage (0.0-1.0) |
| `effective_usage_cost_usd` | SP/RI-aware effective usage cost | Covered usage actual payment view |
| `sp_covered_list_cost_usd` | SP-covered list-price amount | SP coverage analysis |
| `instance_family` | `REGEXP_EXTRACT(instance_type, r'^([a-z]+[0-9]+)')` | e.g., m5 from m5.large |

### 5.4 Key Metrics (Dual Cost Perspective)

| Metric | Source | Purpose |
|--------|--------|---------|
| `actual_cost_usd` | `line_item_unblended_cost` | Raw unblended cost (staging-aligned) |
| `effective_usage_cost_usd` | Calculated (SP/RI-aware) | Usage financial view - what covered usage effectively costs |
| `list_cost_usd` | `pricing_public_on_demand_cost` | R&D view - resource at list price |
| `savings_amount` | Calculated | Absolute savings for aggregation |
| `savings_rate` | Calculated | Row-level discount percentage |

**Note**: Non-usage rows are preserved in `int_aws_billing_ledger` for audit/reconciliation use cases.

---

## 6. Mart Table Schema

Since marts read from `int_aws_billing` (usage rows only), `mart_cost_monthly` keeps dual-cost semantics and business attribution dimensions in one table.

### 6.1 mart_cost_monthly

| Field | Type | Description |
|-------|------|-------------|
| billing_period_month | DATE | Partition key |
| cloud_provider | STRING | 'aws' |
| region | STRING | Region code or 'global' |
| service | STRING | Service code |
| service_category | STRING | Product family |
| account_id | STRING | Usage account |
| account_name | STRING | Source account name |
| account_display_name | STRING | Account mapping display name |
| account_purpose | STRING | Production/Development/Others |
| cost_center | STRING | Cost center from account mapping |
| access_level | STRING | public/restricted |
| account_owner | STRING | Owner from account mapping |
| payer_account_id | STRING | Payer account |
| tags | STRING | Full tags JSON |
| tag_environment | STRING | Extracted environment tag |
| tag_service_type | STRING | Extracted service type tag |
| tag_usedby | STRING | Extracted usedby tag |
| tag_component | STRING | Extracted component tag |
| tag_tenant | STRING | Extracted tenant tag |
| tag_project | STRING | Extracted project tag |
| tag_cluster | STRING | Extracted cluster tag |
| usage_unit | STRING | Usage unit; keeps usage metrics unit-safe |
| actual_cost_usd | FLOAT64 | SUM(effective_usage_cost_usd) - **usage financial view** |
| list_cost_usd | FLOAT64 | SUM(list_cost_usd) - **R&D view** |
| savings_amount | FLOAT64 | SUM(savings_amount) |
| weighted_savings_rate | FLOAT64 | total_savings / total_list_cost (properly weighted) |
| sp_covered_list_cost_usd | FLOAT64 | SUM(sp_covered_list_cost_usd) |
| sp_coverage_rate | FLOAT64 | sp_covered_list_cost_usd / list_cost_usd |
| usage_amount | FLOAT64 | SUM(usage_amount) within same usage_unit |

### 6.2 Key Metrics for BI Dashboards

```sql
-- Financial view (for budget/finance users)
actual_cost_usd

-- R&D view (for engineering/optimization users)
list_cost_usd

-- Savings rate as percentage
weighted_savings_rate * 100

-- Total savings amount (already pre-calculated)
savings_amount
```

**Note**: `weighted_savings_rate` uses proper weighted aggregation `SUM(savings_amount) / SUM(list_cost_usd)` instead of `AVG(savings_rate)` to avoid bias from small line items.

---

## 7. Execution Order

### Step 1: Setup dbt Project (one-time)

```bash
# Create BigQuery dataset
bq mk --location=us-west2 gcp-rd-research-dev:finops_cloud_billing

# Initialize dbt project
cd dbt
pip install dbt-bigquery
dbt init

# Configure profiles.yml with BigQuery credentials
```

### Step 2: Run dbt Build

> [!IMPORTANT]
> Use `dbt build` to run seeds, models, and tests in the correct dependency order.

```bash
# RECOMMENDED: Run seeds + models + tests in correct order
dbt build

# Or run separately (seed must run first!)
dbt seed                        # Load account_mapping seed
dbt run                         # Run all models
dbt run --select staging        # Or run specific layers
dbt run --select intermediate
dbt run --select marts
```

### Step 3: Run Data Tests

```bash
# Run all tests (if not using dbt build)
dbt test

# Run specific test
dbt test --select assert_cost_totals_match
dbt test --select assert_no_overlapping_account_mappings
dbt test --select assert_ledger_preserves_staging_totals
```

### Step 4: Generate Documentation

```bash
dbt docs generate
dbt docs serve  # Opens documentation site
```

### Step 5: Verify in BigQuery

```sql
-- Check models created
SELECT table_name, table_type
FROM `gcp-rd-research-dev.finops_cloud_billing.INFORMATION_SCHEMA.TABLES`;

-- Verify row counts
SELECT 'stg_aws_cost' AS model, COUNT(*) AS rows FROM `finops_cloud_billing.stg_aws_cost`
UNION ALL SELECT 'int_aws_billing', COUNT(*) FROM `finops_cloud_billing.int_aws_billing`
UNION ALL SELECT 'mart_cost_monthly', COUNT(*) FROM `finops_cloud_billing.mart_cost_monthly`;
```

---

## 8. Validation Scripts

### 8.1 Verify stg_aws_cost Totals Match Raw Data

```sql
WITH stg_total AS (
  SELECT
    billing_period_month,
    ROUND(SUM(actual_cost_usd), 2) AS stg_cost
  FROM `gcp-rd-research-dev.finops_cloud_billing.stg_aws_cost`
  GROUP BY billing_period_month
),
raw_total AS (
  SELECT
    DATE_TRUNC(DATE(bill_billing_period_start_date), MONTH) AS billing_period_month,
    ROUND(SUM(line_item_unblended_cost), 2) AS raw_cost
  FROM `gcp-digital-bi.aws_billing_no_payer.aws_billing_2025*`
  WHERE line_item_usage_start_date >= TIMESTAMP('2025-10-01')
    AND _TABLE_SUFFIX >= '1001'
  GROUP BY billing_period_month
)
SELECT
  COALESCE(s.billing_period_month, r.billing_period_month) AS billing_period_month,
  s.stg_cost,
  r.raw_cost,
  ROUND(s.stg_cost - r.raw_cost, 2) AS diff
FROM stg_total s
FULL OUTER JOIN raw_total r USING (billing_period_month)
ORDER BY billing_period_month;
```

### 8.2 Verify Intermediate Filter (int_aws_billing)

```sql
-- Should only have Usage, SavingsPlanCoveredUsage (CUR 2.0 - no DiscountedUsage)
SELECT
  line_item_type,
  COUNT(*) AS row_count,
  ROUND(SUM(actual_cost_usd), 2) AS total_cost_usd
FROM `gcp-rd-research-dev.finops_cloud_billing.int_aws_billing`
GROUP BY line_item_type
ORDER BY total_cost_usd DESC;

-- Expected: Only 2 line_item_types (Usage, SavingsPlanCoveredUsage)
```

### 8.3 Verify Mart Totals Match Intermediate Totals

```sql
WITH mart_total AS (
  SELECT
    billing_period_month,
    ROUND(SUM(actual_cost_usd), 2) AS mart_cost
  FROM `gcp-rd-research-dev.finops_cloud_billing.mart_cost_monthly`
  GROUP BY billing_period_month
),
int_total AS (
  SELECT
    billing_period_month,
    ROUND(SUM(COALESCE(effective_usage_cost_usd, actual_cost_usd)), 2) AS int_cost
  FROM `gcp-rd-research-dev.finops_cloud_billing.int_aws_billing`
  GROUP BY billing_period_month
)
SELECT
  COALESCE(m.billing_period_month, i.billing_period_month) AS billing_period_month,
  m.mart_cost,
  i.int_cost,
  ROUND(m.mart_cost - i.int_cost, 2) AS diff
FROM mart_total m
FULL OUTER JOIN int_total i USING (billing_period_month)
ORDER BY billing_period_month;
```

### 8.4 Check Savings Rate Distribution

```sql
SELECT
  billing_period_month,
  ROUND(AVG(savings_rate) * 100, 2) AS avg_savings_pct,
  ROUND(MIN(savings_rate) * 100, 2) AS min_savings_pct,
  ROUND(MAX(savings_rate) * 100, 2) AS max_savings_pct
FROM `gcp-rd-research-dev.finops_cloud_billing.int_aws_billing`
WHERE savings_rate IS NOT NULL
GROUP BY billing_period_month
ORDER BY billing_period_month;
```

---

## 9. Validation Checklist

| Check | Expected Result |
|-------|-----------------|
| stg cost = raw cost | Diff < $0.01 per month |
| int has only usage rows | 2 line_item_types: Usage, SavingsPlanCoveredUsage |
| mart cost = int cost | Diff = $0.00 per month |
| No NULL cloud_provider | 0 rows |
| savings_rate in valid range | 0.0 to 1.0 (0% to 100%) |
| Date range correct | >= 2025-10-01 |
| Region values reasonable | us-east-1, us-west-2, etc. + 'global' |

---

## 10. Known Limitations

1. **CUR 1.0 Data Not Supported**: Data before 2025-10-01 requires separate adapter
2. **Tag Extraction Limited to 7 Standard Tags**: environment, servicetype, usedby, component, tenant, project, cluster. Custom tags require JSON parsing from `tags` field.
3. **Usage-Only Marts in MVP**: current marts intentionally use `int_aws_billing` (usage scope only)
4. **No Ledger Marts Yet**: finance dashboards can be added by creating marts on top of `int_aws_billing_ledger`
5. **Single Cloud Only**: Multi-cloud support planned for Phase 3

---

## 11. Key Design Decisions

### dbt for Transformation

**Decision**: Use dbt (data build tool) for all transformations.

**Rationale**:
- Version control for SQL models (git)
- Modular development with `ref()` dependencies
- Built-in testing for data quality
- Auto-generated documentation and lineage
- Incremental builds possible in Phase 2+

### Intermediate Layer Split

**Decision**: Use two intermediate models: `int_aws_billing_ledger` and `int_aws_billing`.

**Rationale**:
- Keeps staging clean (1:1 with source, all rows)
- Separates usage optimization and invoice/reconciliation semantics
- Keeps current marts usage-focused without losing fee/tax/credit rows
- Allows future finance marts to read from `int_aws_billing_ledger`

### Usage Rows Only in Marts

**Decision**: Marts aggregate only usage rows (Usage, SavingsPlanCoveredUsage).

**Rationale**:
- Users care about resource consumption and savings rate
- Tax/Fee/Discount/Credit rows confuse analysis
- Full data still available in stg_aws_cost for audit
- Aligns with Gemini 3 Pro recommendation

### View vs Materialized View

**Decision**: Use regular VIEW for staging and intermediate layers.

**Rationale**:
- No additional storage cost
- Always reflects latest raw data
- BigQuery pushes filters through views efficiently
- Can convert to MATERIALIZED VIEW later if performance requires

---

## 12. Looker Integration

### Connection Settings

```
Connection Name: gcp-rd-research-dev
Project: gcp-rd-research-dev
Dataset: finops_cloud_billing
Location: us-west2
```

### Calculated Fields for Looker

```sql
-- Savings Rate (already available as weighted_savings_rate in marts)
weighted_savings_rate * 100

-- Or calculate from raw mart fields:
SAFE_DIVIDE(savings_amount, list_cost_usd) * 100

-- Actual vs List Cost Ratio
SAFE_DIVIDE(actual_cost_usd, list_cost_usd) * 100
```

For detailed Looker LookML examples and dashboard templates, see [Deployment Guide](./finops-deployment-guide.md).

---

## 13. Next Steps (Post-MVP)

| Phase | Addition | Dependency |
|-------|----------|------------|
| 2a | `mart_cost_monthly_by_account` | stg_aws_cost |
| 2b | Tag-based cost allocation marts | stg tag fields |
| 2c | `mart_cost_daily_trend` | stg_aws_cost |
| 3a | `stg_gcp_cost` | GCP billing docs |
| 3b | `stg_cost_unified` (UNION ALL) | All stg views |
| 4 | Extended marts (instance type, SP util) | stg schema update |

---

## Appendix: AWS Field Values Reference

| Field | Top Values by Cost |
|-------|-------------------|
| `line_item_line_item_type` | Usage, SavingsPlanRecurringFee, SavingsPlanCoveredUsage, EdpDiscount (negative), PrivateRateDiscount (negative) |
| `product_servicecode` | AmazonEC2, ComputeSavingsPlans, AWSDataTransfer, AmazonS3, AWSELB, AmazonVPC |
| `product_region_code` | us-east-1, us-west-2, ap-northeast-1, ap-southeast-1, (NULL for global) |
| `pricing_term` | OnDemand (63M rows), Spot (90K rows), Reserved (48K rows), NULL (2.6M rows) |

---

## Related Documents

- [System Design](./finops-system-design.md) - Architecture and full schema design
- [Deployment Guide](./finops-deployment-guide.md) - Operational procedures

---

*Document Status: Implementation Ready*
*Created: 2026-01-12*
*Last Updated: 2026-02-11*
