百分数是胜率:把此人放进一支其余三人为平均水平的队伍、对手四人也是平均水平时,本队的预测胜率。这里的平均水平指全名单平均,其值恰为 50.0%,不随启用或停用而变。因为一个人只占队伍四分之一,他相对平均水平的优势在队伍均值上被摊薄四倍,所以这一列的跨度天然比两队对阵的预测窄得多。带 * 表示该人的数值主要来自手填档位而非对局,尚不可信。
点名字选人;再点下方的人名牌可在「待定 → 胜方 → 负方」之间切换。
地图是自动识别的:平台的地图名字段对自定义地图恒为 my map,但对局设置里藏着一个稳定的地图编号,同步时按编号查表得到名字(这张对照表由 562 局已知地图名的历史对局核对得出,11 个编号零冲突)。只有遇到没见过的编号时才需要你命名一次——命名之后,所有同编号的对局会立刻自动带上这个名字,以后同步进来的也一样。
正常情况只填名字和档位,账号号那一栏留空。把他选进分组、打完一局点「本局打完,取结果」,工具会从那一局里把陌生账号认出来自动绑上——队里只差一个人的账号时唯一确定,直接绑并继续入库;差两个及以上时会让你点一次谁是谁,不会猜。
不需要区分「全新的人」和「以前打过的人」,两者填法完全一样。以前这里承诺过「填上账号号就会顺带把他的历史补回来」,那句话是错的:官方 API 对每个账号只返回最近 10 场自定义房、没有任何分页参数,而那正是日常同步取的同一个窗口——他还在打,那些局早就被队友带回来了;他不打了,那些局也早就带回来了。要真的把某人过去的对局补齐,只有「导入对局号」那一条路。
加人之后唯一会顺带发生的事:把「待复核对局」里因为缺这个人而卡住的局并进来,并告诉你并了几局。
档位只在这里填一次。此后这个人的档位只有超级管理员能改——理由是档位必须独立于对局数据,否则先验强度就从「朝独立信息收缩」变成「朝自己过去的估计收缩」,而多人各按印象反复微调正是最容易把这条纪律磨掉的方式。留空表示未定级,那是一个独立状态,不等于中等。
你多半不知道一个人的 profile_id。这里可以按游戏内昵称反查——区分大小写、不做模糊匹配,要与游戏里显示的名字逐字符相同。查到之后可以直接收进名单。
全新的人不用走这里,「加新人」只填名字即可,账号会在第一局自动认出来。要把某人过去的对局补进来,用「数据与设置」页的导入对局号——那条路才能翻到截止日,这里只能拿到平台窗口里的最近 10 场。
改的是圈子昵称,也就是这个人在本工具里的显示名。改名不动任何对局记录——对局参与记录里存的是不可变的内部编号,不是昵称字符串,所以改完实力分一分不变,也不影响任何 profile_id 与胜负日期。(v2/v3 不是这样:那时对局行存的是昵称,改一个名要改写几百条记录。)
把若干个人并成一个:小号名下的账号与对局参与记录都改挂到主号,小号从名单中移除。合并前会检查这些人是否曾在同一场对局里同时出现——同一个人不可能在一局里占两个位置,出现过就说明不是同一个人,合并直接拒绝并列出是哪几场。若你确信是同一人,那说明那几场记错了,应该先改对局而不是合并。
档位只表达次序与并列:1 档最强,档号越大越弱;未定级不是一档,而是尚未判断,在看板上置底。层与层的间隔统一由「每层间隔」给出,那个值是从对局里交叉验证选出来的,不是人工设定,所以你只需要决定谁在哪一档。档位占比是档位在这个人的估计里所占的权重,超过 90% 标为种子。实际战绩是历史胜负比,它被队友与对手的强弱混淆,而且分组器越准越向 50% 收敛,与右侧的拟合胜率对不上是正常的。最右一列是把此人放进一支其余三人为全名单平均水平的队伍、对手四人也平均时本队的预测胜率,± 后为其标准误,单位为百分点。名牌与本列上的 ↑n / ↓n 表示对局显示他强于或弱于所在档约 n 档,即升档与掉档提示,它只在下面的「档位体检」跑过、且此后没有改动过数据时才显示。
日常录入不必用这里:一局打完,在「分组」页点一下「本局打完,取结果」即可,那只问这 8 个人的账号。这张卡片是兜底与回填——服务端每天凌晨自己新建一次作业,此后每十五分钟自己续跑一段,这里的按钮是手动触发同一件事。
数据源是 aoe2companion,不再是平台原生接口。换掉的理由不是偏好,是能力:平台原生接口对每个账号只返回最近 10 场自定义房,而且 count/start/limit 之类的参数一律被静默忽略——在那条路上不存在任何写法能翻到第 11 场,所以历史回填根本做不到。aoe2companion 有分页,一个账号可能有两百多页。
它是一个会分段跑的作业,不是一次调用。免费档 Worker 每次调用最多五十个对外子请求,而数据源要求两次请求之间至少半秒、总速率不超过每秒两次。所以一次点击只跑一段(当前一段最多 15 页),进度存在服务端,点一次之后页面会自己接着调用直到跑完;关掉页面也不要紧,定时任务每十五分钟会替你续一段。
它问谁。不勾名单就是名单里每一个账号(当前 — 个,含已停用的人)。勾了就只问勾中那些人名下的全部账号——只同步一个人的其中一个号,等于只补了一半历史,而「这一半是哪一半」在界面上看不出来。
每个账号翻到哪里停。不填截止日期时,翻到这个账号在库里最新一场对局的时刻就停,比它更早的都已经收过——这是日常增量。填了截止日期就用填的那个,那时它可以让作业翻得更多,因为回填历史要的正是「往回翻到那一天」。从没出现过的账号一路翻到底(连续两页为空才算到底)。
拉回来的对局按固定次序过判据:
① 对局号已在库中、已在待复核、或已判过不合规 → 跳过
② 不是随机地图局(gameMode 不是 random_map)→ 丢弃。自定义场景局同样是八人两队自定义房,只靠「自定义房」和「八人」挡不住它
③ 有 AI 席位,或有席位的胜负为空 → 丢弃。胜负为空不能当成负,那会凭空造出一个不存在的比分
④ 不是 8 人 4v4 → 丢弃
⑤ 8 个人里在名单内不足 6 个 → 丢弃(那是别人房间的局)
⑥ 时长低于 10 分钟 → 丢弃(开局即重开)
剩下的:8 人全在名单内的直接入库;有 1 到 2 个不在名单内的进待复核。
然后重新审视待复核。凡是参与者现在都能映射回名单的条目,在作业跑完时一并并入。这一步是必要的:去重集合同时包含已入库与待复核,所以一场停在待复核里的对局在后续同步中一律被当成重复跳过——即使卡住它的那个陌生账号早就认领了,它也不会自己并进来。
失败分四类,因为四类的应对互不相同。被限流(429)不是故障而是要求降速,作业会按下暂停、过一会儿再续;网络中断与 5xx 可以重试,同一个账号连续失败三次就停整个作业;4xx 与「返回的结构不认识」重试没有用,直接停下来等人看。停下来是可见的,跳过则会在结果里留下一个静默的洞——所以这里一律选停。
它不做的事:不回填时长、文明、玩家编号(那是「补全明细」按钮);不修改任何已入库对局的胜负与日期;不会把被判据刷掉的对局找回来——但它们的对局号会写进审计日志,日后可以按号重取。
「补全明细」用对局号回填时长、文明、玩家编号与地图编号,只对已入库但缺字段的对局起作用,不新增任何对局。
给一串对局号,逐个向数据源取回内容并入库。现在只有一个用处:上面那个「重取被丢弃的对局」会把号填进下面的框里,点「导入」执行。手上另有一串对局号时也可以直接粘进来。
v4.5 之前这里还伺候三个 aoe2insights 抓取器(书签版、控制台版、用户脚本版),那一整套连同「从 aoe2insights 导入」这个入口的本意已经删掉——换成 aoe2companion 之后,对局列表本身就能一直往回翻,补历史由全量同步作业直接完成,不再需要任何第三方站点。理由见 README 4.0.9。
导进来的对局走与日常同步完全相同的规则:8 人 4v4 自定义房、名单内至少 6 人、时长不低于 10 分钟、按对局号去重。不按任何日期卡时间(—)——能取回的历史一律收下。所以不会把垃圾灌进来,也不会因为太老而白白丢掉。
粘多少个都行,页面会自己分批(每批 15 个,某一批出错就自动减半重试)。这个批量由出站子请求数决定:数据源一次只能问一个对局号,而免费档每次调用最多 50 个出站请求。中途失败也不要紧——已经入库的对局不会回滚,直接再点一次导入即可,已进去的会被记成「已在库中」。
群友通过公开页面提交的请求。批准只是记档,具体改动仍要你在界面上执行一次——把「我同意」和「我确认改动内容无误」合成一步,是错误最容易溜进去的地方。
容差是你愿意为「多获得信息」让出多少公平度。它同时是唯一能让对局说出「差距有多大」的来源:配得越死,尺度越无从校正。
按时间把对局切成前 80% 与后 20%:只用前 80% 拟合,去预测后 20%。这是判断这套估计是否仍然可用的唯一外部依据。
恢复是全系统唯一会成批删数据的操作,所以它先校验再动手:人数、对局数、参与记录三者必须自洽,任何一项不对就整个拒绝、一行都不改。动手前会自动把当前状态存一份到服务端(恢复错了还退得回来),过程中对局分批写入。它不动用户与登录状态——那是账号不是数据,而且把自己踢下线之后就没有出路了。
七天之内的误操作还有另一条更省事的路:Cloudflare D1 的 Time Travel,见 部署手册.md。
只有超级管理员与局头有账号。局头能做的事仅限于:加新人(含初次定档)、取本局结果、分组。调档、改参数、合并、删对局都只有你能做——这不是界面上藏起来,是服务端拒绝。
所有不在名单里的账号都在这一栏,没有第二个地方。无论那一局最终入库、进待复核、还是按规则被丢弃,只要是 8 人自定义房且名单内至少 2 人,里面的陌生账号都会记一笔,而且计数是累积的。
标着「刚同场」的排在最前面,那是「本局打完,取结果」时这一局里的陌生账号——你刚刚亲手把这个人排进队里,你已经知道他是谁,只差一个账号号,直接收下即可。其余是被别人的对局捎带出来的,需要看一眼再决定。
每一行两条路:「收为」那个下拉选一个人,就是把这个账号挂到名单里已有的那个人名下(他换了小号、或者你早就把他加进名单只是当时没有账号号);不选就是建一条新的名单记录,名字用下面那个框里的。
一次收太多未定级的人要当心:未定级组在模型里共享一个落点,而刚收进来的人彼此之间几乎没有对局连接,却被绑在同一个参数上——落点会被这一组最没有信息量的整体战绩拉动,所有未定级者的显示值会一起漂。所以一次最多收 15 个,收完自动跑一次校准检查,看看有没有走样。
先看上面那一栏(候选新人),再看这一栏。这里的每一条都是「差某个人」,而那个人就在上面等你收;收完这一栏自己会少。
这是一个诊断视图,不是待办队列。它只回答一句话:这一局还差谁。停在这里的只有一种情形——8 个人里有人不在名单内。不是 4v4 的、时长不够的、名单内不足 6 个的,在更早一步就丢掉了,根本到不了这里。
不需要你点「并入」。每次同步、每次加人、每次在「候选新人」里收人,系统都会自动把现在能解开的全部并进来。你要做的只有一件事:照着每一行写的「还差谁」,到候选新人那一栏把那个账号收下或指派给已有的人。
也没有「丢弃」。人不全是名单的问题,不是这场对局的错。有一类条目永远解不开(名单里 6 个人去了别人的房间,那一局里确实有路人)——它们在陌生账号已被忽略、且超过 30 天之后自动归档;管理员也可以直接点「确认这不是群局」。归档只是移出视图,一行都不删,随时能翻回来。