有人在评论区描述了一个bug,关于一个我没写过的工具。他正在用某个MCP代码库智能服务器,问了一个符号,工具返回了文件路径、定义和引用列表,格式完整。但答案指向的是experiments/目录里的影子定义,而不是src/里的真实定义。没有报错,没有过期数据,工具找到了两个同名定义,然后返回了先碰到的那个。
我回去读了自己的代码。analyze_function是助手在写handler前应该调用的工具:它报告函数查询了哪些表、怎么查询、角色缺哪些权限、触发器的事件结构。代码长这样:
![]()
const funcNode = currentGraph.nodes.find( (n) => n.type === 'function' && n.name === functionName,);.find()。第一个匹配项胜出,静默地。这就是issue #103,而让我打开这个issue的人,描述的其实是别人的产品。
我已经处理过两种基础设施上下文出错的方式,并且都发布了修复。
第一种是"未读取"。源提取失败,工具返回空列表,而空列表看起来就像"那里什么都没有"。问SQS提取器抛权限错误后队列有没有死信队列,"未配置DLQ"这句话工具根本没资格说。这是issue #101,修复方案是给每个响应附加源状态,让失败的读取永远不会被误认为资源不存在。
第二种是"过期"。数据读取正确,然后有人跑了terraform apply。快照内部一致,但描述的账户已经不存在了。这是issue #102:每个响应现在都携带基础设施的读取时间和距今多久,让调用者能判断三天前的答案是否还适用于当前问题。
Issue #103两者都不是。提取成功了,数据是几秒前的,响应里的每个字段都是从真实源读取的真实值。但响应描述的只是另一个函数,不是你问的那个,而且响应里没有任何信号表明这一点。新鲜度元数据帮不上忙,源状态也帮不上忙——两者都正确地报告"一切正常"。
这才是我想争论的部分,因为它改变了工具对调用者应尽的义务。
过期和读取失败是可以附加元数据的条件。但错误候选解析是函数签名本身的属性。一个查找在匹配到两个结果时返回其中一个,就已经销毁了"做过选择"的证据。无论往响应上附加多少元数据,都无法重建这个证据。
函数节点ID在图里是文件作用域的,格式是function:${op.filePath}:${op.functionName}(src/graph/index.ts:452),所以getOrder在src/handler里……
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.