# Context Request Protocol (CRP) Models

The CRP provides the structured vocabulary through which actors (via
skills) declare what information they need, at what level of detail,
and with what scope, while they are reasoning.

## Core Data Types

### DetailLevelMap

Maps named detail levels to integer depths for a UKO domain.
Inheritance allows child maps to include all entries from their parent
map and insert additional levels at any integer position.

| Field       | Type                    | Description                                     |
|-------------|-------------------------|-------------------------------------------------|
| `domain`    | `str`                   | UKO namespace (e.g., `"uko-code:"`, `"uko-py:"`)|
| `parent`    | `DetailLevelMap \| None`| Parent map to inherit from                      |
| `levels`    | `dict[str, int]`        | Named level -> integer depth mapping            |
| `max_depth` | `int`                   | Maximum meaningful depth for this domain (>= 0) |

**Methods:**

- `resolve(depth: int | str) -> int` -- Resolve a named level or integer to
  an integer depth.  Integer depths are clamped to `max_depth`.
- `register(name: str, value: int) -> None` -- Register a custom detail level.
- `effective_levels() -> dict[str, int]` -- Return the full merged level map
  including inherited entries.

### ContextRequest

A structured request for context, issued by an actor or skill via the
CRP.  Each request triggers a context assembly cycle in the ACMS
pipeline.

| Field                  | Type             | Default              | Description                                 |
|------------------------|------------------|----------------------|---------------------------------------------|
| `query`                | `str \| None`    | `None`               | Natural language query                      |
| `entities`             | `list[str]`      | `[]`                 | Named entities to focus on                  |
| `uko_types`            | `list[str]`      | `[]`                 | UKO types to filter                         |
| `focus`                | `list[str]`      | `[]`                 | URIs or identifiers to focus on             |
| `breadth`              | `int`            | `2`                  | Dependency hops outward (>= 0)              |
| `depth`                | `int \| str`     | `3`                  | Detail depth -- integer or named level      |
| `depth_gradient`       | `bool`           | `True`               | Items closer to focus get more detail       |
| `temporal`             | `TemporalScope`  | `CURRENT`            | Temporal scope for retrieval                |
| `max_tokens`           | `int \| None`    | `None`               | Maximum token budget (>= 0)                 |
| `preferred_strategies` | `list[str]`      | `[]`                 | Preferred context strategies                |
| `required_backends`    | `list[str]`      | `[]`                 | Required data backends                      |
| `priority`             | `float`          | `0.5`                | 0.0 = background, 1.0 = critical           |
| `purpose`              | `str`            | `""`                 | Why this context is needed                  |

### ContextFragment

The atomic unit of context returned by strategies and consumed by the
Context Assembly Pipeline.

| Field             | Type                 | Description                         |
|-------------------|----------------------|-------------------------------------|
| `uko_node`        | `str`                | UKO URI of the source node          |
| `content`         | `str`                | Rendered text content               |
| `detail_depth`    | `int`                | Resolved integer depth (>= 0)      |
| `token_count`     | `int`                | Token count of content (>= 0)      |
| `relevance_score` | `float`              | 0.0 -- 1.0 relevance to request    |
| `provenance`      | `FragmentProvenance` | Trace back to resource + location   |
| `metadata`        | `dict[str, Any]`     | Strategy-specific metadata          |

### FragmentProvenance

Links a fragment back to the originating resource and location.

| Field          | Type  | Default | Description                          |
|----------------|-------|---------|--------------------------------------|
| `resource_uri` | `str` | --      | URI of the originating resource      |
| `location`     | `str` | `""`    | Location within the resource         |
| `strategy`     | `str` | `""`    | Strategy that produced this fragment |

### ContextBudget

Token budget management with reservation support.

| Field             | Type  | Default | Description                            |
|-------------------|-------|---------|----------------------------------------|
| `max_tokens`      | `int` | --      | Maximum total token budget (>= 0)      |
| `reserved_tokens` | `int` | `0`     | Reserved tokens (<= `max_tokens`)      |

**Properties:**

- `available_tokens: int` -- `max_tokens - reserved_tokens`

### AssembledContext

The fused, budget-respecting context payload delivered to an actor.

| Field             | Type                   | Description                          |
|-------------------|------------------------|--------------------------------------|
| `fragments`       | `list[ContextFragment]`| Ordered context fragments            |
| `total_tokens`    | `int`                  | Total token count (>= 0)            |
| `budget_used`     | `float`                | Budget fraction consumed (0.0--1.0)  |
| `strategies_used` | `list[str]`            | Contributing strategies              |
| `context_hash`    | `str`                  | Cryptographic hash for snapshot      |
| `preamble`        | `str \| None`          | Optional structure summary           |
| `provenance_map`  | `dict[str, Any]`       | Fragment -> resource/location map    |

## Detail Level Table (Universal Layer 0)

| Depth | Question Answered              | What Gets Included                      |
|-------|--------------------------------|-----------------------------------------|
| 0     | *What exists?*                 | Name/identifier of the information unit |
| 1     | *How is it organized?*         | Names of immediate children             |
| 2     | *What are the key relationships?* | Children + dependency/reference edges|
| 3     | *What is each thing's purpose?* | + Short descriptions/summaries         |
| 4     | *What is the structural shape?* | + Type info, size/count metadata       |
| 5+    | *How does it work?*            | Progressively more content              |
| max   | *Everything.*                  | Complete content -- nothing omitted     |

## Example Usage

```python
from cleveragents.domain.models.acms.crp import (
    ContextBudget,
    ContextFragment,
    ContextRequest,
    DetailLevelMap,
    FragmentProvenance,
)

# Create a detail level map for source code
code_map = DetailLevelMap(
    domain="uko-code:",
    max_depth=9,
    levels={
        "MODULE_LISTING": 0,
        "SIGNATURES": 4,
        "FULL_SOURCE": 9,
    },
)

# Resolve a named level
depth = code_map.resolve("SIGNATURES")  # -> 4

# Create a context request
request = ContextRequest(
    query="How does authentication work?",
    focus=["uko-py:class/AuthManager"],
    breadth=2,
    depth="SIGNATURES",
    purpose="Understand the auth flow for refactoring",
)

# Create a budget
budget = ContextBudget(max_tokens=8000, reserved_tokens=1000)
print(budget.available_tokens)  # 7000

# Create a fragment
fragment = ContextFragment(
    uko_node="uko-py:class/AuthManager",
    content="class AuthManager: ...",
    detail_depth=4,
    token_count=120,
    relevance_score=0.95,
    provenance=FragmentProvenance(
        resource_uri="uko-py:module/auth",
        location="lines 1-50",
        strategy="breadth-depth-navigator",
    ),
)
```

## Built-in Context Skill

The `builtin/context` skill is automatically injected into every
actor's skill set.  It provides three tools:

| Tool                    | Description                                   |
|-------------------------|-----------------------------------------------|
| `request_context`       | Request specific context during reasoning     |
| `query_history`         | Query historical context about past decisions |
| `get_context_budget`    | Check remaining context token budget          |

These tools are currently stubbed (`NotImplementedError`) pending the
full ACMS Context Assembly Pipeline implementation.
