# Release Gate Policy

`config/release_gate_policy.yml` — централізований конфіг строгості gate-ів для різних профілів деплойменту.

## Профілі

| Профіль | Призначення | privacy_watch | cost_watch |
|---------|-------------|---------------|------------|
| `dev` | Розробка | warn | warn |
| `staging` | Стейджинг | **strict** (fail_on error) | warn |
| `prod` | Продакшн | **strict** (fail_on error) | warn |

## Режими gate-ів

| Режим | Поведінка |
|-------|-----------|
| `off` | Gate повністю пропускається (не викликається, не виводиться) |
| `warn` | Gate завжди `pass=True`; findings → `recommendations` |
| `strict` | Gate може заблокувати реліз за умовами `fail_on` |

## Використання

Передати `gate_profile` у inputs release_check:

```json
{
  "gate_profile": "staging",
  "run_privacy_watch": true,
  "diff_text": "..."
}
```

## strict mode: privacy_watch

Блокує реліз якщо є findings із severity у `fail_on`:

```yaml
privacy_watch:
  mode: "strict"
  fail_on: ["error"]   # тільки error-severity блокує; warning = recommendation
```

Наприклад, `DG-SEC-001` (private key) = error → `release_check.pass = false`.  
`DG-LOG-001` (sensitive logger) = warning → не блокує у staging/prod.

## cost_watch

**Завжди `warn`** у всіх профілях — cost spikes ніколи не блокують реліз (тільки recommendations).

## Backward compatibility

Якщо `gate_profile` не переданий → використовується `dev` (warn для privacy і cost).  
Якщо `release_gate_policy.yml` відсутній → всі gates використовують `warn` (graceful fallback).

## Приклад виводу для staging з error finding

```json
{
  "pass": false,
  "gates": [
    { "name": "privacy_watch", "status": "pass", "errors": 1,
      "top_findings": [{"id": "DG-SEC-001", "severity": "error", ...}],
      "recommendations": ["Remove private key from code..."] }
  ],
  "summary": "❌ RELEASE CHECK FAILED. Failed: []. Errors: [].",
  "recommendations": ["Remove private key from code..."]
}
```
