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
2 changes: 1 addition & 1 deletion docs/sep.md
Original file line number Diff line number Diff line change
Expand Up @@ -201,7 +201,7 @@ interface Interceptor {
/**
* Failure routing policy (default: false - fail-closed)
*
* Enforce mode:
* Active mode:
* - false (fail-closed): If the interceptor crashes or times out, block the message
* - true (fail-open): If the interceptor fails, allow the message to proceed
*
Expand Down
2 changes: 1 addition & 1 deletion go/sdk/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ ext.AddInterceptor(&interceptors.Validator{
Events: []string{interceptors.EventToolsCall},
Phase: interceptors.PhaseRequest,
}},
Mode: interceptors.ModeEnforce,
Mode: interceptors.ModeActive,
},
Handler: func(_ context.Context, inv *interceptors.Invocation) (*interceptors.ValidationResult, error) {
raw := inv.Payload.(json.RawMessage)
Expand Down
2 changes: 1 addition & 1 deletion go/sdk/doc/DESIGN.md
Original file line number Diff line number Diff line change
Expand Up @@ -174,7 +174,7 @@ Response-phase validators see the post-mutation payload.

### Validator execution
- All matching validators run in parallel (goroutines).
- A validator returning `Valid: false` with `Severity: "error"` in enforced
- A validator returning `Valid: false` with `Severity: "error"` in active
mode aborts the chain.
- `FailOpen: true` validators log errors and record an `InvokeResult`
for observability, but don't abort.
Expand Down
2 changes: 1 addition & 1 deletion go/sdk/examples/mutator/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ func main() {
Events: []string{interceptors.EventToolsCall},
Phase: interceptors.PhaseResponse,
}},
Mode: interceptors.ModeEnforce,
Mode: interceptors.ModeActive,
},
Handler: func(_ context.Context, inv *interceptors.Invocation) (*interceptors.MutationResult, error) {
raw, ok := inv.Payload.(json.RawMessage)
Expand Down
2 changes: 1 addition & 1 deletion go/sdk/examples/validator/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ func main() {
Events: []string{interceptors.EventToolsCall},
Phase: interceptors.PhaseRequest,
}},
Mode: interceptors.ModeEnforce,
Mode: interceptors.ModeActive,
},
Handler: func(_ context.Context, inv *interceptors.Invocation) (*interceptors.ValidationResult, error) {
raw, ok := inv.Payload.(json.RawMessage)
Expand Down
24 changes: 12 additions & 12 deletions go/sdk/interceptors/chain/chain_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ func TestChain_ExecutionHandler(t *testing.T) {
wantNoPayload bool
}{
{
name: "audit-to-enforce validator override aborts chain",
name: "audit-to-active validator override aborts chain",
interceptor: &interceptors.Validator{
Metadata: interceptors.Metadata{
Name: "v",
Expand All @@ -169,18 +169,18 @@ func TestChain_ExecutionHandler(t *testing.T) {
}, nil
},
},
directive: &chain.Directive{Mode: modePtr(interceptors.ModeEnforce)},
directive: &chain.Directive{Mode: modePtr(interceptors.ModeActive)},
phase: interceptors.PhaseRequest,
wantStatus: chain.ChainValidationFailed,
wantAborted: true,
},
{
name: "enforce-to-audit validator override does not abort",
name: "active-to-audit validator override does not abort",
interceptor: &interceptors.Validator{
Metadata: interceptors.Metadata{
Name: "v",
Hooks: []interceptors.Hook{{Events: []string{"test/event"}, Phase: interceptors.PhaseRequest}},
Mode: interceptors.ModeEnforce,
Mode: interceptors.ModeActive,
},
Handler: func(_ context.Context, _ *interceptors.Invocation) (*interceptors.ValidationResult, error) {
return &interceptors.ValidationResult{
Expand All @@ -199,7 +199,7 @@ func TestChain_ExecutionHandler(t *testing.T) {
Metadata: interceptors.Metadata{
Name: "m",
Hooks: []interceptors.Hook{{Events: []string{"test/event"}, Phase: interceptors.PhaseResponse}},
Mode: interceptors.ModeEnforce,
Mode: interceptors.ModeActive,
},
Handler: func(_ context.Context, _ *interceptors.Invocation) (*interceptors.MutationResult, error) {
modified, _ := json.Marshal(map[string]any{"value": "mutated"})
Expand All @@ -217,7 +217,7 @@ func TestChain_ExecutionHandler(t *testing.T) {
Metadata: interceptors.Metadata{
Name: "v",
Hooks: []interceptors.Hook{{Events: []string{"test/event"}, Phase: interceptors.PhaseRequest}},
Mode: interceptors.ModeEnforce,
Mode: interceptors.ModeActive,
},
Handler: func(_ context.Context, _ *interceptors.Invocation) (*interceptors.ValidationResult, error) {
return &interceptors.ValidationResult{
Expand Down Expand Up @@ -275,7 +275,7 @@ func TestChain_ExecutionHandler_ShortCircuit(t *testing.T) {
Metadata: interceptors.Metadata{
Name: "v",
Hooks: []interceptors.Hook{{Events: []string{"test/event"}, Phase: interceptors.PhaseRequest}},
Mode: interceptors.ModeEnforce,
Mode: interceptors.ModeActive,
},
Handler: func(_ context.Context, _ *interceptors.Invocation) (*interceptors.ValidationResult, error) {
invoked = true
Expand Down Expand Up @@ -320,7 +320,7 @@ func TestChain_FailOpenRecordsExecutionResult(t *testing.T) {
Events: []string{"test/event"},
Phase: interceptors.PhaseRequest,
}},
Mode: interceptors.ModeEnforce,
Mode: interceptors.ModeActive,
FailOpen: true,
},
Handler: func(_ context.Context, _ *interceptors.Invocation) (*interceptors.ValidationResult, error) {
Expand All @@ -334,7 +334,7 @@ func TestChain_FailOpenRecordsExecutionResult(t *testing.T) {
Events: []string{"test/event"},
Phase: interceptors.PhaseRequest,
}},
Mode: interceptors.ModeEnforce,
Mode: interceptors.ModeActive,
},
Handler: func(_ context.Context, _ *interceptors.Invocation) (*interceptors.ValidationResult, error) {
return &interceptors.ValidationResult{Valid: true}, nil
Expand Down Expand Up @@ -368,7 +368,7 @@ func TestChain_FailOpenRecordsExecutionResult(t *testing.T) {
Events: []string{"test/event"},
Phase: interceptors.PhaseResponse,
}},
Mode: interceptors.ModeEnforce,
Mode: interceptors.ModeActive,
FailOpen: true,
PriorityHint: interceptors.NewPriority(10),
},
Expand All @@ -383,7 +383,7 @@ func TestChain_FailOpenRecordsExecutionResult(t *testing.T) {
Events: []string{"test/event"},
Phase: interceptors.PhaseResponse,
}},
Mode: interceptors.ModeEnforce,
Mode: interceptors.ModeActive,
PriorityHint: interceptors.NewPriority(20),
},
Handler: func(_ context.Context, _ *interceptors.Invocation) (*interceptors.MutationResult, error) {
Expand Down Expand Up @@ -468,7 +468,7 @@ func TestChain_AuditModeErrorsDoNotAbort(t *testing.T) {
Events: []string{"test/event"},
Phase: interceptors.PhaseResponse,
}},
Mode: interceptors.ModeEnforce,
Mode: interceptors.ModeActive,
PriorityHint: interceptors.NewPriority(20),
},
Handler: func(_ context.Context, _ *interceptors.Invocation) (*interceptors.MutationResult, error) {
Expand Down
16 changes: 8 additions & 8 deletions go/sdk/interceptors/doc.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
//
// A [Validator] inspects the payload and decides whether the request
// or response should proceed. All validators for a given event run
// in parallel. If any validator in enforced mode ([ModeEnforce])
// in parallel. If any validator in active mode ([ModeActive])
// returns an error-severity message, the chain aborts before any
// mutators run. Only error-severity messages cause an abort; warn
// and info findings are recorded in the chain execution result but
Expand All @@ -51,7 +51,7 @@
// Events: []string{"tools/call"},
// Phase: interceptors.PhaseRequest,
// }},
// Mode: interceptors.ModeEnforce,
// Mode: interceptors.ModeActive,
// },
// Handler: func(ctx context.Context, inv *interceptors.Invocation) (*interceptors.ValidationResult, error) {
// raw := inv.Payload.(json.RawMessage)
Expand Down Expand Up @@ -79,7 +79,7 @@
// Events: []string{"tools/call"},
// Phase: interceptors.PhaseResponse,
// }},
// Mode: interceptors.ModeEnforce,
// Mode: interceptors.ModeActive,
// },
// Handler: func(ctx context.Context, inv *interceptors.Invocation) (*interceptors.MutationResult, error) {
// raw := inv.Payload.(json.RawMessage)
Expand Down Expand Up @@ -112,7 +112,7 @@
// successful results, and a FailOpen flag that controls what happens
// when the handler returns a Go error. These are orthogonal:
//
// - [ModeEnforce]: fully enforced — validation failures block,
// - [ModeActive]: fully active — validation failures block,
// mutations are applied.
// - [ModeAudit]: the handler runs and results are recorded, but
// validation findings do not block and mutated payloads are
Expand All @@ -138,15 +138,15 @@
//
// Behavior matrix for validators:
//
// Mode=Enforce, FailOpen=false → error aborts, Valid=false+SeverityError aborts
// Mode=Enforce, FailOpen=true → error continues, Valid=false+SeverityError aborts
// Mode=Active, FailOpen=false → error aborts, Valid=false+SeverityError aborts
// Mode=Active, FailOpen=true → error continues, Valid=false+SeverityError aborts
// Mode=Audit, FailOpen=false → error aborts, findings recorded only
// Mode=Audit, FailOpen=true → error continues, findings recorded only
//
// Behavior matrix for mutators:
//
// Mode=Enforce, FailOpen=false → error aborts, mutations applied
// Mode=Enforce, FailOpen=true → error continues, mutations applied
// Mode=Active, FailOpen=false → error aborts, mutations applied
// Mode=Active, FailOpen=true → error continues, mutations applied
// Mode=Audit, FailOpen=false → error aborts, mutations not propagated
// Mode=Audit, FailOpen=true → error continues, mutations not propagated
package interceptors
8 changes: 4 additions & 4 deletions go/sdk/interceptors/extension/rpc_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ func TestListWithEventFilter(t *testing.T) {
Events: []string{interceptors.EventPromptsGet},
Phase: interceptors.PhaseRequest,
}},
Mode: interceptors.ModeEnforce,
Mode: interceptors.ModeActive,
},
Handler: func(_ context.Context, _ *interceptors.Invocation) (*interceptors.ValidationResult, error) {
return &interceptors.ValidationResult{Valid: true}, nil
Expand Down Expand Up @@ -122,7 +122,7 @@ func TestInvokeValidatorRejects(t *testing.T) {
Events: []string{interceptors.EventToolsCall},
Phase: interceptors.PhaseRequest,
}},
Mode: interceptors.ModeEnforce,
Mode: interceptors.ModeActive,
},
Handler: func(_ context.Context, _ *interceptors.Invocation) (*interceptors.ValidationResult, error) {
return &interceptors.ValidationResult{
Expand Down Expand Up @@ -166,7 +166,7 @@ func TestInvokeMutator(t *testing.T) {
Events: []string{interceptors.EventToolsCall},
Phase: interceptors.PhaseRequest,
}},
Mode: interceptors.ModeEnforce,
Mode: interceptors.ModeActive,
},
Handler: func(_ context.Context, inv *interceptors.Invocation) (*interceptors.MutationResult, error) {
raw, ok := inv.Payload.(json.RawMessage)
Expand Down Expand Up @@ -244,7 +244,7 @@ func TestInvokeTimeout(t *testing.T) {
Events: []string{interceptors.EventToolsCall},
Phase: interceptors.PhaseRequest,
}},
Mode: interceptors.ModeEnforce,
Mode: interceptors.ModeActive,
},
Handler: func(ctx context.Context, _ *interceptors.Invocation) (*interceptors.ValidationResult, error) {
select {
Expand Down
Loading
Loading