iop/apps/edge/internal/openai/single_request_preset_binding_test.go
toki 31fada5d08 fix(single_request): 템플릿 승인 경계를 닫고 회귀 근거를 채운다
공식 리뷰가 지적한 두 가지 승인 경계 결함을 고친다. `plan_file`/`review_file`은
edge.yaml 디렉터리 기준 상대 경로만 허용하고 절대/빈 경로는 파일 접근 전에 거부한다.
필수 heading과 Review `PASS`는 부분 문자열이 아니라 정확한 단독 줄로 검증하며,
문서화된 placeholder를 제거한 뒤 남는 `{{`/`}}`를 거부해 문법을 닫는다.

리뷰가 존재한다고 기술했지만 실제로는 없던 회귀 근거를 추가한다. admission 시
고정된 effective 템플릿 쌍이 clone과 workspace 재검증을 통과하는지, refresh가
이미 승인된 요청이 아니라 새 요청에만 적용되는지, custom Review 템플릿이 내부
artifact만 바꾸고 caller 최종 출력은 그대로인지를 각각 확정 검증한다.

현재 문서도 실제 동작에 맞춘다. Edge 실행 spec의 낡은 Plan JSON Schema 서술을
direct PlanMD 검증으로 고치고, outer Anthropic 계약과 input spec에 템플릿이
Edge 내부 stage 입력일 뿐 caller 요청/응답 계약을 바꾸지 않음을 명시한다.

Refs: agent-task/single_request_plan_review_templates/PLAN-cloud-G08.md
2026-08-09 09:25:27 +09:00

731 lines
28 KiB
Go

package openai
import (
"errors"
"strings"
"testing"
"iop/apps/edge/internal/authprojection"
edgeservice "iop/apps/edge/internal/service"
"iop/packages/go/config"
"iop/packages/go/singlerequesttemplate"
)
func newTestView(principalRef string, routes []authprojection.Route) authprojection.AuthenticatedView {
return authprojection.AuthenticatedView{
Principal: authprojection.Principal{
PrincipalRef: principalRef,
},
Routes: routes,
}
}
func managedBinding(modelGroupKey, providerID, principalRef, routeID string, managed bool) routeDispatch {
return managedBindingFull(modelGroupKey, providerID, principalRef, routeID, "profile-1", managed)
}
func managedBindingFull(modelGroupKey, providerID, principalRef, routeID, profileID string, managed bool) routeDispatch {
return routeDispatch{
Managed: managed,
ModelGroupKey: modelGroupKey,
ProviderID: providerID,
PrincipalRef: principalRef,
RouteID: routeID,
ProfileID: profileID,
CredentialSlotRef: "slot-1",
CredentialRevision: 1,
RouteRevision: 1,
}
}
// validSingleRequestPreset returns an approved fixed single-request preset whose
// selector, allowed modes, and light route exactly match the frozen
// plan→work→review policy stages: high reasoning on plan/review, none on work,
// and the selector fused to the plan stage. Each call builds fresh option maps so
// subtests may mutate one aspect in isolation.
func validSingleRequestPreset() config.ExecutionPreset {
return config.ExecutionPreset{
ID: "preset-single-request",
Selector: config.ExecutionModelBinding{
Model: "plan-model",
Options: map[string]any{"reasoning_effort": "high"},
},
AllowedModes: []string{config.ModeLight},
Routes: map[string]config.ExecutionRoute{
config.ModeLight: {
Stages: []config.ExecutionRouteStage{
{Role: "plan", Model: "plan-model", Options: map[string]any{"reasoning_effort": "high"}},
{Role: "work", Model: "work-model"},
{Role: "review", Model: "review-model", Options: map[string]any{"reasoning_effort": "high"}},
},
},
},
SingleRequest: &config.ExecutionSingleRequestPolicy{
WorkspaceRef: "ws-opaque-ref",
Limits: config.ExecutionSingleRequestLimits{
WallClockMS: 30 * 60 * 1000,
StageTimeoutMS: 10 * 60 * 1000,
MaxToolIterations: 64,
MaxOutputBytes: 16 * 1024 * 1024,
},
Stages: config.ExecutionSingleRequestStages{
Plan: config.ExecutionSingleRequestStageConfig{Model: "plan-model", Options: map[string]any{"reasoning_effort": "high"}},
Work: config.ExecutionSingleRequestStageConfig{Model: "work-model"},
Review: config.ExecutionSingleRequestStageConfig{Model: "review-model", Options: map[string]any{"reasoning_effort": "high"}},
},
},
}
}
// validSingleRequestBindings returns managed, same-principal canonical bindings
// for the plan/work/review models referenced by validSingleRequestPreset.
func validSingleRequestBindings() map[string]routeDispatch {
return map[string]routeDispatch{
"plan-model": managedBinding("plan-model", "prov-1", "principal-1", "route-plan", true),
"work-model": managedBinding("work-model", "prov-1", "principal-1", "route-work", true),
"review-model": managedBinding("review-model", "prov-1", "principal-1", "route-review", true),
}
}
func TestSingleRequestPresetBindingManaged(t *testing.T) {
preset := validSingleRequestPreset()
bindings := validSingleRequestBindings()
view := newTestView("principal-1", nil)
binding, err := compileSingleRequestBinding("virtual-public-model", preset, bindings, view)
if err != nil {
t.Fatalf("managed compilation failed: %v", err)
}
if binding == nil {
t.Fatal("expected non-nil binding")
}
if binding.PublicModel != "virtual-public-model" {
t.Errorf("PublicModel=%q, want virtual-public-model", binding.PublicModel)
}
if binding.WorkspaceRef != "ws-opaque-ref" {
t.Errorf("WorkspaceRef=%q, want ws-opaque-ref", binding.WorkspaceRef)
}
if binding.Plan.Model != "plan-model" {
t.Errorf("Plan.Model=%q, want plan-model", binding.Plan.Model)
}
if binding.Work.Model != "work-model" {
t.Errorf("Work.Model=%q, want work-model", binding.Work.Model)
}
if binding.Review.Model != "review-model" {
t.Errorf("Review.Model=%q, want review-model", binding.Review.Model)
}
if binding.Limits.WallClockMS != 30*60*1000 {
t.Errorf("WallClockMS=%d, want 1800000", binding.Limits.WallClockMS)
}
// Approved fixed options survive admission: high reasoning on plan/review, and
// the work stage carries no reasoning option.
if binding.Plan.Options["reasoning_effort"] != "high" {
t.Errorf("Plan.Options[reasoning_effort]=%v, want high", binding.Plan.Options["reasoning_effort"])
}
if binding.Review.Options["reasoning_effort"] != "high" {
t.Errorf("Review.Options[reasoning_effort]=%v, want high", binding.Review.Options["reasoning_effort"])
}
if _, present := binding.Work.Options["reasoning_effort"]; present {
t.Errorf("Work.Options unexpectedly declares reasoning_effort: %v", binding.Work.Options)
}
}
func TestSingleRequestPresetBindingAllowsInitialManagedRouteRevision(t *testing.T) {
bindings := validSingleRequestBindings()
for model, dispatch := range bindings {
dispatch.RouteRevision = 0
bindings[model] = dispatch
}
binding, err := compileSingleRequestBinding(
"virtual-public-model",
validSingleRequestPreset(),
bindings,
newTestView("principal-1", nil),
)
if err != nil {
t.Fatalf("initial managed route revision rejected: %v", err)
}
for role, stage := range map[string]edgeservice.SingleRequestStageBinding{
"plan": binding.Plan, "work": binding.Work, "review": binding.Review,
} {
if stage.Dispatch.RouteRevision != 0 {
t.Fatalf("%s RouteRevision=%d, want 0", role, stage.Dispatch.RouteRevision)
}
}
}
func TestSingleRequestPresetBindingUnmanaged(t *testing.T) {
preset := validSingleRequestPreset()
_, err := compileSingleRequestBindingForUnmanaged("virtual-model", preset)
if !errors.Is(err, errSingleRequestBindingUnauthorized) {
t.Fatalf("expected errSingleRequestBindingUnauthorized, got %v", err)
}
}
func TestSingleRequestPresetBindingRejectsInvalidDefenseInDepth(t *testing.T) {
view := newTestView("principal-1", nil)
// Binding-resolution defenses: the fixed shape is valid, so compilation reaches
// the per-stage authorization checks against the managed bindings.
t.Run("missing binding", func(t *testing.T) {
bindings := validSingleRequestBindings()
delete(bindings, "plan-model")
_, err := compileSingleRequestBinding("virtual-model", validSingleRequestPreset(), bindings, view)
if !errors.Is(err, errSingleRequestBindingMissingStage) {
t.Fatalf("expected missing stage error, got %v", err)
}
})
t.Run("unmanaged binding", func(t *testing.T) {
bindings := validSingleRequestBindings()
bindings["plan-model"] = managedBinding("plan-model", "prov-1", "principal-1", "route-plan", false)
_, err := compileSingleRequestBinding("virtual-model", validSingleRequestPreset(), bindings, view)
if !errors.Is(err, errSingleRequestBindingUnauthorized) {
t.Fatalf("expected unauthorized error, got %v", err)
}
})
t.Run("wrong principal", func(t *testing.T) {
bindings := validSingleRequestBindings()
bindings["plan-model"] = managedBinding("plan-model", "prov-1", "principal-2", "route-plan", true)
_, err := compileSingleRequestBinding("virtual-model", validSingleRequestPreset(), bindings, view)
if !errors.Is(err, errSingleRequestBindingUnauthorized) {
t.Fatalf("expected unauthorized error, got %v", err)
}
})
t.Run("model group mismatch", func(t *testing.T) {
bindings := validSingleRequestBindings()
bindings["plan-model"] = managedBinding("wrong-group", "prov-1", "principal-1", "route-plan", true)
_, err := compileSingleRequestBinding("virtual-model", validSingleRequestPreset(), bindings, view)
if !errors.Is(err, errSingleRequestBindingInconsistent) {
t.Fatalf("expected inconsistent error, got %v", err)
}
})
// Fixed-shape defenses: these fail before any binding is resolved, so the
// bindings map is valid to prove the rejection comes from the frozen shape.
t.Run("allowed modes not light", func(t *testing.T) {
preset := validSingleRequestPreset()
preset.AllowedModes = []string{config.ModeDirect}
_, err := compileSingleRequestBinding("virtual-model", preset, validSingleRequestBindings(), view)
if !errors.Is(err, errSingleRequestBindingInconsistent) {
t.Fatalf("expected inconsistent error, got %v", err)
}
})
t.Run("selector model mismatch", func(t *testing.T) {
preset := validSingleRequestPreset()
preset.Selector.Model = "other-model"
_, err := compileSingleRequestBinding("virtual-model", preset, validSingleRequestBindings(), view)
if !errors.Is(err, errSingleRequestBindingInconsistent) {
t.Fatalf("expected inconsistent error, got %v", err)
}
})
t.Run("selector options mismatch", func(t *testing.T) {
preset := validSingleRequestPreset()
preset.Selector.Options = map[string]any{"reasoning_effort": "low"}
_, err := compileSingleRequestBinding("virtual-model", preset, validSingleRequestBindings(), view)
if !errors.Is(err, errSingleRequestBindingInconsistent) {
t.Fatalf("expected inconsistent error, got %v", err)
}
})
t.Run("duplicate role", func(t *testing.T) {
duplicateSequences := [][]config.ExecutionRouteStage{
{
{Role: "plan", Model: "plan-model", Options: map[string]any{"reasoning_effort": "high"}},
{Role: "plan", Model: "plan-model", Options: map[string]any{"reasoning_effort": "high"}},
{Role: "review", Model: "review-model", Options: map[string]any{"reasoning_effort": "high"}},
},
{
{Role: "work", Model: "work-model"},
{Role: "work", Model: "work-model"},
{Role: "review", Model: "review-model", Options: map[string]any{"reasoning_effort": "high"}},
},
{
{Role: "plan", Model: "plan-model", Options: map[string]any{"reasoning_effort": "high"}},
{Role: "review", Model: "review-model", Options: map[string]any{"reasoning_effort": "high"}},
{Role: "review", Model: "review-model", Options: map[string]any{"reasoning_effort": "high"}},
},
}
for _, seq := range duplicateSequences {
preset := validSingleRequestPreset()
route := preset.Routes[config.ModeLight]
route.Stages = seq
preset.Routes[config.ModeLight] = route
_, err := compileSingleRequestBinding("virtual-model", preset, validSingleRequestBindings(), view)
if !errors.Is(err, errSingleRequestBindingDuplicate) {
t.Fatalf("expected duplicate error for sequence %+v, got %v", seq, err)
}
}
})
t.Run("extra route key", func(t *testing.T) {
preset := validSingleRequestPreset()
preset.Routes[config.ModeDirect] = config.ExecutionRoute{
Stages: []config.ExecutionRouteStage{
{Role: "plan", Model: "plan-model"},
},
}
_, err := compileSingleRequestBinding("virtual-model", preset, validSingleRequestBindings(), view)
if !errors.Is(err, errSingleRequestBindingInconsistent) {
t.Fatalf("expected inconsistent error for extra route key, got %v", err)
}
})
t.Run("route policy model mismatch", func(t *testing.T) {
preset := validSingleRequestPreset()
route := preset.Routes[config.ModeLight]
route.Stages[1].Model = "other-work-model"
preset.Routes[config.ModeLight] = route
_, err := compileSingleRequestBinding("virtual-model", preset, validSingleRequestBindings(), view)
if !errors.Is(err, errSingleRequestBindingDynamic) {
t.Fatalf("expected dynamic error, got %v", err)
}
})
t.Run("plan option mismatch", func(t *testing.T) {
preset := validSingleRequestPreset()
route := preset.Routes[config.ModeLight]
route.Stages[0].Options = map[string]any{"reasoning_effort": "low"}
preset.Routes[config.ModeLight] = route
_, err := compileSingleRequestBinding("virtual-model", preset, validSingleRequestBindings(), view)
if !errors.Is(err, errSingleRequestBindingInconsistent) {
t.Fatalf("expected inconsistent error, got %v", err)
}
})
t.Run("review option mismatch", func(t *testing.T) {
preset := validSingleRequestPreset()
route := preset.Routes[config.ModeLight]
route.Stages[2].Options = map[string]any{"reasoning_effort": "low"}
preset.Routes[config.ModeLight] = route
_, err := compileSingleRequestBinding("virtual-model", preset, validSingleRequestBindings(), view)
if !errors.Is(err, errSingleRequestBindingInconsistent) {
t.Fatalf("expected inconsistent error, got %v", err)
}
})
t.Run("work reasoning option", func(t *testing.T) {
preset := validSingleRequestPreset()
preset.SingleRequest.Stages.Work.Options = map[string]any{"reasoning_effort": "high"}
_, err := compileSingleRequestBinding("virtual-model", preset, validSingleRequestBindings(), view)
if !errors.Is(err, errSingleRequestBindingInconsistent) {
t.Fatalf("expected inconsistent error, got %v", err)
}
})
}
func TestSingleRequestPresetBindingNoPresetPolicy(t *testing.T) {
preset := config.ExecutionPreset{
ID: "preset-no-single-request",
Selector: config.ExecutionModelBinding{Model: "selector-model"},
AllowedModes: []string{config.ModeLight},
Routes: map[string]config.ExecutionRoute{
config.ModeLight: {
Stages: []config.ExecutionRouteStage{
{Role: "local", Model: "local-model"},
{Role: "review", Model: "review-model"},
},
},
},
}
bindings := map[string]routeDispatch{
"selector-model": managedBinding("selector-model", "prov-1", "principal-1", "route-s", true),
}
view := newTestView("principal-1", nil)
binding, err := compileSingleRequestBinding("virtual-model", preset, bindings, view)
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
if binding != nil {
t.Fatalf("expected nil binding for preset without SingleRequest policy, got %+v", binding)
}
}
func TestSingleRequestPresetBindingRefreshIsolation(t *testing.T) {
preset := validSingleRequestPreset()
bindings := validSingleRequestBindings()
view := newTestView("principal-1", nil)
binding, err := compileSingleRequestBinding("virtual-public-model", preset, bindings, view)
if err != nil {
t.Fatalf("compilation failed: %v", err)
}
// The admitted binding must start with non-empty approved options.
if binding.Plan.Options["reasoning_effort"] != "high" || binding.Review.Options["reasoning_effort"] != "high" {
t.Fatalf("expected admitted high options, got plan=%v review=%v", binding.Plan.Options, binding.Review.Options)
}
// Simulate a config refresh: mutate the approved stage option values after
// compilation. The already admitted binding must not reflect the mutation.
preset.SingleRequest.Stages.Plan.Options["reasoning_effort"] = "low"
preset.SingleRequest.Stages.Review.Options["reasoning_effort"] = "low"
if binding.Plan.Options["reasoning_effort"] != "high" {
t.Errorf("binding Plan.Options reflected refresh mutation: %v", binding.Plan.Options["reasoning_effort"])
}
if binding.Review.Options["reasoning_effort"] != "high" {
t.Errorf("binding Review.Options reflected refresh mutation: %v", binding.Review.Options["reasoning_effort"])
}
// Simulate a catalog refresh: add a new entry to the bindings map. The
// compiled binding must still reference the original models.
bindings["extra-model"] = managedBinding("extra-model", "prov-2", "principal-1", "route-extra", true)
if binding.Plan.Model != "plan-model" || binding.Work.Model != "work-model" || binding.Review.Model != "review-model" {
t.Errorf("binding models changed after refresh: plan=%q work=%q review=%q",
binding.Plan.Model, binding.Work.Model, binding.Review.Model)
}
}
// customPresetPlanTemplate and customPresetReviewTemplate are operator-authored
// effective templates that differ from the built-in defaults, so an admitted
// snapshot cannot pass by accidentally falling back.
const (
customPresetPlanTemplate = `# Plan
Operator preamble v1.
## Goal
{{goal}}
## Steps
{{steps}}
## Verification
{{verification}}
`
customPresetReviewTemplate = `# Review
Operator preamble v1.
## Result
PASS
## Checks
{{checks}}
## Verification
{{verification}}
## Summary
{{summary}}
`
refreshedPresetPlanTemplate = `# Plan
Operator preamble v2.
## Goal
{{goal}}
## Steps
{{steps}}
## Verification
{{verification}}
`
refreshedPresetReviewTemplate = `# Review
Operator preamble v2.
## Result
PASS
## Checks
{{checks}}
## Verification
{{verification}}
## Summary
{{summary}}
`
)
// TestSingleRequestPresetBindingTemplateRefreshIsolation proves the effective
// template pair is frozen at admission: an already admitted binding keeps its
// pair across a preset refresh, while a request admitted after the refresh
// observes the refreshed pair.
func TestSingleRequestPresetBindingTemplateRefreshIsolation(t *testing.T) {
preset := validSingleRequestPreset()
preset.SingleRequest.Templates.EffectivePlan = customPresetPlanTemplate
preset.SingleRequest.Templates.EffectiveReview = customPresetReviewTemplate
bindings := validSingleRequestBindings()
view := newTestView("principal-1", nil)
admitted, err := compileSingleRequestBinding("virtual-public-model", preset, bindings, view)
if err != nil {
t.Fatalf("compilation failed: %v", err)
}
if admitted.Templates.Plan != customPresetPlanTemplate || admitted.Templates.Review != customPresetReviewTemplate {
t.Fatalf("admitted templates = %+v, want the configured pair", admitted.Templates)
}
// Simulate a config refresh that replaces the operator templates.
preset.SingleRequest.Templates.EffectivePlan = refreshedPresetPlanTemplate
preset.SingleRequest.Templates.EffectiveReview = refreshedPresetReviewTemplate
// Already admitted work keeps the frozen pair, including through the clone
// the coordinator hands to executors.
if admitted.Templates.Plan != customPresetPlanTemplate {
t.Errorf("admitted Templates.Plan reflected the refresh: %q", admitted.Templates.Plan)
}
if admitted.Templates.Review != customPresetReviewTemplate {
t.Errorf("admitted Templates.Review reflected the refresh: %q", admitted.Templates.Review)
}
if clone := admitted.Clone(); clone.Templates != admitted.Templates {
t.Errorf("clone templates = %+v, want %+v", clone.Templates, admitted.Templates)
}
// Newly admitted work observes the refreshed pair.
refreshed, err := compileSingleRequestBinding("virtual-public-model", preset, bindings, view)
if err != nil {
t.Fatalf("post-refresh compilation failed: %v", err)
}
if refreshed.Templates.Plan != refreshedPresetPlanTemplate || refreshed.Templates.Review != refreshedPresetReviewTemplate {
t.Fatalf("post-refresh templates = %+v, want the refreshed pair", refreshed.Templates)
}
}
// TestSingleRequestPresetBindingTemplateFallback proves each effective template
// falls back to its built-in default independently and that a preset carrying
// an invalid effective template cannot compile an admission.
func TestSingleRequestPresetBindingTemplateFallback(t *testing.T) {
view := newTestView("principal-1", nil)
t.Run("both templates fall back", func(t *testing.T) {
binding, err := compileSingleRequestBinding("virtual-public-model", validSingleRequestPreset(), validSingleRequestBindings(), view)
if err != nil {
t.Fatalf("compilation failed: %v", err)
}
if binding.Templates.Plan != singlerequesttemplate.DefaultPlanTemplate {
t.Errorf("Templates.Plan = %q, want the built-in default", binding.Templates.Plan)
}
if binding.Templates.Review != singlerequesttemplate.DefaultReviewTemplate {
t.Errorf("Templates.Review = %q, want the built-in default", binding.Templates.Review)
}
})
t.Run("plan configured and review falls back", func(t *testing.T) {
preset := validSingleRequestPreset()
preset.SingleRequest.Templates.EffectivePlan = customPresetPlanTemplate
binding, err := compileSingleRequestBinding("virtual-public-model", preset, validSingleRequestBindings(), view)
if err != nil {
t.Fatalf("compilation failed: %v", err)
}
if binding.Templates.Plan != customPresetPlanTemplate {
t.Errorf("Templates.Plan = %q, want the configured template", binding.Templates.Plan)
}
if binding.Templates.Review != singlerequesttemplate.DefaultReviewTemplate {
t.Errorf("Templates.Review = %q, want the built-in default", binding.Templates.Review)
}
})
t.Run("review configured and plan falls back", func(t *testing.T) {
preset := validSingleRequestPreset()
preset.SingleRequest.Templates.EffectiveReview = customPresetReviewTemplate
binding, err := compileSingleRequestBinding("virtual-public-model", preset, validSingleRequestBindings(), view)
if err != nil {
t.Fatalf("compilation failed: %v", err)
}
if binding.Templates.Review != customPresetReviewTemplate {
t.Errorf("Templates.Review = %q, want the configured template", binding.Templates.Review)
}
if binding.Templates.Plan != singlerequesttemplate.DefaultPlanTemplate {
t.Errorf("Templates.Plan = %q, want the built-in default", binding.Templates.Plan)
}
})
t.Run("invalid effective template fails admission closed", func(t *testing.T) {
preset := validSingleRequestPreset()
preset.SingleRequest.Templates.EffectivePlan = "### Plan\n\n## Goal\n{{goal}}\n\n## Steps\n{{steps}}\n\n## Verification\n{{verification}}\n"
if _, err := compileSingleRequestBinding("virtual-public-model", preset, validSingleRequestBindings(), view); err == nil {
t.Error("expected rejection for a decorated Plan heading")
}
preset = validSingleRequestPreset()
preset.SingleRequest.Templates.EffectiveReview = strings.Replace(customPresetReviewTemplate, "PASS", "NOTPASS", 1)
if _, err := compileSingleRequestBinding("virtual-public-model", preset, validSingleRequestBindings(), view); err == nil {
t.Error("expected rejection for a NOTPASS Review result line")
}
})
}
func TestSingleRequestPresetBindingPublicModelEcho(t *testing.T) {
preset := validSingleRequestPreset()
bindings := validSingleRequestBindings()
view := newTestView("principal-1", nil)
// Public model echo: the binding's PublicModel equals the requested virtual
// model ID, not the selector's route ID or canonical model group.
expectedPublicModels := []string{"virtual-gpt-combo", "my-cool-preset", "preset-alpha"}
for _, publicModel := range expectedPublicModels {
binding, err := compileSingleRequestBinding(publicModel, preset, bindings, view)
if err != nil {
t.Fatalf("compilation failed for %q: %v", publicModel, err)
}
if binding.PublicModel != publicModel {
t.Errorf("PublicModel=%q, want %q", binding.PublicModel, publicModel)
}
// The canonical stage models must never equal the public model.
if binding.Plan.Model == publicModel || binding.Work.Model == publicModel || binding.Review.Model == publicModel {
t.Errorf("stage model unexpectedly equals public model %q", publicModel)
}
}
}
func TestSingleRequestPresetBindingDefensiveCopies(t *testing.T) {
preset := validSingleRequestPreset()
bindings := validSingleRequestBindings()
view := newTestView("principal-1", nil)
binding, err := compileSingleRequestBinding("virtual-model", preset, bindings, view)
if err != nil {
t.Fatalf("compilation failed: %v", err)
}
// The admitted binding carries the approved non-empty plan/review options.
if binding.Plan.Options["reasoning_effort"] != "high" {
t.Fatalf("Plan.Options[reasoning_effort]=%v, want high", binding.Plan.Options["reasoning_effort"])
}
// Clone the binding and verify deep-copy isolation of both structural values
// and the stage option maps in both mutation directions.
clone := binding.Clone()
if clone == nil {
t.Fatal("Clone returned nil")
}
if clone.PublicModel != binding.PublicModel {
t.Errorf("clone PublicModel mismatch")
}
if clone.Plan.Model != binding.Plan.Model || clone.Work.Model != binding.Work.Model || clone.Review.Model != binding.Review.Model {
t.Errorf("clone stage model mismatch: %+v", clone)
}
// Mutating the clone's options must not affect the original.
clone.Plan.Options["reasoning_effort"] = "low"
if binding.Plan.Options["reasoning_effort"] != "high" {
t.Errorf("original Plan.Options mutated through clone: %v", binding.Plan.Options["reasoning_effort"])
}
// Mutating the original's options must not affect the clone.
binding.Review.Options["reasoning_effort"] = "medium"
if clone.Review.Options["reasoning_effort"] != "high" {
t.Errorf("clone Review.Options mutated through original: %v", clone.Review.Options["reasoning_effort"])
}
}
// ensure edgeservice import is used
var _ = edgeservice.SingleRequestBinding{}
func TestSingleRequestPresetBindingDispatchSnapshot(t *testing.T) {
preset := validSingleRequestPreset()
bindings := validSingleRequestBindings()
view := newTestView("principal-1", nil)
binding, err := compileSingleRequestBinding("virtual-model", preset, bindings, view)
if err != nil {
t.Fatalf("compilation failed: %v", err)
}
// Each stage must carry a non-nil dispatch snapshot with the expected facts.
for name, stage := range map[string]edgeservice.SingleRequestStageBinding{
"plan": binding.Plan,
"work": binding.Work,
"review": binding.Review,
} {
if stage.Dispatch == nil {
t.Errorf("%s.Dispatch is nil", name)
continue
}
if !stage.Dispatch.Managed {
t.Errorf("%s.Dispatch.Managed=false", name)
}
if stage.Dispatch.PrincipalRef != "principal-1" {
t.Errorf("%s.Dispatch.PrincipalRef=%q, want principal-1", name, stage.Dispatch.PrincipalRef)
}
if stage.Dispatch.CredentialSlotRef == "" {
t.Errorf("%s.Dispatch.CredentialSlotRef is empty", name)
}
if stage.Dispatch.RouteRevision < 1 {
t.Errorf("%s.Dispatch.RouteRevision=%d, want >= 1", name, stage.Dispatch.RouteRevision)
}
if stage.Dispatch.CredentialRevision < 1 {
t.Errorf("%s.Dispatch.CredentialRevision=%d, want >= 1", name, stage.Dispatch.CredentialRevision)
}
}
// CredentialBindingSnapshot must return a non-nil, non-empty binding.
cb := binding.Plan.Dispatch.CredentialBindingSnapshot()
if cb == nil {
t.Fatal("Plan credential binding snapshot is nil")
}
if cb.PrincipalRef != "principal-1" {
t.Errorf("CredentialBindingSnapshot.PrincipalRef=%q", cb.PrincipalRef)
}
}
func TestSingleRequestPresetBindingDispatchRefreshIsolation(t *testing.T) {
preset := validSingleRequestPreset()
bindings := validSingleRequestBindings()
view := newTestView("principal-1", nil)
binding, err := compileSingleRequestBinding("virtual-model", preset, bindings, view)
if err != nil {
t.Fatalf("compilation failed: %v", err)
}
originalProviderID := binding.Plan.Dispatch.ProviderID
originalRouteID := binding.Plan.Dispatch.RouteID
// Simulate a catalog refresh: mutate the binding source after compilation.
planBinding := bindings["plan-model"]
planBinding.ProviderID = "mutated-provider"
planBinding.RouteID = "mutated-route"
bindings["plan-model"] = planBinding
if binding.Plan.Dispatch.ProviderID != originalProviderID {
t.Errorf("admitted ProviderID reflected catalog refresh mutation: got %q, want %q",
binding.Plan.Dispatch.ProviderID, originalProviderID)
}
if binding.Plan.Dispatch.RouteID != originalRouteID {
t.Errorf("admitted RouteID reflected catalog refresh mutation: got %q, want %q",
binding.Plan.Dispatch.RouteID, originalRouteID)
}
}
func TestSingleRequestPresetBindingDispatchCloneIndependence(t *testing.T) {
preset := validSingleRequestPreset()
bindings := validSingleRequestBindings()
view := newTestView("principal-1", nil)
binding, err := compileSingleRequestBinding("virtual-model", preset, bindings, view)
if err != nil {
t.Fatalf("compilation failed: %v", err)
}
clone := binding.Clone()
// Mutate the clone's dispatch; the original must be unchanged.
clone.Plan.Dispatch.ProviderID = "clone-mutated"
if binding.Plan.Dispatch.ProviderID != "prov-1" {
t.Errorf("original ProviderID mutated through clone: got %q", binding.Plan.Dispatch.ProviderID)
}
// Mutate the original's dispatch; the clone must retain its own mutation,
// not reflect the original's new value.
binding.Plan.Dispatch.ProviderID = "orig-mutated"
if clone.Plan.Dispatch.ProviderID != "clone-mutated" {
t.Errorf("clone ProviderID unexpectedly changed: got %q, want clone-mutated", clone.Plan.Dispatch.ProviderID)
}
if binding.Plan.Dispatch.ProviderID != "orig-mutated" {
t.Errorf("original ProviderID not updated: got %q, want orig-mutated", binding.Plan.Dispatch.ProviderID)
}
}