# v0.96.0 — Defaults, Bounds & Diagnosis

> **Status:** Planned
> **Scope:** Large
> **User promise:** *"I can run this for years without hidden resource or repair behavior."*
> **Blocked by:** [v0.95.0](v0.95.0.md)
> **Renumbered:** previously v0.93.0. Graph V1 and Delta V1 are in
> [v0.93.0](v0.93.0.md) through [v0.95.0](v0.95.0.md). Monitoring, assurance,
> and packaging are in [v0.97.0](v0.97.0.md).

## Theme

Make the default configuration derive from real resource constraints. Define
which resources pg_trickle can bound, which it can throttle, and which it can
only forecast and react to. Long operations, errors, and privilege decisions
must be inspectable through stable interfaces.

This release is part of the mandatory v1.0 operational critical path.

## Items

### PP-1: Resource-based defaults

Automatic configuration uses available memory, PostgreSQL worker limits, CPU,
container or cgroup limits when discoverable, connection limits, and the
configured pg_trickle resource policy. Labels such as `laptop`, `managed`, and
`dedicated` may explain the selected settings, but labels do not drive the
decision.

`pgtrickle.active_profile()` and `explain()` report every detected constraint,
selected value, override, and missing signal. Standard benchmark deployments
must need no manual tuning.

### PP-2: Honest resource guarantees

Every resource has one documented enforcement class.

| Class | Resources | Behavior |
|-------|-----------|----------|
| Hard bound | Extension-managed memory, worker count, retained internal history, internal queue size | Reject or pause work before crossing the configured limit. |
| Throttled | CPU use, concurrent refreshes, connections | Reduce admission and concurrency while preserving committed changes. |
| Forecast and react | WAL volume and disk growth caused by continued source activity | Warn, throttle, suspend, or breach freshness deliberately before correctness is at risk. |

`pgtrickle.disk_usage()` reports current and projected use by stream table.
`health_check()` warns before forecast growth consumes the configured headroom.
The documentation does not claim an absolute bound where PostgreSQL or source
activity prevents one.

### PP-3: Progress reporting

A `pg_stat_progress_pgtrickle`-style view reports initial population, FULL
refresh, rebuild after `ALTER`, and reinitialization after repair. Each row has
a stable operation identifier, phase, rows processed, estimated rows, elapsed
time, and last progress timestamp.

### PP-4: Stable error surface

Audit every user-visible error and warning. Each operational condition has a
stable machine-readable identifier, an accurate SQLSTATE, object-specific
detail, and an actionable hint. Automation must not parse message text.

A CI check prevents undocumented identifiers and errors without a documented
remediation from entering SQL-facing code.

### PP-6: Predefined roles

Provide `pg_trickle_admin`, `pg_trickle_operator`, and `pg_trickle_reader` as a
user-facing mapping onto the ACL and ownership model from v0.84.0. The roles do
not create a second authorization layer. Positive and negative tests cover each
lifecycle and diagnostic operation, including RLS and `SECURITY DEFINER`
boundaries.

## Exit criteria

- [ ] Standard benchmark deployments require no manual tuning, and every
      automatic choice reports its resource evidence
- [ ] Every resource has a documented enforcement class and a pressure test
- [ ] Pressure tests degrade by throttling, explicit freshness breach, or
      suspension without losing committed changes
- [ ] Progress reporting covers every long-running lifecycle operation
- [ ] User-facing errors have stable identifiers, SQLSTATEs, details, and
      actionable hints
- [ ] Predefined roles match the v0.84.0 ACL matrix and pass positive and
      negative boundary tests
