RFC-0013: Agentic Governance
Purpose
Extend CAA to govern LLMs operating as active orchestrators with tool access, not merely passive proposal generators.
This RFC addresses the "model in the middle" architectural gap: when an LLM has agency (tools, multi-turn loops, chain-of-thought), governance must adapt.
The Agentic Gap
The original CAA architecture assumes:
User → Extractor → Governor → Oracle → Envelope → User
↑
LLM (passive proposal generator)
Modern agentic architectures look like:
User → Agent Loop ←→ Tools/APIs
↓
Intermediate outputs
↓
Final response
The LLM is no longer a passive generator gated at the end. It makes decisions, invokes tools, observes results, and iterates. Each step may contain implicit authoritative claims.
Core Principle
Every emission point is a potential authority boundary.
An "emission point" is any moment where LLM-generated content:
- Leaves the agent's internal context
- Invokes an external system
- Becomes visible to a user
- Gets persisted to storage
- Triggers a side effect
Emission Classification
All agent emissions MUST be classified:
type EmissionClass =
| "internal" // Chain-of-thought, scratchpad (no governance required)
| "tool_call" // Invocation of external tool (governance by tool policy)
| "user_visible" // Content shown to user (full governance required)
| "side_effect" // State mutation (governance + audit required)
| "terminal"; // Final response (full envelope required)
Classification Rules:
| Emission Class | Governance Requirement | Opacity Preserved |
|---|---|---|
internal | None | N/A |
tool_call | Per-tool policy | Yes (tool results gated) |
user_visible | RFC-0009 envelope | Yes |
side_effect | RFC-0009 envelope + audit | Yes |
terminal | Full CAA pipeline | Yes |
Tool Call Governance
Tools are the primary mechanism by which agents acquire authority. Tool governance follows tiered authorization.
Tool Tiers
type ToolTier =
| "pre_authorized" // No per-call governance (read-only, low-risk)
| "logged" // Execute freely, audit trail required
| "gated" // Requires governance check before execution
| "human_approved"; // Requires explicit human approval
Tool Policy Declaration
Every tool MUST declare its governance requirements:
interface ToolPolicy {
tool_id: string;
tier: ToolTier;
// For gated/human_approved tiers
required_state?: string[]; // State axes that must be bound
oracle_verification?: boolean; // Require oracle check on inputs
// Side effect declaration
mutates_state: boolean;
reversible: boolean;
// Audit requirements
log_inputs: boolean;
log_outputs: boolean;
redact_fields?: string[];
}
Pre-Authorized Tools
Pre-authorized tools may execute without per-call governance:
- Read-only data retrieval (with rate limits)
- Deterministic transformations
- Internal context operations
Constraint: Pre-authorized tools MUST NOT:
- Mutate external state
- Return data that becomes authoritative without further verification
- Bypass oracle verification for consequential domains
Gated Tools
Gated tools require governance checks before execution:
interface GatedToolInvocation {
tool_id: string;
inputs: Record<string, unknown>;
// Governance metadata
evidence_bindings: EvidenceBinding[]; // RFC-0006
state_snapshot: RequiredState; // RFC-0001
// Authorization
authorization_envelope?: AuthorizationEnvelope; // RFC-0009
}
The Governor evaluates the invocation before the tool executes. If authorization fails, the tool call is blocked and the agent receives a structured refusal.
Chain-of-Thought Governance
Chain-of-thought (CoT) may contain implicit authoritative claims. CAA addresses this through structural constraints rather than content inspection.
CoT Classification
type CoTVisibility =
| "hidden" // Never shown to user, no governance
| "summarized" // Summary may be shown, soft-authority scan required
| "visible"; // Full CoT visible, governance required
The Soft Authority Problem
CoT marked as summarized or visible MUST be scanned for soft authority markers (RFC-0009 §Normative Definitions):
- Numeric values with units
- Named classifications or diagnoses
- Imperative instructions
- Definitive causal claims
If soft authority is detected in visible CoT, the emission MUST be:
- Blocked pending envelope wrapping, OR
- Downgraded to
hiddenvisibility, OR - Flagged with explicit non-authoritative disclaimer
Structural Solution
The preferred approach is structural elimination: CoT that might contain authority claims is never shown. This preserves opacity (RFC-0007) and eliminates the scanning requirement.
interface AgentConfig {
cot_visibility: CoTVisibility;
// If summarized/visible, require soft authority scanning
soft_authority_scan: boolean;
// Preferred: hide CoT entirely for authoritative domains
authoritative_domains_hide_cot: boolean;
}
Multi-Turn Loop Governance
Agentic loops iterate until a termination condition. Governance applies at each iteration boundary.
Loop Invariants
- Bounded Iterations: Maximum iteration count MUST be declared
- State Accumulation: Each iteration's state bindings accumulate
- Authority Escalation: Authority requirements can only increase, never decrease
- Termination Audit: Final state includes full iteration trace
interface LoopGovernance {
max_iterations: number;
// State binding across iterations
cumulative_evidence: EvidenceBinding[];
// Authority escalation
initial_authority: AuthorityLevel;
current_authority: AuthorityLevel;
// Termination
termination_reason:
| "complete"
| "max_iterations"
| "blocked"
| "human_escalation";
iteration_trace: IterationRecord[];
}
Iteration Governance
Each loop iteration:
- Inherits state bindings from previous iterations
- May acquire new evidence bindings
- May trigger tool calls (governed per-tool)
- Produces intermediate outputs (classified per EmissionClass)
If any iteration produces a BLOCKED status, the loop terminates with that status.
Streaming Governance
Streaming responses emit tokens before the full response is available. This creates a governance timing problem.
Streaming Modes
type StreamingMode =
| "buffer_full" // Buffer entire response, then emit (safe, high latency)
| "buffer_sentence" // Buffer sentences, emit on boundary (moderate)
| "realtime"; // Emit tokens immediately (requires structural safety)
Realtime Streaming Constraints
Realtime streaming is only permitted when:
- Workflow is non-authoritative:
authoritative_intent: "non_authoritative" - Grammar constraints active: Fallback mode (RFC-0010) enforced
- Soft authority markers impossible: Structural grammar prevents them
interface StreamingPolicy {
mode: StreamingMode;
// For realtime mode
require_non_authoritative: true;
grammar_mode: "attributive" | "hedged";
forbidden_markers: string[];
}
Buffered Streaming
For authoritative workflows, buffering is mandatory:
- Accumulate tokens until governance boundary
- Apply full CAA pipeline to buffered content
- Emit only after authorization
- On rejection, emit refusal instead
Opacity in Agentic Context
RFC-0007 requires that the LLM cannot observe authorization logic. Agentic patterns challenge this:
- Tool results are visible to the agent
- Error messages from blocked calls are visible
- Multi-turn context accumulates governance outcomes
Opacity Preservation
Tool Results: Tool outputs are data, not authorization decisions. The agent sees what the tool returns, not why a call was allowed or blocked.
Blocked Calls: When a tool call is blocked, the agent receives a structured refusal that does not leak authorization thresholds:
interface AgentRefusal {
blocked: true;
reason_code: "INSUFFICIENT_STATE" | "POLICY_VIOLATION" | "ORACLE_REQUIRED";
user_message: string; // Safe for agent context
recovery_hint?: string;
// NOT included: thresholds, rule details, authority levels
}
Multi-Turn Context: Governance outcomes from previous turns are not added to agent context. The agent sees user messages and tool results, not authorization decisions.
Self-Governance Prohibition
The LLM MUST NOT participate in its own authorization decisions.
Prohibited Patterns:
// FORBIDDEN: LLM classifies its own authority level
const authority = await llm.classify(
"What authority level does this response need?",
);
// FORBIDDEN: LLM decides if its output needs governance
const needsGovernance = await llm.evaluate(
"Does this contain authoritative claims?",
);
// FORBIDDEN: LLM reviews its own output for soft authority
const hasSoftAuthority = await llm.scan(ownOutput);
Permitted Pattern:
// ALLOWED: Deterministic classifier applied to LLM output
const claims = extractClaims(llmOutput); // Deterministic extraction
const authority = classifyClaims(claims); // Rule-based classification
const envelope = govern(llmOutput, authority); // External governance
Workflow Declaration
Agentic workflows MUST declare their governance profile:
interface AgenticWorkflowDeclaration {
workflow_id: string;
authoritative_intent: "authoritative" | "non_authoritative";
// Tool governance
tools: ToolPolicy[];
// Emission governance
emission_policy: {
cot_visibility: CoTVisibility;
streaming_mode: StreamingMode;
};
// Loop governance
loop_policy?: {
max_iterations: number;
iteration_audit: boolean;
};
// Enforcement
enforcement_mode: "INLINE" | "ASYNC" | "NON_AUTHORITATIVE_ONLY";
}
Relationship to Other RFCs
| RFC | Original Assumption | Agentic Extension |
|---|---|---|
| RFC-0001 | State collected once upfront | State accumulates across iterations |
| RFC-0004 | Quote binding on user input | Binding on tool outputs if authoritative |
| RFC-0006 | Evidence bound before single proposal | Evidence accumulates across loop iterations |
| RFC-0007 | LLM sees no auth logic | Auth decisions not added to agent context |
| RFC-0009 | Envelope wraps final output | Envelope required at each emission boundary |
| RFC-0010 | Fallback for degraded mode | Fallback enables realtime streaming |
Acceptance Criteria
A system is compliant with RFC-0012 if:
- Every emission point is classified
- Tool calls are governed according to declared tiers
- Visible chain-of-thought is scanned for soft authority (or hidden)
- Multi-turn loops maintain iteration governance and bounded iterations
- Streaming respects mode constraints
- Opacity is preserved (no auth logic in agent context)
- Self-governance patterns are prohibited