# AutomationProfileService Reference

## Overview

The `AutomationProfileService` resolves the effective automation profile
for plan execution using a four-level precedence hierarchy.

## Profile Precedence

Profiles are resolved in order (first non-null wins):

| Priority | Source        | Description                                  |
|----------|---------------|----------------------------------------------|
| 1        | Plan-level    | Explicitly set via `--automation-profile`     |
| 2        | Action-level  | Default profile set on the action template    |
| 3        | Project-level | Set via project configuration                 |
| 4        | Global-level  | Config key or `CLEVERAGENTS_AUTOMATION_PROFILE` env var |

If no profile is set at any level, the global default is `manual`.

## Configuration

### Config Key

```yaml
core:
  automation_profile: "supervised"
```

This sets the global default profile name. The Settings field is
`default_automation_profile`.

### Environment Variable Override

```bash
export CLEVERAGENTS_AUTOMATION_PROFILE=auto
```

The environment variable takes precedence over the config file value
when the config field is empty.

## Legacy Mapping

The `automation_level` setting is retained for backward compatibility.
It is mapped to built-in profiles as follows:

| `automation_level` Value | Built-in Profile |
|--------------------------|------------------|
| `manual`                 | `manual`         |
| `supervised`             | `supervised`     |
| `auto`                   | `auto`           |
| `full_auto`              | `full-auto`      |

When `default_automation_profile` is set, it takes precedence over
`default_automation_level`.

## Auto-Progress Behavior

The `PlanLifecycleService` uses profile thresholds to decide whether
to auto-progress plans:

- **Strategize → Execute**: auto-progresses when `profile.create_tool < 1.0`
- **Execute → Apply**: auto-progresses when `profile.select_tool < 1.0`

A threshold of `0.0` means fully automatic (no human gate required).
A threshold of `1.0` means human approval is always required.

## Built-in Profiles

Eight built-in profiles ship with every installation:

| Profile       | create_tool | select_tool | Behavior                |
|---------------|-------------|------------|-------------------------|
| `manual`      | 1.0         | 1.0        | Human approves all      |
| `review`      | 0.0         | 1.0        | Human reviews before apply |
| `supervised`  | 1.0         | 1.0        | Human reviews strategy + execution |
| `cautious`    | 0.7         | 1.0        | Probabilistic gates     |
| `trusted`     | 0.0         | 1.0        | Auto most, human apply  |
| `auto`        | 0.0         | 1.0        | Fully auto except revert|
| `ci`          | 0.0         | 0.0        | CI pipeline mode        |
| `full-auto`   | 0.0         | 0.0        | No gates at all         |

## Persistence

Custom profiles are stored in the `automation_profiles` table with
the namespaced name as the primary key. The repository supports
list, show (get_by_name), upsert, and delete operations with a
`schema_version` guard for optimistic concurrency.

## API

### `resolve_profile(plan_profile, action_profile, project_profile)`

Resolves the effective profile using the four-level precedence.

### `get_profile(name)`

Looks up a profile by name (built-in first, then repository).

### `map_legacy_level(level)`

Maps a legacy `automation_level` string to a profile name.

### `resolve_legacy_level(level)`

Resolves a legacy `automation_level` to a full `AutomationProfile`.

### `list_profiles()`

Returns all built-in and custom profiles.

### `create_profile(config)`

Creates and persists a custom profile.

### `update_profile(name, config)`

Updates a persisted custom profile.

### `delete_profile(name)`

Deletes a persisted custom profile.
