11,741 字
59 分钟

一个开源项目里的两套寻路:从“明知已有,另起一套”到“引流用户”

文章

MaaEnd 地图定位与寻路事件举证与论证

省流:MaaEnd 是一个游戏自动化工具。仓库里有两套地图导航——我的 MapNavigator(C++)和 isHarryh 的 MapTracker(Go)。两套不是同时立项的。我先完成了整套系统的研究且已准备好合并,对方以研究纯 CV 为由取得素材和技术细节,随后另起一套竞争实现并推动先行合并。从推动先行合并,到替换业务代码,再到形成单向的 AI 入口,是同一条链上的逐步升级。

核心问题:Go 侧的导航方案及后续操作,是正常的多方案共存,还是有目的性的持续性恶意竞争

时间线

  • 02/04 — 我发布了 C++ 定位寻路方案(#352)的第一个演示视频。
  • 02/05 — 提交 PR #352,在群内公开技术细节和性能数据。
  • 02/14 — isHarryh 在群内索取我的地图素材和技术路线。当晚基于取得的同一素材启动纯 CV 实现与批测,次日建立 #560,连夜提交测试集,并以”为什么选择我们”的对比宣传文案将其包装为不需要训练数据的替代。
  • 02/15 — 两份 PR 被放在负责人面前。isHarryh 发布题为”为什么选择我们”的对比宣传卡片。负责人两次要求”等等 cpp agent”。一小时后,#560 被合并进主线。
  • 02/16 — #352 被关闭。

以上是起始节点。此后五个多月里,以下节点上出现了同方向的重复行为:

  • 测试邀约 — C++ 侧排障用户被分钟级定向拉去试用 Go 方案。
  • 特性跟进 — 点名的功能当晚紧急补齐,与关于 ADB 顺序的明确表态直接矛盾,削弱了”不内卷”的可信度。
  • 亦步亦趋 — NavMesh 和 Web 化两次事件中,Go 侧在十天尺度内跟随 C++ 侧的实施方案。
  • 故障拉踩 — 竞品卡死时发起对比。
  • AI 被提示词引流到其中一边 — 项目级 AI Agent SKILL 文件仅配置 Go 方案,持续 52 天,影响开发者使用 AI 工具的初始检索方向。

结论先行

这不是偶然的多方案共存,而是有目的性的持续性恶意竞争。

02/14 对方已获取 C++ 方案全部技术细节,02/15 #560 在负责人两次要求等待后被先行合并。公开场合给出的”没法用”三条理由,被压测数据、代码审查和 26 条讨论记录逐一推翻。#1283、03/16–17 的即时宣传 Go 方案发生在 C++ 排障期间,03/22 Go 侧在 C++ 公开特性后当晚补齐对应功能,当事人的公开自述与 Git 提交记录直接矛盾。#3125 建立兼容层后仅 27 小时,#3155 建立反向兼容层;NavMesh #3084#3359 和 Web 化 #4172#4461 间隔分别为 13 天和 10 天。#3830 引入 TurnNode 后 #3855 直接替换业务代码中的 C++ 动作。#3208 单独加入 Go Skill,52 天后才出现对等入口,同提示词复现的首轮选择随入口配置变化方向。

在已知 C++ 方案(MapNavigator)存在且可审查的情况下,Go 侧(MapTracker)持续建立功能重叠的另一套实现。#1283 与 03/16–17 在 C++ 测试排障时即时宣传 Go 方案;03/22 在 C++ 特性公开后当晚补齐;#1487 在公开承诺 C++ 先行之后仍抢先合并 Go ADB。#3125 建正向兼容层 27 小时后即出现反向入口 #3155;NavMesh 和 Web 化均以 10–13 天延迟跟随 C++ 方案。#3830 引入 TurnNode 后 #3855 直接替换业务代码中的 C++ 动作。#3208 单独加入 Go Skill,52 天后才出现对等入口,同提示词复现的首轮选择随入口配置变化方向。

不建立在代码抄袭或恶意推断之上。项目管理端在选型评估与合并监督上的缺位,同样是导致这场长期内耗的重要因素。

一、明知已有,另起一套#352 建立后,对方获取了核心素材、技术路线、性能数据和地图参数,随后才立项 #560

二、抢先合入#560 建立当天即与 #352 并排置于负责人面前,通过对比性宣传文案推动优先合并,当晚合入主线;#352 次日关闭。

三、方案能用 — 事后说法是原方案”写了但没法用”。压测数据与后续 26 条公开讨论记录均不支持这一说法。

四、定向引流#1283 创建后 60 秒内 @正在排障 C++ 的用户,合入同一分钟再次 @通知;03/16–17 在 C++ 排障线程中直接宣传 Go 方案;04/08 用户求助 MapNavigator 的具体报错、作者已被 @ 到场,回应是“操作是换成 MapTracker”。宣传方与方案作者为同一人。

五、言行不一 — 2 月至 7 月,四个独立节点上出现同一方向的行为。关于 ADB 支持顺序的明确表态与后续 Git 合并次序直接矛盾,“保持良性竞争,不内卷”这一自我描述的可信度被削弱。

六、公开对质 — 04/19 对质中对方的三项辩解,逐一被平台时间戳推翻。在场成员确认客观上形成了竞争;对其主观动机,看法不一。

七、亦步亦趋 — 兼容层:C++ 建 #3125,仅 27 小时 Go 建反向兼容层 #3155。NavMesh:C++ 原生实现 #3084 公开 13 天后 Go 侧提交同名 PR #3359。Web 化:C++ 提方案 #4172 10 天后 Go 侧跟进 #4461。TurnNode:#3830 引入后 #3855 将业务路径切换至 MapTracker TurnNode。同方向的跟随模式在四次事件中仍然成立。

八、引流用户 — 项目级 Skill 文档仅配置 Go 侧方案,持续 52 天(05/28—07/20)。以 #3208 末位提交加入,对称性恢复后对方反向指责”抄袭”。


1. 明知已有,另起一套

要验证 #560 是否属于独立开发,先确认一件事:#560 建立前,其作者是否已经知道 #352 的存在、技术路线、核心素材和开发进度。

如果事先知情,“互不知情”这个理由就站不住。

记录

02/04 19:30 — 运行成果首次公开展示。

Lemon-miaow 在群里发送游戏内实机运行视频及带路径点标注的地图截图。群成员讨论“原来是玛丽在拉”、“这下只需要路径点了”。isHarryh 在同一对话序列中发言。

02/04 19:30 最初的演示与群内反应

02/05 15:45—16:21 — #352 建立并公开解答技术细节。

定位运行结果截图公开,包含坐标 (985.5, 1125.0)Score=0.86Time=612.9ms。15:46,Lemon-miaow 贴出 PR #352 链接。 PR #352 完整页面

在群内讨论中,Lemon-miaow 解答了关于特征过滤的提问,并公开了性能数据:“目前大概差不多平均一次 120ms”。

IMG_7162.JPG 02/05 群内公开 #352 并回答准确率与耗时

02/14 19:26 — 介入同一命题并提出否定评价。

isHarryh 引用 Lemon-miaow 前一日发送的网格图,发表意见:“这种小地图匹配不应该直接模板匹配”、“高度同质化的小地图送到图像分类模型效果应该是不行的”。

IMG_7153.JPG

02/14 19:39—19:45 — 直接索取素材并获知架构路线。

  • isHarryh 提出:“能给我发一下解包图吗?我研究一下纯 CV”。Lemon-miaow 在群内发送了 map.zip(134.07MB) 压缩包。
  • isHarryh 发言:“先立个 flag 在这,我感觉纯 CV 是可以定位的”。
  • Lemon-miaow 详细说明了自身使用的底层架构:“总之我确信上 yolo 匹配哪张模板图再去 SAD 又稳又快”、“我现在做的就是这套”,并贴出耗时日志(第一轮搜索 152ms 后进精搜,后续帧 33-46ms)。
  • isHarryh 当即回应:“哇 还有分级搜索”。

核心素材由对方打包提供,架构路线在同一对话中被完整披露。

02/14 索取解包图、map.zip 与两阶段方案同屏

02/14 20:33—20:38 — 地图缩放系数双边核对。

isHarryh 询问拼接规律;Lemon-miaow 说明系手写脚本拼接,并需缩放为 0.16x。isHarryh 回复:“对,我比较过了”、“我测的是 0.1625”。

02/14 地图拼接与缩放系数的交换

02/14 21:13 — 03:51 — 获取素材后连夜启动同类实现与批测。

  • 21:31,isHarryh 宣布“我寻思纯 CV 定位是可行的”。23:50,发布 159 张测试集的压测结果(平均 15ms,成功率 91.82%),并断言“理论上现在已经具备实现自动走路送货的条件了”。
  • 02/15 01:10,Go 方案提交测试集 PR。01:15,Lemon-miaow 再次贴出 #352 链接并声明:“我都写完了”。isHarryh 随后追问 Accuracy,并提出“举办一个 YOLO vs CV 定位识别大赛”。
  • 03:35—03:51,Go 侧上传演示视频,并在说明中进行对比宣传:“与 yolo 相比的优势,小地图定位无需搜集数据集、无需训练模型”。同时自述局限:“但是这些小地图方案很难处理高度”。
02/14 纯 CV 测试与已知区域名前提 IMG_7157.JPG 02/14 23:50 159 张测试集批测结果 02/15 01:10—01:22 测试集、#352 再次公开与YOLO vs CV 大赛 02/15 03:35—03:51 演示视频、优势比较与高度局限 02/15 凌晨 遮挡与用户建造干扰的讨论

推论

四条事实:

  1. 知道 PR 存在:#352 于 02/05 公开,02/15 被当事人直接引用并追问。
  2. 知道技术路线:YOLO 前置、SAD 精搜、分级搜索的架构在 02/14 被完整交代。
  3. 拿到核心素材:map.zip 由对方直接提供,缩放参数经过核对。
  4. 知道开发进度:“我都写完了”与对方追问同屏,#352 标记为 Ready。

反方的解释检验

反方的解释对应的记录
“不知道有这个 PR”02/05 在群内公开,02/15 01:15 被当事人直接引用。
“不知道对方进度”“我都写完了”与对方追问同屏,#352 处于 Ready 状态。
“碰巧同期做了相同的事”核心素材由对方提供,缩放系数经双边对齐,架构路线在同一对话中被完整披露。

小结

“互不知情独立开发”被客观记录否决。 后续所有争议均发生在 Go 侧已充分掌握 C++ 侧方案信息的前提下。

注:知情本身不构成违规。本章只确认信息对称前提,行为性质在下一章展开。


2. 抢先合入

确认事先知情后,核查合并流程:#560 是作为常规技术验证接受评估,还是在负责人明确要求等待的情况下,通过竞争性包装和群内推动促成 #560 先行合并,并由此导致 #352 被关闭。

记录

02/15 17:54—19:12 — 并排对比与宣传。

项目负责人在群里贴出两个 PR(#560#352)询问区别。 PR #560 完整页面 isHarryh 在群里发布宣传卡片并 @项目负责人,标题为“为什么选择我们🔥——对比 Yolo 方案的七大优点💡”。

项目负责人当场提出质疑:“不对啊,另一个 PR 也不是 yolo 啊?”Lemon-miaow 澄清:“yolo 仅返回 zoneid,本质还是 cv”。宣传卡片将对方描述过度简化。

在此屏截图中,项目负责人已在 GitHub #560 页面留下明确评论:“等等 cpp agent 啊”。

02/15 #560 与 #352 同屏、为什么选择我们七大优点、群主追问、等等 cpp agent 啊

19:27—19:29 — 管理者重申等待评估。

项目负责人明确说明准备搞两个 agent:“就是我准备搞两个 agent,现在不是只有一个 go 吗,我准备再搞一个 cpp 的”、“等我晚点看看()”。isHarryh 发布修改后的卡片(六大优点),并向负责人承认:“不行,我这个 CV 有魔改”、“不是标准实现”。

IMG_7180.JPG

20:09—20:34 — 催促合并。

在负责人两次要求“等一等”后,isHarryh 在群内发送 #560 链接,连发“准备完毕”、“测试无误”,并在 20:30 发言:“合完立即开干送货”。群内随后出现“合!”、“加速!”等催合言论。面对有人询问“那檬喵的怎么办”,isHarryh 回复:“也可以合,爱用哪个用哪个”。

代码于 20:34:21 被合并(操作人:dongwlin)。此时距离负责人要求“等等 cpp agent”仅过去约一小时。

02/15 20:09—20:31 #560 Ready、测试无误与合完立即开干送货加速!

20:40—20:51 — 先行合并的既成事实。

20:40,项目负责人回到群里表示:“草,怎么都已经和过了”。因先行合并已经造成主线上的既成事实,20:51,负责人告知 C++ 作者:“你的 PR 只能关了啊,这是是我的锅,cpp agent 拖了好几天,没想到还能再出一个 PR”。

20:54,isHarryh 承认:“我没有做分层地图”,21:01 确认:“Yolo 仍是目前唯一能分层的方案,不能丢”。

02/15 20:40—20:51 怎么都已经和过了与你的PR只能关了啊 02/15 21:01 Yolo仍是目前唯一能分层的方案不能丢 02/15 21:04—21:14 11天试验、tier 问题、线性开销

02/16 02:03 — PR #352 关闭。

页面定格为 Closed with unmerged commits。

86B96B78CF695AB69562FC92CD21A1EC.png

推论

已获取细节 → 竞争性对比宣传 → 负责人要求等待 → 群内催合 → 第三方在等待评估尚未完成时执行合并 → 负责人事后发现 → #352 被关闭。

抢先合入的代码当晚即被确认缺少分层地图(Tier)功能

反方的解释检验

当事人可能解释平台记录客观反证
“只是做验证,没想替代”发布题为“为什么选择我们🔥”的推广卡片并 @负责人。
“两份方案可以共存”结果是 #352 闭案退场,因为负责人明确告知“你的 PR 只能关了啊”。
“方案功能更全面”合并当晚本人承认缺少分层功能,确认“Yolo 仍是目前唯一能分层的方案”。
“合并按钮不是我按的”合并由第三方操作属实,但推广卡片与“测试无误、合完立即干”等催合论调均出自本人。

小结

抢先合入事实确立。 一份 Ready 状态的方案,在负责人两次要求等待后,被一份已知存在功能缺口的方案抢先合并,导致前者退出主线。


3. 方案能用

事后流传的说法是“原方案写了但没法用,也没有文档”。用压测数据和代码审查结果核验这个说法。

记录

02/28 20:22 — 重新加入群聊。

Lemon-miaow 重新加入开发群。

02/28 重新加入群聊

02/28 — C++ 路线性能日志。

按各自公开日志样本,C++ 单帧耗时约在 10-15ms 区间;同期 Go 侧公开报告耗时约为 27-30ms。注意两套截图字段口径不完全相同,比较仅限这些公开样本与各自 PR 报告,不外推为所有场景下的绝对性能结论。

C++ 公开压测图中跟踪平均耗时 11.5ms(P99 25.0ms),Go 侧公开压测图中推理平均耗时 30.2ms(P99 40.0ms)。

cpp-benchmark2 cpp-benchmark1

02/28 21:32 — PR #867 提交与原始数据公开。

Lemon-miaow 提交 PR #867,公开了 600MB 测试视频及原始 CSV 压测文件。负责人指派 isHarryh 审查,isHarryh 发言:“我无权 review 该 PR”。 PR #867 完整页面

02/28 21:32—21:44 #867 通知、assigned isHarryh 与拱火.jpg 02/28 21:47—21:49 测试视频与两份原始 CSV 02/28 22:04 我无权 review 该 PR 02/28 23:00—23:01 现在只做了定位

03/01 — Harry 回应 CV 组长称呼:表示已卸任。

isHarryh 在群内表示“现在不是 CV 组长了”“已卸任”。

03/01 现在不是 CV 组长了

03/02 — #912 分离 minicv。

#912 把 MapTracker 的 CV 逻辑抽为 minicv 独立包。 PR #912 完整页面

03/02 #912 以分离 minicv 为由引流

03/03凌晨 — Go 侧实机问题。

主线 Go 方案在测试中出现需要前台运行、原地跳跃、过桥失败等问题,isHarryh 要求用户手调 arrival_threshold 参数。

03/03 凌晨 Go 寻路测试:前台、转弯、过桥与 arrival_threshold 03/03 凌晨 过桥与 arrival_threshold 03/03 02:33—02:43 点插值、划线与navmesh 整出来就不用了

03/04 — 自动行走成果。 Lemon-miaow 展示自动行走录像,负责人调侃”给 cv 组长一点压力”,isHarryh 回应称 Go move 延迟主要在截图。

03/04 17:07—17:20 自动走演示、CV组长危险了与 go move 截图延迟

#867 审查与合并节点: 02/28 21:31:37 建立 → 03/02 17:36 MistEO 最终复核 → 03/02 19:47 合并(+2460 行)。

03/10 — C++ 寻路状态机合入主线。

PR #1170 将 C++ 寻路状态机正式合并(6 commits / 55 files / +7806 −43)。状态机包含 7 个闭环状态:Bootstrap(启动定位)→ AlignHeading(对齐朝向)→ AdvanceOnRoute(沿路点推进)→ WaitZoneTransition(等待区域切换)→ WaitRelocation(等待重定位)→ RecoverRejoin(恢复并重回路线)→ ExactTargetRefine(终点逼近)→ Finished / Failed。此时距 #352 关闭不到一个月,C++ 侧已具备从定位到寻路到状态控制的完整链路。 PR #1170 完整页面

推论

后续 Benchmark、审查和主线合并证明 C++ 核心技术路线具备实际可用性;“技术路线本身没法用”不成立。它不能反向证明 #352 在 02/15 已不存在任何工程接入问题。C++ 方案后续通过压测数据、公开原始 CSV、经完整公开审查并留下 26 条讨论记录后合入主线。

反方的解释检验

反方的解释对应的记录
“写了但没法用”#867 公开全量 Benchmark 与原始 CSV,通过审查并合入 main 主线。
“没有文档”#867#1170 均包含完整性能报告与状态机指引,通过审查。
“Go 方案当时很稳定”03/03 测试暴露强依赖前台、过桥失败卡死等问题。

小结

技术路线本身没法用”的说法不成立。 后续 Benchmark、审查和主线合并证明了 C++ 核心技术路线具备实际可用性。这不能反向证明 #352 在 02/15 已不存在任何工程接入问题。


4. 定向引流

核查 C++ 方案测试排障期间,是否存在针对特定测试人员的即时定向宣传。

记录

03/14—15 — 分钟级邀测。

  • 03/14 18:42,Lemon-miaow 发送 C++ 运行视频,并 @风归云冬 协助排障。
  • 03/15 01:56:15,isHarryh 创建针对进近体验的 PR #1283
  • 03/15 01:57(创建不到 60 秒),isHarryh 在群里 @风归云冬 发送 PR 链接,提示其删除参数测试。
  • 03/15 11:07:19,PR #1283 完成合并。
  • 03/15 11:07(合并同一分钟内),isHarryh 再次 @风归云冬 宣布:“PR 严肃合并,欢迎试用优化版 go”。 PR #1283 完整页面

03/16 — 排障线程内即时宣传 Go 方案。 风归云冬反馈 C++ 方案洞穴识别卡顿,Lemon-miaow 正与其分析日志。isHarryh 在同一线程介入问:“@风归云冬 go 新版试了吗”,并在 00:00 直接贴出现成 Go 配置文件。

03/16 23:31—23:53 C++ MapNavigateAction 的测试与排障 03/16 23:55—03/17 00:00 go 新版试了吗、#1354 与 MapTrackerMove 配置 PR #1354 完整页面

03/22 — 特性点明后当晚紧急跟进。 10:45,Lemon-miaow 点明 C++ 方案具备无坐标 HEAD 终点朝向控制。当天 22:51,isHarryh 宣布也增加了该功能。Git 记录显示其 PR #1529 首次 commit 时间为当晚 23:18:55。 PR #1529 完整页面

03/22 10:45 C++ 已有的无坐标 HEAD 动作被点明 03/22 22:51 Go 侧也增加了该功能

03/26 — 框架接入后的质问。 用户将 C++ 方案接入 maafw 框架后,isHarryh 发言质问:“客户调研:为什么没有用 go”。

03/26 22:14 客户调研:为什么没有用 go 03/25 00:32 ADB 相关进展

04/08 — 用户求助 MapNavigator,被直接告知“操作是换成 MapTracker”。

04/08 开发群完整聊天记录:用户求助 MapNavigator 录制卡住,管理员 @ 作者出列,isHarryh 回复操作是换成 MapTracker

07/19 — 质疑 C++ 路径的线程内即时展示 Go 工具。

uy/sun 贴出 MapNavigator(C++)的一段绕行路径,问“为什么不直接直走跳下去”;Lemon-miaow 回复“safe”并附路径对比图,群内跟进“起伏更小吧”。uy/sun 随后追问“能够判断这种断崖吗?”。超越一梦想提出“添加单向路径()”,并预期“我猜很复杂”。星光(isHarryh)随即接话“easy”“人工画一条就行”,并连发两张 MapTracker 路网编辑器的案例截图——均为在地图上手动摆点连线、以红框标注单向箭头。

讨论对象是 C++ 方案的能力边界,回应内容是 Go 侧工具的现成界面,与 03/16 排障线程中的介入模式一致。

07/19 uy/sun 质疑 C++ 绕行路径与 Lemon_miaow 回应 07/19 单向路径讨论与 isHarryh 人工画路径应答 07/19 isHarryh 展示 MapTracker 路网编辑器人工连线案例

07/29 — 时隔四个多月,isHarryh 仍出现在同一目标用户的提问下。

风归云冬在开发群提问 maaend_entities.json 中是否包含采集物坐标;Lemon-miaow(MapNavigator)随即回应可以编写脚本提供该数据,风归云冬表示”来一个”。同一问题下,isHarryh 也引用该提问作出回复,先答“应该有的”,随后再次引用同一提问,指引运行 map_tracker_master.py 后访问 http://127.0.0.1:8060/web/navmesh-editor 查看,并附工具截图演示。03 月的记录已显示该用户是持续引流对象;四个多月后,同一用户提出技术问题时,isHarryh 依然在场并作出回应。

07/29 开发群完整聊天记录:风归云冬提问采集物坐标,Lemon_miaow 回应,isHarryh 指引访问 navmesh-editor

08/05 — 用户抱怨 MapNavigator,isHarryh 引用后回复“冷知识跑不通可以换一个工具”,并自注“(明示)”。

08/05 开发群完整聊天记录:ModiAWA 称已被 maplocator 气晕,isHarryh 两次引用该消息回复可以放转转回收、冷知识跑不通可以换一个工具,随后补充(明示)

推论

对象、时间、内容三点交叉,无法以巧合解释。

  • 对象 — 指定正在帮 C++ 侧排障的单一用户,不是群发。
  • 时间 — 创建后 60 秒内通知,合并同一分钟内再次通知。
  • 内容 — 推送内容精准针对对方测试时暴露的参数痛点。

04/08 的记录连交叉推断都省了。 提问明确指向 MapNavigator,作者已被 @ 到场,回应是“操作是换成 MapTracker”——字面即为换用竞品,且不含任何排障内容。

反方的解释检验

反方的解释对应的记录
“只是正常通知新版本”通知不是群发。指定了正在协助竞品排障的单一用户,且卡在创建和合并读秒阶段。
“改进就该给用户试用”推送本身没问题。但掐秒推送给“正在测试对手方案的唯一人员”,针对性明显。
“只是提供另一个选择”04/08 的提问是 MapNavigator 的具体报错,管理员已 @ 作者到场处理。回应不含任何针对该报错的排查,内容是换用竞品;真正的解法五分钟后由 MapNavigator 作者给出。同日 11:45 再次出现“建议更换接口”。
“只是开玩笑”是不是玩笑不改变记录本身:同一天、同一类线程内出现两次,方向一致。群内以“惨案了”“maa怎么这么坏”作回应,也说明它当时并未被当作普通的技术建议。

小结

定向导流事实成立。 精度达分钟级别,目标为正在协助竞品排障的单一用户。04/08 的记录最为直白:用户求助 MapNavigator 的具体报错、作者已被 @ 到场,得到的回应是“操作是换成 MapTracker”,同日再补一句“建议更换接口”。07/19 与 07/29 的记录显示,五个月后该模式仍在延续:C++ 方案被质疑、被求助或被提及的线程中,Go 侧工具随即被展示。


5. 言行不一

核查在不同场景下,同类行为是否重复出现,并比对公开言论与 Git 提交记录。

记录

03/18 — 公开自述与代码合并矛盾。

isHarryh 公开答复:“什么时候 cpp 支持了我再支持……保持良性竞争,不内卷”。 平台记录显示:Go 侧 ADB 支持 PR #1487 于 03/21 合并;C++ 侧 PR #1999 于 04/07 合并。Go 侧实际领先合并 17 天。 PR #1487 完整页面 PR #1999 完整页面

IMG_1115.JPG

推论

公开自述与代码行为矛盾。 关于 ADB 支持顺序的明确表态与后续 Git 合并次序直接矛盾,“保持良性竞争,不内卷”这一自我描述的可信度被削弱。上述宣传与补齐行为进一步佐证了同类模式的持续性。

反方的解释检验

反方的解释对应的记录
“ADB 的话只是随口说说”公开答复承诺清晰,3 天后其提交的 Go ADB 支持先行合并。
“朝向控制本来就在做”PR #1529 commit 显示核心代码首次写入于对方点明功能当晚 23:18:55。

小结

偶发解释被排除。 行为模式在四个独立节点重演,公开表态与代码提交记录直接冲突。


6. 公开对质

正面检验当事人在 04/19 对质中亲口抛出的辩解理由及现场群员评价。

记录

起因与辩解。

针对“为什么一个项目做两套”的质问,isHarryh 回复:“正在严肃垄断”,并给出三条理由:“进展太慢”、“功能没有涵盖所有需求”、“不认同设计理念”,补充称“写是写完了但没法用”。

04/19 17:34—17:40 从点位生成转向一个项目两套实现 04/19 17:40—17:44 两个施工队你俩搁这竞标呢 04/19 17:44—17:51 追溯 #352、谁先搓的第二套方案 04/19 17:51—18:01 三项理由与双方相反叙述 04/19 18:01—18:09 写是写完了,但是没法用与 18:06 道歉 04/19 18:14—18:21 纯 CV 验证动机、Tier 争点与 #560 文案复述

当事人承认。

  • 18:06 isHarryh:“那我素质可能有点差了,抱歉没有考虑你的感受。”
  • 18:26 isHarryh:“现在看来,我承认结果从主观上看确实对你不尊重。”
04/19 18:09—18:14 用我的定位做你的寻路与 #352 页面 04/19 18:21—18:26 争斗都是你的臆想与我承认结果从主观上看确实对你不尊重

第三方定性。

  • 暗檬:“甲乙两个施工队同时开工。”
  • issue小王:“你俩搁这竞标呢。”
  • uy/sun:“确实客观上竞争了。”
  • EeeMao:“没必要把人想得那么阴暗。”(本文接受此保留意见,不推定主观恶意)
04/19 18:26—18:31 确实客观上竞争了赛马与在场反应

反方的解释检验

反方的解释对应的记录
“不知道 C++ 方案在开发”02/14 本人向 C++ 作者索取素材、技术路线、性能数据和地图参数,当天同步的技术细节覆盖了整套方案的核心架构。群聊时间线(第一章)证明其完全知情。
“进展太慢”实际为代理部署排期问题,项目负责人已明确承认责任在自身。
“功能没有涵盖所有需求”合并当晚本人亲口承认自身缺少分层(Tier)功能,确认 C++ 是唯一可分层方案。
“不认同设计理念”可解释另起一套的偏好,但无法解释绕过等待评估抢先合并的流程问题。
“写是写完了但没法用”#352 在 #560 创建前已经转为 Ready,定位核心功能已完成,公开记录显示剩余条件主要是 cpp-algo 接入。现有公开记录也未显示项目存在必须在 02/15 当晚完成选型或立即合并寻路实现的明确期限。见第三章压测数据、原始 CSV、26 条讨论记录及合入主线记录。

小结

公开理由均无法在已披露的记录中无矛盾地成立。 当事人已承认结果上不尊重。在场成员确认客观上形成了竞争;对其主观动机,看法不一。


7. 亦步亦趋

核查 04/19 冲突后,Go 侧是否在 NavMesh、兼容层和工具 Web 化上重复了同方向的跟随模式。

记录

05/21 — C++ 原生 NavMesh 发布。

Lemon-miaow 提交 PR #3084,发布预烘焙多边形三角网格的全图及视频。 PR #3084 完整页面

05/21 #3084 C++ 原生 NavMesh 发布 1 05/21 #3084 C++ 原生 NavMesh 发布 2

05/23—05/25 — 兼容层争夺。

05/23,Lemon-miaow 提交 PR #3125,创建 MapTrackerMove→MapNavigatorCompatible 正向兼容层,使既有 MapTracker 路线无需调整坐标即可切换到 C++ 方案。 PR #3125 完整页面

约 27 小时后,isHarryh 提交 PR #3155(+1157 −27),反向建立 MapNavigateAction→MapTrackerMoveCompatible 入口,PR 正文明确引用 #3125#3125 提供从 MapTracker 到 MapNavigator 的兼容路径,27 小时后 #3155 以反向兼容层回应,方向相反。 PR #3155 完整页面

06/03 — 名字叫 NavMesh,内容完全不是。

C++ 发布 NavMesh 前,公开仓库记录中未见 Go 侧提交路网或 NavMesh 相关实现。C++ 发布 NavMesh 仅 13 天后,isHarryh 提交 PR #3359,命名为 MapTrackerNavMesh——与 C++ 侧的 MapNavigatorNavMesh 仅差一个单词。PR 正文自述为“一种基于文本的路网数据文件”,代码结构由离散点与连线构成(固定路网 Waypoint Graph),无多边形面。NavMesh 的技术定义是以多边形(通常为三角形)网格表示可行走区域,而这份 PR 的数据结构是点线图,不具备网格面的特征。名称与其自身文档描述矛盾。 PR #3359 完整页面

能走到目的地,不代表它就是 NavMesh。 寻路的数据有两种常见做法,各有各的名字。一种是 NavMesh(导航网格):用一片片多边形把能走的地面铺满,哪里能走、哪里是边界,看这片面就知道,没铺到的地方就是走不了的地方。另一种是 Waypoint Graph(路点图):在地图上人工点几个点、连几条线,能走的只有这些线,线以外没有任何信息。

两种都能寻路,都能“说哪走哪”,走不走得到跟叫什么名字没关系。问题只有一个:MapTrackerNavMesh 存的是点和线,是第二种,名字却用了第一种的。

准确地说:NavMesh 与 Waypoint Graph 是路径规划中两类并列且各有定义的数据结构——前者的可行走性是多边形面本身的属性,面的边界即障碍边界;后者的可行走性只存在于人工摆放的点与边上。MapTrackerNavMesh 按定义属于后者,却使用了前者的名称。这不是功能强弱之争,是类别错配。

第四节 07/19 的对话正好印证了这点。被问到“能够判断这种断崖吗”,isHarryh 的回答是“人工画一条就行”,并贴出手动摆点连线、红框标注单向箭头的编辑器截图。断崖在哪、哪条路只能单向走,全都得靠人一条条画上去——真正的 NavMesh 里这些是面自己带的信息,不用人画。约束靠人工逐条标注而非从几何面推导,正是路点图的定义特征。此时距 06/03 命名矛盾被指出已过一个半月。

06/04 — 公开宣传。

isHarryh 在群内发布滑索寻路演示视频,配文“此视频您将看到我们最新成果的前瞻效果演示”,获群成员回应“强强!!!!”。宣传涵盖自动识别滑索、自动上滑索、容忍选错 / 阻挡、NavMesh 等要素。此时距离 PR #3359 提交仅过一天。 06/04 #3359 公开宣传 0 06/04 #3359 公开宣传 1 06/04 #3359 公开宣传 2 06/04 #3359 公开宣传 3

06/05—06/11 — 宣传与故障对比。

然而同期公开测试与开发者反馈中仍出现过桥、阻挡和运行稳定性等问题。在此前提下:

  • 06/05,针对 C++ A* 路线提问,isHarryh 回复“用 MapTrackerGoal 就行了,包对”。
  • 06/11,在用户反馈 C++ 编辑器卡死后,isHarryh 引用该报告发言:“看看我们的 nav mesh editor 会卡死吗”。
  • C++ 作者指出其“连个面都没有”,被 Go 侧定性为“开始攻击了”。
06/05 送货任务讨论及拉踩 1 06/05 送货任务讨论及拉踩 2 06/11 送货任务讨论及拉踩 3 06/11 送货任务讨论及拉踩 4 06/11 送货任务讨论及拉踩 5 06/11 送货任务讨论及拉踩 6 06/11 送货任务讨论及拉踩 7

07/13 — #4172 工具 Web 化。

Lemon-miaow 提交 PR #4172,将 MapNavigator 工具从 tk OpenCV GUI 迁移到 Web UI(Vue + Element Plus + FastAPI),形成统一的暗色地图编辑器。

PR #4172 完整页面

07/23 — #4461 跟进 Web 化。

#4172 合并十天后,isHarryh 提交 PR #4461,同样将 MapTracker 工具从 Python OpenCV GUI 迁移到 Web UI,描述为”MapTracker Master Tools 聚合式 Web 工具现已可用”。

PR #4461 完整页面

07/29 — 命名争议持续至今,未见更正。

命名矛盾指出后近两个月,文档未作调整。截至 2026-07-29 11:00(对应固定版本 MaaEnd/MaaEnd@0c7221a),.agents/skills/go-map-tracker-guide/SKILL.md 仍称 map_tracker_master.py 提供”NavMesh 编辑”功能;docs/zh_cn/developers/components/map-tracker.md 仍称 MapTrackerGoal 节点”基于 NavMesh 自动规划路径”,entity_id 参数说明仍写作”NavMesh 顶点关联的实体 ID”。底层数据结构未变,命名也未变。 07/29 11:00 SKILL.md 仍将 MapTracker 功能称为 NavMesh 编辑 07/29 11:00 map-tracker.md 仍称 MapTrackerGoal 基于 NavMesh 规划路径

07/30 — 隔了十一天,还是那句“自己画”。

19:11,用户明欣提问 MapTrackerGoal 可不可以指定目标的碰撞箱,并说明遇到的现象:“指定侧面的点位会在从另一侧寻路的时候卡住”。群成员 ocsin 的判断是“这应该是 navmesh 打点打少了”。isHarryh 随后回复“要什么路线自己画(”,并连发两张 MapTracker 编辑器截图;针对其中的路网放大图,他解释“你选择这个点(箭头所指)作为终点的话”“一般都会途径紫色线条,不会穿越中心的”。19:39,明欣自行确认了原因:“原来是填到演算台中间了”。

07/30 开发群完整聊天记录:明欣提问 MapTrackerGoal 碰撞箱与寻路卡住,ocsin 称 navmesh 打点打少了,isHarryh 回复要什么路线自己画并贴出编辑器路网截图

这段对话有三处值得看。

一是距 07/19 的“人工画一条就行”只过了十一天,同一个人对同一类问题的回答仍然是“自己画”。路线由人手工绘制,不是从地形几何算出来的——两次表述完全一致。

二是“打点打少了”这个说法本身。真正的 NavMesh 里不存在“点打少了”,面铺到哪里就能走到哪里,走不到只可能是面没铺;会因为“点少”而走不通的,只有路点图。群成员在排障时脱口而出的是路点图的那一套概念,用的却是 NavMesh 这个名字。名字张冠李戴的后果,不只停留在 PR 标题上,已经进入了使用者理解问题的方式。

三是 isHarryh 自己给出的解释:终点选在某个点上,路径“一般都会途径紫色线条,不会穿越中心的”。这句话就是路点图的定义——能走的只有人工连出来的那些线,线与线之间的区域没有任何可通行信息。NavMesh 的多边形面内部任意位置都可穿行,根本不会有“不会穿越中心”这一说。明欣把终点填在演算台中间就卡住,也正是因为那块地方没有人画过点。

距 06/03 命名矛盾被公开指出,已近两个月。

#3830 → #3855 — TurnNode 引入并替换主体业务。

isHarryh 在 PR #3830 中为 MapTracker 新增转向节点(TurnNode)。在此基础上,PR #3855 将该业务路径从 MapNavigateAction 切换至 MapTracker TurnNode,形成对既有 C++ 动作的实际替换。

PR #3830 完整页面 PR #3855 完整页面 PR #3855 diff 对比

反方的解释检验

反方的解释对应的记录
#3155 只是正常兼容层两个兼容层方向完全相反。#3125 把 Go 路线迁向 C++;仅 27 小时后 #3155 建立反向兼容层(+1157 行),且 PR 正文明确引用 #3125。这不像独立规划的功能需求,更像对竞争方动作的即时回应。
“NavMesh 是独立开发的”同名 PR MapTrackerNavMesh,提交于 C++ 原生 NavMesh 公开仅 13 天后。代码底层仅为离散点连线,无三角面,不构成 NavMesh 的技术定义。时间线、命名和自身文档描述的”文本路网数据文件”三处矛盾。
“能用就行,名字不重要”这里争的不是好不好用。NavMesh 和路点图是两种不同的东西,都能寻路;MapTrackerNavMesh 存的是点和线,是路点图,名字却用了 NavMesh。07/19 被问到能不能判断断崖,本人的回答是”人工画一条就行”;07/30 被问到寻路卡住,回答仍是”要什么路线自己画”,并解释路径”不会穿越中心”——能走的只有人工连出来的线,这正是路点图的定义。同一场对话里,群成员的排障用语是”navmesh 打点打少了”,混用已经从代码蔓延到了使用者。截至 07/30,文档、工具路由和日常使用里的这个名字都没改。
“Web 化是正常技术演进”单独看,Web 化可以属于正常技术演进;但在同一仓库、同位竞争模块和既有持续跟进模式中,十天内出现相同迁移方向,构成方向一致的补充证据。该节点不单独作为独立证据。
“只是行业都在做 Web 工具”同一仓库、同位竞争模块、同一迁移方向在十天内出现,难以仅用行业趋势解释。
“TurnNode 替换是正常重构”#3830 引入 MapTracker 专属转向节点,#3855 将环境监测业务的原有动作路径切换至 MapTracker TurnNode。该切换将业务依赖单向指向竞争模块,两个 PR 均未通知 C++ 侧或提出迁移方案。

小结

亦步亦趋的模式再次出现。 兼容层、NavMesh 与 Web 化三个节点,均表现为 C++ 侧先行、Go 侧随后作出同方向回应;TurnNode 则进一步表现为从自己模块蔓延到了公共业务,并对既有 C++ 动作形成实际替换。

其中 NavMesh 这一项和其他几项不太一样:它不只是时间上跟得紧,而是在 C++ 的 NavMesh 公开 13 天后,把一份点线路网也叫成了 NavMesh。这跟谁做得好不好没关系——两种东西都能寻路;问题是名字张冠李戴。被公开指出后,这个名字到 07/30 仍挂在文档、工具路由和日常使用里,没改;同一天群内答疑时,本人对“怎么让它走某条路”的回答依然是“自己画”,群成员排障时说的则是“navmesh 打点打少了”。


8. 引流用户

核查仅配置 Go 侧 Skill 对开发者及 AI 工具初始选择的影响。

记录

末位提交与审查缺口。

05/28 03:01,UI 重构 PR #3208 在通过机器人审查后,追加最后一个 commit docs: 加个妙妙SKILL,写入 Go 侧配置 go-map-tracker-guidePR #3208 完整页面

05/28 Skill 借 #3208 进入仓库

52 天仅 Go 侧有 Skill。

该文档包含强指令:“当你判断确实正在进行 MapTracker 的开发工作时,务必无条件地先读取……”。在此后 52 天内(05/28—07/20),项目中仅有 Go 侧 Skill 写入项目配置,AI 编码工具在此基础上优先检索 Go 方案。

实测对照显示:仅有 Go 侧 Skill 时,AI 首轮直接抓取 Go 文档并做优先推荐(在扫库 4 分钟后自行纠正)。

Skill 对比实测 0 Skill 对比实测 1 Skill 对比实测 2

平权后的指责。

07/20 C++ 侧补齐 map-navigator-guide 后,isHarryh 于次日截图指责:“连 skill 都抄是有点好笑的”。

07/21 MapNavigator 补齐 Skill 后被鉴抄 1 07/21 MapNavigator 补齐 Skill 后被鉴抄 2

反方的解释检验

反方的解释对应的记录
“只是随手加了个文档”Skill 以 UI 重构 PR 的末位提交加入;两次自动审查均发生在该提交之前,之后未见新的正式审查记录。
“没有规定两边都要有 Skill”没有。但结果就是单侧 Skill 持续 52 天,AI 实测首轮直接抓取 Go 文档优先推荐。Skill 以 UI 重构 PR 的末位提交加入,未见独立审查。
“Skill 只是辅助,不影响行为”实测 AI 在单侧配置下首轮抓取 Go 文档并做优先推荐。本次对照样本中的首轮影响真实存在。

小结

#3208 以末位提交单独加入 Go Skill,52 天后才出现对等入口,干预了初始检索方向。对称性恢复后,当事人随即反向指责对方”抄袭”。


结论

这不是偶然的多方案共存,而是有目的性的持续性恶意竞争。

02/14 对方已获取 C++ 方案全部技术细节,02/15 #560 在负责人两次要求等待后被先行合并。公开场合给出的”没法用”三条理由,被压测数据、代码审查和 26 条讨论记录逐一推翻。#1283、03/16–17 的即时宣传 Go 方案发生在 C++ 排障期间,03/22 Go 侧在 C++ 公开特性后当晚补齐对应功能,当事人的公开自述与 Git 提交记录直接矛盾。#3125 建立兼容层后仅 27 小时,#3155 建立反向兼容层;NavMesh #3084#3359 和 Web 化 #4172#4461 间隔分别为 13 天和 10 天。#3830 引入 TurnNode 后 #3855 直接替换业务代码中的 C++ 动作。#3208 单独加入 Go Skill,52 天后才出现对等入口,同提示词复现的首轮选择随入口配置变化方向。

在已知 C++ 方案(MapNavigator)存在且可审查的情况下,Go 侧(MapTracker)持续建立功能重叠的另一套实现。#1283、03/16–17、03/22 在 C++ 测试或公开特性后宣传 Go 或补齐对应功能。#3084#3359#4172#4461 以 10–13 天延迟跟随。#3830#3855 替换业务代码中的 C++ 动作。#3208 单独加入 Go Skill,52 天后才出现对等入口,同提示词复现的首轮选择随入口配置变化方向。

不建立在代码抄袭或恶意推断之上。项目管理端在选型评估与合并监督上的缺位,同样是导致这场长期内耗的重要因素。

一个开源项目里的两套寻路:从“明知已有,另起一套”到“引流用户”

https://tail.lemonmiaow.xyz/posts/maaend-pathfinding-dispute/
作者 Lemon_miaow
发布于 2026-07-27
许可协议 CC BY-NC-ND 4.0