Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,17 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/).

## [Unreleased]

### Added

- Structured control execution records for enforcement observability ([#130](https://github.com/contextforge-org/cpex/issues/130))
- `ControlExecutionStatus` enum and `ControlExecutionRecord` Pydantic model in `cpex.framework.models`
- `PluginResult.executions: list[ControlExecutionRecord]` — one record per plugin evaluated, always present
- All five execution phases instrumented: Sequential, Transform, Audit, Concurrent, Fire-and-forget
- Identity fields (`plugin_id`, `plugin_name`, `plugin_kind`, `mode`) sourced from trusted `PluginRef` config — plugins cannot forge these
- Monotonic per-plugin timing (`duration_ns`); fire-and-forget records use `duration_ns=0` at spawn time
- Security bounds: string fields capped at 256 bytes, config key lists capped at 64 entries, config values never stored
- `ControlExecutionRecord` and `ControlExecutionStatus` exported from `cpex.framework`

## [0.1.1] - 2026-06-04

### Added
Expand Down
8 changes: 6 additions & 2 deletions cpex/framework/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,8 @@
from cpex.framework.loader.plugin import PluginLoader
from cpex.framework.manager import PluginManager, TenantPluginManager
from cpex.framework.models import (
ControlExecutionRecord,
ControlExecutionStatus,
GlobalContext,
MCPClientConfig,
MCPServerConfig,
Expand Down Expand Up @@ -135,6 +137,8 @@ def get_plugin_manager(
"AgentPreInvokePayload",
"AgentPreInvokeResult",
"ConfigLoader",
"ControlExecutionRecord",
"ControlExecutionStatus",
"ExternalPluginServer",
"get_attr",
"get_hook_registry",
Expand Down Expand Up @@ -181,12 +185,12 @@ def get_plugin_manager(
"ResourcePostFetchResult",
"ResourcePreFetchPayload",
"ResourcePreFetchResult",
"TenantPluginManager",
"ToolHookType",
"ToolPostInvokePayload",
"ToolPostInvokeResult",
"ToolPreInvokeResult",
"TenantPluginManager",
"ToolPreInvokePayload",
"ToolPreInvokeResult",
"TransportType",
"UserContext",
]
Loading