Files
dingtalk-workspace-cli/internal/cli/schema_parameter_mapping_completeness_test.go
玉澜andCursor 98f45cfe23 Retire dead MCP pin candidates from Schema parameter assembly.
Production already ships an empty pin; remove the leftover mcp_metadata
candidate path so parameter resolution only uses declare/Cobra sources.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-05 22:45:33 +08:00

740 lines
29 KiB
Go

// Copyright 2026 Alibaba Group
// Licensed under the Apache License, Version 2.0 (the "License");
package cli
import (
"encoding/json"
"fmt"
"sort"
"strings"
"testing"
"github.com/DingTalk-Real-AI/dingtalk-workspace-cli/internal/corecmd/contract"
"github.com/spf13/cobra"
)
type schemaParameterMappingFlagAudit struct {
canonical string
flagName string
mode string
availability string
property string
metadataKey string
metadataParams map[string]embeddedMCPParamMeta
parameter map[string]any
}
func TestDeliveryCatalogMCPParameterMappingsAreComplete(t *testing.T) {
loaded := mustDeliverySchemaCatalogMaps(t)
if !deliverySchemaCatalogAvailable() {
t.Fatalf("delivery schema Catalog is unavailable: %v", deliverySchemaCatalogError())
}
bindings, err := runtimeSchemaParameterBindingData()
if err != nil {
t.Fatalf("runtimeSchemaParameterBindingData() error = %v", err)
}
// Pinned MCP metadata is retired. Audit declaration/exclusion structure
// only — no property∈pin resolution.
problems := auditSchemaParameterMappings(
loaded.Snapshot.Tools,
emptyPinnedMCPMetadata(),
bindings,
)
if len(problems) > 0 {
t.Fatalf("final Catalog parameter mapping audit found %d problem(s):\n%s", len(problems), limitedSchemaMappingProblems(problems, 80))
}
}
func TestDeliveryCatalogDoesNotProjectHardRequiredFlagsAsOptional(t *testing.T) {
loaded := mustDeliverySchemaCatalogMaps(t)
if !deliverySchemaCatalogAvailable() {
t.Fatalf("delivery schema Catalog is unavailable: %v", deliverySchemaCatalogError())
}
var problems []string
for canonical, tool := range loaded.Snapshot.Tools {
parameters, _ := tool["parameters"].(map[string]any)
for name, raw := range parameters {
parameter, _ := raw.(map[string]any)
if parameter["cli_required"] == true && parameter["required"] == false {
problems = append(problems, canonical+" --"+name)
}
}
}
sort.Strings(problems)
if len(problems) > 0 {
t.Fatalf("Catalog projects Cobra hard-required flags as optional required=false: %v", problems)
}
}
func TestDeliveryCatalogLocalInterfacesAreExactAndReviewed(t *testing.T) {
wantReasons := map[string]string{
"audit.export": "命令读取并导出本地审计日志文件,不绑定 pinned MCP RPC",
"audit.tail": "命令读取本地审计日志尾部,不绑定 pinned MCP RPC",
"audit.verify": "命令校验本地审计日志哈希链,不绑定 pinned MCP RPC",
"dev.connect_status": "命令仅操作本地进程或策略文件,不调用 MCP 接口",
"dev.connect_stop": "命令仅操作本地进程或策略文件,不调用 MCP 接口",
"event.list": "命令读取 CLI 内置的个人事件目录,不绑定 pinned MCP RPC",
"event.schema": "命令读取 CLI 内置的个人事件 payload 定义,不绑定 pinned MCP RPC",
"pat.browser_policy": "命令仅操作本地进程或策略文件,不调用 MCP 接口",
}
loaded := mustDeliverySchemaCatalogMaps(t)
if !deliverySchemaCatalogAvailable() {
t.Fatalf("delivery schema Catalog is unavailable: %v", deliverySchemaCatalogError())
}
gotLocal := make(map[string]bool)
for canonical, tool := range loaded.Snapshot.Tools {
if schemaString(tool["interface_mode"]) != contract.InterfaceModeLocal {
continue
}
gotLocal[canonical] = true
wantReason, reviewed := wantReasons[canonical]
if !reviewed {
t.Errorf("%s is classified local without a reviewed pure-local implementation", canonical)
continue
}
if schemaString(tool["availability"]) != contract.InterfaceAvailable {
t.Errorf("%s local availability = %q, want available", canonical, schemaString(tool["availability"]))
}
if tool["interface_ref"] != nil {
t.Errorf("%s local interface_ref = %#v, want nil", canonical, tool["interface_ref"])
}
if got := schemaString(tool["interface_reason"]); got != wantReason {
t.Errorf("%s local reason = %q, want %q", canonical, got, wantReason)
}
provenance := schemaMap(tool["field_provenance"])
for _, field := range []string{"interface_mode", "availability", "interface_ref", "interface_reason"} {
entry := provenance[field]
prec := schemaString(entry["precedence"])
// Production leaf interface facts come from ContractFinal
// (DeclareLeafMetadata / Schema). metadata/*.json shells keep
// tools:{} and must not win reviewed_explicit for these fields.
if prec != "contract_final" {
t.Errorf("%s local %s precedence = %q, want contract_final", canonical, field, prec)
}
if source := schemaString(entry["source"]); source != "corecmd.contract" {
t.Errorf("%s local %s source = %q, want corecmd.contract", canonical, field, source)
}
}
}
for canonical := range wantReasons {
if !gotLocal[canonical] {
t.Errorf("reviewed pure-local command %s is no longer delivered as local", canonical)
}
}
}
func TestSchemaParameterPropertyRoot(t *testing.T) {
tests := []struct {
property string
want string
ok bool
}{
{property: "request", want: "request", ok: true},
{property: "request.value", want: "request", ok: true},
{property: "request[].value", want: "request", ok: true},
{property: " request[0].value ", want: "request", ok: true},
{property: "", ok: false},
{property: ".value", ok: false},
{property: "[].value", ok: false},
}
for _, test := range tests {
t.Run(test.property, func(t *testing.T) {
got, ok := schemaParameterPropertyRoot(test.property)
if got != test.want || ok != test.ok {
t.Fatalf("schemaParameterPropertyRoot(%q) = %q/%t, want %q/%t", test.property, got, ok, test.want, test.ok)
}
})
}
}
func TestSchemaParameterMappingAuditPreservesFalseAndNestedValues(t *testing.T) {
ref := map[string]any{"product_id": "sample", "rpc_name": "read"}
tools := map[string]map[string]any{
"sample.read": {
"canonical_path": "sample.read",
"interface_mode": "mcp",
"availability": "available",
"interface_ref": ref,
"parameters": map[string]any{
"enabled": map[string]any{
"property": "request[].enabled",
"required": false,
"default": false,
},
},
},
}
metadata := embeddedMCPMetadata{Tools: map[string]embeddedMCPToolMetadata{
"sample.read": {
InterfaceRef: &embeddedMCPInterfaceRef{ProductID: "sample", RPCName: "read"},
Parameters: map[string]embeddedMCPParamMeta{
"request": {Type: "object"},
},
},
}}
if problems := auditSchemaParameterMappings(tools, metadata, schemaParameterBindingSnapshot{}); len(problems) != 0 {
t.Fatalf("false/zero-valued parameter was rejected: %v", problems)
}
}
func TestSchemaParameterMappingAuditExclusionRules(t *testing.T) {
directMetadata := embeddedMCPMetadata{Tools: map[string]embeddedMCPToolMetadata{
"sample.read": {
InterfaceRef: &embeddedMCPInterfaceRef{ProductID: "sample", RPCName: "read"},
Parameters: map[string]embeddedMCPParamMeta{"request": {Type: "object"}},
},
}}
excludedParameter := func(candidate string) map[string]any {
return map[string]any{
"required": false,
"field_provenance": map[string]any{
"property": map[string]any{
"value": "",
"source": "reviewed_mapping_exclusion",
"candidates": []any{
map[string]any{"value": "", "source": "reviewed_mapping_exclusion", "selected": true},
map[string]any{"value": candidate, "source": "flag_name_inference", "selected": false},
},
},
},
}
}
tool := func(mode string, parameter map[string]any) map[string]map[string]any {
tools := map[string]map[string]any{
"sample.read": {
"canonical_path": "sample.read",
"interface_mode": mode,
"availability": "available",
"interface_ref": map[string]any{"product_id": "sample", "rpc_name": "read"},
"parameters": map[string]any{"selector": parameter},
},
}
if mode == contract.InterfaceModeComposite {
tools["sample.read"]["interface_ref"] = nil
tools["sample.read"]["interface_reason"] = "Reviewed composite fixture"
tools["sample.read"]["field_provenance"] = map[string]any{
"interface_mode": map[string]any{"precedence": "contract_final"},
"availability": map[string]any{"precedence": "contract_final"},
"interface_ref": map[string]any{"precedence": "contract_final"},
"interface_reason": map[string]any{"precedence": "contract_final"},
}
}
return tools
}
key := "sample.read --selector"
tests := []struct {
name string
tools map[string]map[string]any
metadata embeddedMCPMetadata
snapshot schemaParameterBindingSnapshot
wantProblem string
}{
{
name: "reviewed MCP mismatch",
tools: tool(contract.InterfaceModeMCP, excludedParameter("cliOnly")),
metadata: directMetadata,
snapshot: schemaParameterBindingSnapshot{MappingExclusions: map[string]string{key: "CLI selector is resolved before the RPC"}},
},
{
name: "redundant MCP exclusion",
tools: tool(contract.InterfaceModeMCP, excludedParameter("request.child")),
metadata: directMetadata,
snapshot: schemaParameterBindingSnapshot{MappingExclusions: map[string]string{key: "stale"}},
wantProblem: "already resolves",
},
{
name: "local selector",
tools: tool(contract.InterfaceModeLocal, excludedParameter("selector")),
metadata: embeddedMCPMetadata{Tools: map[string]embeddedMCPToolMetadata{}},
snapshot: schemaParameterBindingSnapshot{MappingExclusions: map[string]string{key: "local planner input"}},
},
{
name: "composite selector",
tools: tool(contract.InterfaceModeComposite, excludedParameter("selector")),
metadata: embeddedMCPMetadata{Tools: map[string]embeddedMCPToolMetadata{}},
snapshot: schemaParameterBindingSnapshot{MappingExclusions: map[string]string{key: "fans out to multiple calls"}},
},
{
name: "binding conflict",
tools: tool(contract.InterfaceModeLocal, excludedParameter("selector")),
metadata: embeddedMCPMetadata{Tools: map[string]embeddedMCPToolMetadata{}},
snapshot: schemaParameterBindingSnapshot{
MappingExclusions: map[string]string{key: "local planner input"},
Bindings: map[string]map[string]string{"sample.read": {"selector": "request"}},
},
wantProblem: "conflicts with versioned binding",
},
{
name: "unknown exact key",
tools: tool(contract.InterfaceModeLocal, excludedParameter("selector")),
metadata: embeddedMCPMetadata{Tools: map[string]embeddedMCPToolMetadata{}},
snapshot: schemaParameterBindingSnapshot{MappingExclusions: map[string]string{"sample.read --missing": "not exact"}},
wantProblem: "does not reference an exact final Catalog parameter",
},
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
problems := auditSchemaParameterMappings(test.tools, test.metadata, test.snapshot)
if test.wantProblem == "" {
if len(problems) != 0 {
t.Fatalf("audit problems = %v", problems)
}
return
}
if !schemaMappingProblemsContain(problems, test.wantProblem) {
t.Fatalf("audit problems = %v, want substring %q", problems, test.wantProblem)
}
})
}
}
func TestRuntimeSchemaReviewedMappingExclusionSelectsEmptyProperty(t *testing.T) {
key := runtimeSchemaParameterMappingKey("sample.read", "local-only")
snapshot := schemaParameterBindingSnapshot{
MappingExclusions: map[string]string{key: "CLI-only selector is resolved before the RPC call"},
}
binding, exclusion, err := runtimeSchemaParameterMappingCandidates(snapshot, "sample.read", "local-only")
if err != nil {
t.Fatal(err)
}
winner, err := resolveRuntimeSchemaCandidate("property",
binding,
exclusion,
runtimeSchemaStringCandidate("localOnly", "flag_name_inference"),
)
if err != nil {
t.Fatal(err)
}
if !winner.Present || winner.Value != "" || winner.Source != "reviewed_mapping_exclusion" || winner.ReviewReason == "" {
t.Fatalf("mapping exclusion winner = %#v", winner)
}
provenance := runtimeSchemaFieldProvenance(winner)
if provenance.Source != "reviewed_mapping_exclusion" || provenance.ReviewReason == "" {
t.Fatalf("mapping exclusion provenance = %#v", provenance)
}
var value string
if err := json.Unmarshal(provenance.Value, &value); err != nil || value != "" {
t.Fatalf("mapping exclusion provenance value = %q/%v", provenance.Value, err)
}
selected := 0
for _, candidate := range provenance.Candidates {
if candidate.Selected != nil && *candidate.Selected {
selected++
if candidate.Source != "reviewed_mapping_exclusion" {
t.Fatalf("selected candidate = %#v", candidate)
}
}
}
if selected != 1 {
t.Fatalf("mapping exclusion selected candidate count = %d", selected)
}
payload, err := (ParameterSpec{
Name: "local-only", Type: "boolean", Description: "test", Property: "",
FieldProvenance: map[string]contract.FieldProvenance{"property": provenance},
}).ToPayload()
if err != nil {
t.Fatal(err)
}
if _, exists := payload["property"]; exists {
t.Fatalf("excluded property leaked into payload: %#v", payload)
}
if schemaMap(payload["field_provenance"])["property"]["source"] != "reviewed_mapping_exclusion" {
t.Fatalf("excluded property provenance missing from payload: %#v", payload)
}
conflict := snapshot
conflict.Bindings = map[string]map[string]string{"sample.read": {"local-only": "localOnly"}}
if _, _, err := runtimeSchemaParameterMappingCandidates(conflict, "sample.read", "local-only"); err == nil || !strings.Contains(err.Error(), "conflicts") {
t.Fatalf("binding + exclusion conflict error = %v", err)
}
missingReason := schemaParameterBindingSnapshot{MappingExclusions: map[string]string{key: " "}}
if _, _, err := runtimeSchemaParameterMappingCandidates(missingReason, "sample.read", "local-only"); err == nil || !strings.Contains(err.Error(), "no reason") {
t.Fatalf("empty exclusion reason error = %v", err)
}
rank, precedence := runtimeSchemaSourcePriority("reviewed_mapping_exclusion")
if rank != runtimeSchemaRankMappingExclusion || precedence != runtimeSchemaPrecedenceMappingExclusion {
t.Fatalf("mapping exclusion precedence = %d/%q", rank, precedence)
}
// Mapping exclusion (660) outranks ParamDecl.Property native rank (655)
// and the generic native_annotation rank (620); retired
// reviewed_manual_hint / tool_schema_hint ranks are gone.
native := runtimeSchemaStringCandidateAtRank("nativeProperty", "native_annotation", runtimeSchemaRankParamDeclProperty, runtimeSchemaPrecedenceNativeAnnotation)
exclusionWinner, err := resolveRuntimeSchemaCandidate("property", exclusion, native)
if err != nil || exclusionWinner.Source != "reviewed_mapping_exclusion" || exclusionWinner.Value != "" {
t.Fatalf("mapping exclusion must outrank ParamDecl.Property: winner=%#v err=%v", exclusionWinner, err)
}
boundCandidate := runtimeSchemaStringCandidate("boundProperty", "versioned_parameter_binding")
paramDeclWinner, err := resolveRuntimeSchemaCandidate("property", boundCandidate, native)
if err != nil || paramDeclWinner.Source != "native_annotation" || paramDeclWinner.Value != "nativeProperty" {
t.Fatalf("ParamDecl.Property must outrank versioned binding: winner=%#v err=%v", paramDeclWinner, err)
}
}
func TestReviewedCompositeParameterMappingRejectsInference(t *testing.T) {
parameter := func(property, source, reviewReason string) map[string]any {
return map[string]any{
"property": property,
"field_provenance": map[string]any{
"property": map[string]any{
"source": source,
"review_reason": reviewReason,
},
},
}
}
tests := []struct {
name string
parameter map[string]any
want bool
}{
{name: "versioned binding", parameter: parameter("request.id", "versioned_parameter_binding", ""), want: true},
{name: "native annotation", parameter: parameter("request.id", "native_annotation", ""), want: true},
{name: "mapping exclusion", parameter: parameter("", "reviewed_mapping_exclusion", "reviewed CLI-only input"), want: true},
{name: "flag inference", parameter: parameter("requestId", "flag_name_inference", ""), want: false},
{name: "retired tool hint", parameter: parameter("request.id", "tool_schema_hint", "reviewed mapping"), want: false},
{name: "retired manual hint", parameter: parameter("request.id", "reviewed_manual_hint", "reviewed mapping"), want: false},
{name: "nonempty exclusion", parameter: parameter("request.id", "reviewed_mapping_exclusion", "reviewed"), want: false},
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
got, _ := reviewedCompositeParameterMapping(test.parameter)
if got != test.want {
t.Fatalf("reviewedCompositeParameterMapping() = %t, want %t", got, test.want)
}
})
}
}
func TestRuntimeCommandParameterSpecsPreserveReviewedEmptyPropertyProvenance(t *testing.T) {
cmd := &cobra.Command{Use: "query"}
cmd.Flags().Bool("all", false, "fetch every page")
parameters, err := runtimeCommandParameterSpecs(cmd, "aitable.query_records", RuntimeSchemaConstraints{})
if err != nil {
t.Fatal(err)
}
if len(parameters) != 1 {
t.Fatalf("parameter count = %d, want 1", len(parameters))
}
parameter := parameters[0]
if parameter.Property != "" {
t.Fatalf("excluded property = %q, want empty", parameter.Property)
}
provenance, exists := parameter.FieldProvenance["property"]
if !exists || provenance.Source != "reviewed_mapping_exclusion" || provenance.ReviewReason == "" {
t.Fatalf("excluded property provenance = %#v", provenance)
}
payload, err := parameter.ToPayload()
if err != nil {
t.Fatal(err)
}
if _, exists := payload["property"]; exists {
t.Fatalf("excluded property leaked into payload: %#v", payload)
}
if got := schemaString(schemaMap(payload["field_provenance"])["property"]["source"]); got != "reviewed_mapping_exclusion" {
t.Fatalf("delivered property provenance source = %q", got)
}
}
func TestSchemaParameterBindingActiveBindingsRemainEmpty(t *testing.T) {
snapshot, err := runtimeSchemaParameterBindingData()
if err != nil {
t.Fatalf("runtimeSchemaParameterBindingData() error = %v", err)
}
// Phase 2 retired every active binding (and the corrections ledger) to
// ParamDecl.Property. The Go mapping ledger may only carry exclusions /
// removals — never a non-empty versioned bindings table.
if len(snapshot.Bindings) != 0 {
t.Fatalf("active bindings = %d groups, want empty", len(snapshot.Bindings))
}
if len(snapshot.MappingExclusions) == 0 {
t.Fatal("mapping exclusions ledger is empty")
}
}
func auditSchemaParameterMappings(tools map[string]map[string]any, metadata embeddedMCPMetadata, snapshot schemaParameterBindingSnapshot) []string {
flags := finalSchemaCatalogFlagIndex(tools)
problems := make([]string, 0)
pinAvailable := len(metadata.Tools) > 0
canonicals := make([]string, 0, len(tools))
for canonical := range tools {
canonicals = append(canonicals, canonical)
}
sort.Strings(canonicals)
for _, canonical := range canonicals {
tool := tools[canonical]
mode := strings.TrimSpace(schemaString(tool["interface_mode"]))
availability := strings.TrimSpace(schemaString(tool["availability"]))
if mode == contract.InterfaceModeComposite && availability == contract.InterfaceAvailable {
problems = append(problems, auditCompositeSchemaDisposition(canonical, tool)...)
if strings.HasPrefix(strings.TrimSpace(schemaString(tool["interface_reason"])), "Reviewed unpinned remote adapter:") {
parameters := schemaMap(tool["parameters"])
for flagName, parameter := range parameters {
if ok, detail := reviewedCompositeParameterMapping(parameter); !ok {
problems = append(problems, fmt.Sprintf(
"%s unpinned remote adapter has no reviewed explicit parameter mapping: %s",
runtimeSchemaParameterMappingKey(canonical, flagName), detail,
))
}
}
}
continue
}
if mode != contract.InterfaceModeMCP || availability != contract.InterfaceAvailable {
continue
}
if !pinAvailable {
// Production: no pin. Property authority is ParamDecl / exclusions;
// do not require property ∈ MCP parameter map.
continue
}
metadataKey, pinned, resolveProblems := pinnedMCPParameterMetadata(canonical, tool, metadata)
problems = append(problems, resolveProblems...)
if len(pinned.Parameters) == 0 {
continue
}
parameters := schemaMap(tool["parameters"])
flagNames := make([]string, 0, len(parameters))
for flagName := range parameters {
flagNames = append(flagNames, flagName)
}
sort.Strings(flagNames)
for _, flagName := range flagNames {
key := runtimeSchemaParameterMappingKey(canonical, flagName)
flag := flags[key]
flag.metadataKey = metadataKey
flag.metadataParams = pinned.Parameters
flags[key] = flag
reason, excluded := snapshot.MappingExclusions[key]
if excluded && strings.TrimSpace(reason) != "" {
continue
}
root, ok := schemaParameterPropertyRoot(flag.property)
if ok {
_, ok = pinned.Parameters[root]
}
if !ok {
problems = append(problems, fmt.Sprintf(
"%s property %q does not resolve to pinned MCP metadata %s; add/fix a binding or an exact reviewed mapping_exclusions entry",
key, flag.property, metadataKey,
))
}
}
}
exclusionKeys := make([]string, 0, len(snapshot.MappingExclusions))
for key := range snapshot.MappingExclusions {
exclusionKeys = append(exclusionKeys, key)
}
sort.Strings(exclusionKeys)
for _, key := range exclusionKeys {
reason := strings.TrimSpace(snapshot.MappingExclusions[key])
flag, exists := flags[key]
if !exists {
problems = append(problems, fmt.Sprintf("mapping_exclusions %q does not reference an exact final Catalog parameter", key))
continue
}
if reason == "" {
problems = append(problems, fmt.Sprintf("mapping_exclusions %q has an empty reviewed reason", key))
}
if binding := strings.TrimSpace(snapshot.Bindings[flag.canonical][flag.flagName]); binding != "" {
problems = append(problems, fmt.Sprintf("mapping_exclusions %q conflicts with versioned binding %q", key, binding))
}
if strings.TrimSpace(flag.property) != "" {
problems = append(problems, fmt.Sprintf("mapping_exclusions %q must deliver an omitted property, got %q", key, flag.property))
}
switch flag.mode {
case contract.InterfaceModeLocal, contract.InterfaceModeComposite:
// These modes do not claim one direct MCP parameter map. The exact,
// reviewed reason and omitted final property are the whole contract.
continue
case contract.InterfaceModeMCP:
if flag.availability != contract.InterfaceAvailable {
problems = append(problems, fmt.Sprintf("mapping_exclusions %q is not attached to an available mcp tool", key))
continue
}
directProperty := schemaExcludedDirectPropertyCandidate(flag.parameter)
root, ok := schemaParameterPropertyRoot(directProperty)
if !ok {
problems = append(problems, fmt.Sprintf("mapping_exclusions %q has no lower-priority direct property candidate to review", key))
continue
}
if pinAvailable {
if len(flag.metadataParams) == 0 {
problems = append(problems, fmt.Sprintf("mapping_exclusions %q is not attached to an available pinned MCP parameter map", key))
continue
}
if _, resolves := flag.metadataParams[root]; resolves {
problems = append(problems, fmt.Sprintf("mapping_exclusions %q is stale: candidate property %q already resolves to %s", key, directProperty, flag.metadataKey))
}
}
default:
problems = append(problems, fmt.Sprintf("mapping_exclusions %q is only valid for mcp, local, or composite tools", key))
}
}
sort.Strings(problems)
return problems
}
func reviewedCompositeParameterMapping(parameter map[string]any) (bool, string) {
property := strings.TrimSpace(schemaString(parameter["property"]))
provenance := schemaMap(parameter["field_provenance"])["property"]
source := strings.TrimSpace(schemaString(provenance["source"]))
switch source {
case "versioned_parameter_binding", "typed_parameter_metadata", "native_annotation":
if property == "" {
return false, fmt.Sprintf("%s selected an empty property", source)
}
return true, ""
case "reviewed_mapping_exclusion":
if property != "" {
return false, fmt.Sprintf("reviewed_mapping_exclusion delivered property %q", property)
}
return true, ""
default:
return false, fmt.Sprintf("property provenance source is %q", source)
}
}
func auditCompositeSchemaDisposition(canonical string, tool map[string]any) []string {
problems := make([]string, 0)
if tool["interface_ref"] != nil {
problems = append(problems, fmt.Sprintf("%s composite interface must not advertise a direct interface_ref", canonical))
}
if strings.TrimSpace(schemaString(tool["interface_reason"])) == "" {
problems = append(problems, fmt.Sprintf("%s composite interface has no reviewed disposition reason", canonical))
}
provenance := schemaMap(tool["field_provenance"])
for _, field := range []string{"interface_mode", "availability", "interface_ref", "interface_reason"} {
entry := provenance[field]
// Composite dispositions must pass through ContractFinal
// (declare-or-annotate). Production metadata shells are empty and
// must not supply reviewed_explicit for these fields.
precedence := strings.TrimSpace(schemaString(entry["precedence"]))
if precedence != "contract_final" {
problems = append(problems, fmt.Sprintf("%s composite %s is not backed by contract_final provenance", canonical, field))
}
}
return problems
}
func finalSchemaCatalogFlagIndex(tools map[string]map[string]any) map[string]schemaParameterMappingFlagAudit {
flags := make(map[string]schemaParameterMappingFlagAudit)
for canonical, tool := range tools {
for flagName, parameter := range schemaMap(tool["parameters"]) {
key := runtimeSchemaParameterMappingKey(canonical, flagName)
flags[key] = schemaParameterMappingFlagAudit{
canonical: canonical,
flagName: flagName,
mode: strings.TrimSpace(schemaString(tool["interface_mode"])),
availability: strings.TrimSpace(schemaString(tool["availability"])),
property: strings.TrimSpace(schemaString(parameter["property"])),
parameter: parameter,
}
}
}
return flags
}
func pinnedMCPParameterMetadata(canonical string, tool map[string]any, metadata embeddedMCPMetadata) (string, embeddedMCPToolMetadata, []string) {
refMap, _ := tool["interface_ref"].(map[string]any)
wantRef := embeddedMCPInterfaceRef{
ProductID: strings.TrimSpace(schemaString(refMap["product_id"])),
RPCName: strings.TrimSpace(schemaString(refMap["rpc_name"])),
}
if wantRef.ProductID == "" || wantRef.RPCName == "" {
return "", embeddedMCPToolMetadata{}, []string{fmt.Sprintf("%s has no complete pinned interface_ref", canonical)}
}
if exact, ok := metadata.Tools[canonical]; ok {
problems := comparePinnedMCPRef(canonical, canonical, exact, wantRef)
return canonical, exact, problems
}
keys := make([]string, 0)
for key, candidate := range metadata.Tools {
if candidate.InterfaceRef != nil &&
strings.TrimSpace(candidate.InterfaceRef.ProductID) == wantRef.ProductID &&
strings.TrimSpace(candidate.InterfaceRef.RPCName) == wantRef.RPCName {
keys = append(keys, key)
}
}
sort.Strings(keys)
if len(keys) == 0 {
return "", embeddedMCPToolMetadata{}, []string{fmt.Sprintf("%s pinned interface_ref %s.%s has no MCP metadata", canonical, wantRef.ProductID, wantRef.RPCName)}
}
first := metadata.Tools[keys[0]]
wantParameters := sortedMCPParameterKeys(first.Parameters)
for _, key := range keys[1:] {
if got := strings.Join(sortedMCPParameterKeys(metadata.Tools[key].Parameters), "\x00"); got != strings.Join(wantParameters, "\x00") {
return "", embeddedMCPToolMetadata{}, []string{fmt.Sprintf("%s pinned interface_ref %s.%s has ambiguous parameter maps across metadata keys %s", canonical, wantRef.ProductID, wantRef.RPCName, strings.Join(keys, ", "))}
}
}
return strings.Join(keys, "|"), first, nil
}
func comparePinnedMCPRef(canonical, metadataKey string, metadata embeddedMCPToolMetadata, want embeddedMCPInterfaceRef) []string {
if metadata.InterfaceRef == nil {
return []string{fmt.Sprintf("MCP metadata %s selected by %s has no interface_ref", metadataKey, canonical)}
}
gotProduct := strings.TrimSpace(metadata.InterfaceRef.ProductID)
gotRPC := strings.TrimSpace(metadata.InterfaceRef.RPCName)
if gotProduct != want.ProductID || gotRPC != want.RPCName {
return []string{fmt.Sprintf("%s pins %s.%s but canonical MCP metadata %s pins %s.%s", canonical, want.ProductID, want.RPCName, metadataKey, gotProduct, gotRPC)}
}
return nil
}
func sortedMCPParameterKeys(parameters map[string]embeddedMCPParamMeta) []string {
keys := make([]string, 0, len(parameters))
for key := range parameters {
keys = append(keys, key)
}
sort.Strings(keys)
return keys
}
func schemaParameterPropertyRoot(property string) (string, bool) {
property = strings.TrimSpace(property)
if property == "" {
return "", false
}
end := len(property)
if index := strings.IndexAny(property, ".["); index >= 0 {
end = index
}
root := strings.TrimSpace(property[:end])
return root, root != ""
}
func schemaExcludedDirectPropertyCandidate(parameter map[string]any) string {
fieldProvenance := schemaMap(parameter["field_provenance"])["property"]
for _, raw := range schemaMapSlice(fieldProvenance["candidates"]) {
if schemaString(raw["source"]) == "reviewed_mapping_exclusion" {
continue
}
if value := strings.TrimSpace(schemaString(raw["value"])); value != "" {
return value
}
}
return ""
}
func limitedSchemaMappingProblems(problems []string, limit int) string {
if len(problems) <= limit {
return strings.Join(problems, "\n")
}
return strings.Join(problems[:limit], "\n") + fmt.Sprintf("\n... %d additional problem(s) omitted", len(problems)-limit)
}
func schemaMappingProblemsContain(problems []string, substring string) bool {
for _, problem := range problems {
if strings.Contains(problem, substring) {
return true
}
}
return false
}