{"record":{"id":"7c22a9d476f38421","repo":"flipped-aurora/gin-vue-admin","slug":"v-7c22a9","errorCode":null,"errorMessage":"执行计划验证失败: %v","messagePattern":"执行计划验证失败: (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"server/mcp/gva_execute.go","lineNumber":235,"sourceCode":"\tif !ok {\n\t\treturn nil, errors.New(\"参数错误：executionPlan 必须提供\")\n\t}\n\n\t// 解析执行计划\n\tplanJSON, err := json.Marshal(executionPlanData)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"解析执行计划失败: %v\", err)\n\t}\n\n\tvar plan ExecutionPlan\n\terr = json.Unmarshal(planJSON, &plan)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"解析执行计划失败: %v\\n\\n请确保ExecutionPlan格式正确，参考工具描述中的结构体格式要求\", err)\n\t}\n\n\t// 验证执行计划的完整性\n\tif err := g.validateExecutionPlan(ctx, &plan); err != nil {\n\t\treturn nil, fmt.Errorf(\"执行计划验证失败: %v\", err)\n\t}\n\n\t// 获取原始需求（可选）\n\tvar originalRequirement string\n\tif reqData, ok := request.GetArguments()[\"requirement\"]; ok {\n\t\tif reqStr, ok := reqData.(string); ok {\n\t\t\toriginalRequirement = reqStr\n\t\t}\n\t}\n\n\t// 直接执行创建操作（无确认步骤）\n\tresult := g.executeCreation(ctx, &plan)\n\n\t// 如果执行成功且有原始需求，提供代码复检建议\n\tvar reviewMessage string\n\tif result.Success && originalRequirement != \"\" {\n\t\tlogger.WithCtx(ctx).Mod(\"mcp\").Info(\"执行完成，返回生成的文件路径供AI进行代码复检...\")\n","sourceCodeStart":217,"sourceCodeEnd":253,"githubUrl":"https://github.com/flipped-aurora/gin-vue-admin/blob/3136500ef380842b0eb6c4daa87c3f8a47fcf9e0/server/mcp/gva_execute.go#L217-L253","documentation":"gva_execute's Handle (server/mcp/gva_execute.go:235) wraps errors from validateExecutionPlan with \"执行计划验证失败: %v\". The plan parsed fine as JSON, but its semantic content violates business rules — empty required fields, mismatched packageType/template, invalid fieldType, wrong primaryKey configuration, etc. The real reason is always in the suffix.","triggerScenarios":"Any gva_execute call whose ExecutionPlan fails a validation rule: packageName empty, packageType not 'package'/'plugin', needCreatedPackage=true without packageInfo, needCreatedModules=true with missing/invalid module fields, gvaModel/primaryKey conflicts, unsupported field types.","commonSituations":"LLM-generated plans omitting required module metadata (abbreviation, humpPackageName); plans where packageType and packageInfo.template disagree; field configs using types like 'uint' or 'datetime' not in the allowed list.","solutions":["Read the suffix message — it names the exact module/field and the violated rule.","Fill every required module field: package, structName, tableName, description, abbreviation, packageName, humpPackageName, and at least one field.","Ensure packageType is 'package' or 'plugin' and matches packageInfo.template when needCreatedPackage=true.","Use only supported fieldTypes (string, int, int64, float64, bool, time.Time, enum, picture, video, file, pictures, array, richtext, json).","Set gvaModel=true without any primaryKey field, or gvaModel=false with exactly one primaryKey=true field.","Run gva_analyze first to confirm the target package exists."],"exampleFix":"// before: module missing abbreviation/humpPackageName\n\"modulesInfo\":[{\"package\":\"user\",\"structName\":\"User\",\"tableName\":\"users\",\"description\":\"用户\",\"fields\":[...]}]\n// after: supply all required metadata\n\"modulesInfo\":[{\"package\":\"user\",\"structName\":\"User\",\"tableName\":\"users\",\"description\":\"用户管理\",\"abbreviation\":\"u\",\"packageName\":\"user\",\"humpPackageName\":\"user\",\"gvaModel\":true,\"fields\":[{\"fieldName\":\"UserName\",\"fieldDesc\":\"用户名\",\"fieldType\":\"string\",\"fieldJson\":\"userName\",\"columnName\":\"user_name\"}]}]","handlingStrategy":"validation","validationCode":"const REQUIRED_MODULE = ['package','structName','tableName','description','abbreviation','packageName','humpPackageName']\nfunction validatePlan(plan) {\n  if (!plan.packageName) return 'packageName required'\n  if (!['package','plugin'].includes(plan.packageType)) return 'packageType must be package|plugin'\n  if (plan.needCreatedPackage && !plan.packageInfo) return 'packageInfo required when needCreatedPackage'\n  if (plan.needCreatedModules) {\n    if (!Array.isArray(plan.modulesInfo) || plan.modulesInfo.length === 0) return 'modulesInfo required when needCreatedModules'\n    for (const [i, m] of plan.modulesInfo.entries()) {\n      for (const f of REQUIRED_MODULE) if (!m[f]) return `module ${i + 1}: ${f} required`\n      if (!Array.isArray(m.fields) || m.fields.length === 0) return `module ${i + 1}: fields required`\n    }\n  }\n  return null\n}","typeGuard":null,"tryCatchPattern":"const problem = validatePlan(plan)\nif (problem) throw new Error('pre-validate: ' + problem)\ntry {\n  return await callTool('gva_execute', { executionPlan: plan })\n} catch (e) {\n  if (String(e.message).includes('执行计划验证失败')) console.error(e.message) // suffix names the rule\n  throw e\n}","preventionTips":["Keep a validated plan template covering all required fields.","Always run gva_analyze before executing to confirm the target package.","Use only fieldTypes from the supported list in the tool description.","Enforce gvaModel/primaryKey exclusivity in your plan builder."],"tags":["mcp","validation","autocode","schema-validation","go"],"backgroundTag":"plan-validation-failed","analyzedSha":"3136500ef380842b0eb6c4daa87c3f8a47fcf9e0","analyzedAt":"2026-08-31T13:50:02.721Z","schemaVersion":2},"datasetVersion":"2026-08-31T19:17:28.585Z"}