Skip to content

ci(deps): 删除 Dependabot peer-conflicts 报告 workflow + dependabot-behavior.md 改写为现状 - #747

Open
0xPabloLI wants to merge 27 commits into
devfrom
chore/drop-peer-conflicts-workflow
Open

0xPabloLI wants to merge 27 commits into
devfrom
chore/drop-peer-conflicts-workflow

Conversation

@0xPabloLI

Copy link
Copy Markdown
Owner

Summary

  • 删除 .github/workflows/dependabot-resolve-peer-conflicts.yml(取代 chore: 移除 Dependabot 配置——Renovate 全面接管 #741 的收窄版)
  • 保留 .github/workflows/dependabot-auto-triage.yml
  • docs/dependabot-behavior.md 整份重写(原文全部指向已不存在的 .github/dependabot.yml)
  • docs/DOCS-INDEX.md 两处条目同步;docs/plans/dev-ci-eslint-peer-dep-fix-spec.md 补"后续"状态行

Why #741 被收窄

#741(CONFLICTING,base main)原本删三样。核对现状后:

#741 的动作 现状 本 PR
删 .github/dependabot.yml 已随 #736 离开 main(git ls-tree origin/main 无此文件) 无需再做
删 dependabot-resolve-peer-conflicts.yml job 有 if: github.actor == 'dependabot[bot]',版本 PR 归零后失去输入;能力被 ci.yml 的 peer-dep-check(严格 npm ci,dev/main 均必填)完全覆盖 ✅ 删
删 dependabot-auto-triage.yml 仓库设置 dependabot_security_updates: enabled,它是真出现 security PR 时唯一的分类器 ❌ 保留

同时修一条我在排查中写下又被证伪的前提:#740/#746 不是 security PR,是 dependabot.yml 删除前最后两笔 version PR(抽查最近 100 条 app/dependabot PR 无一 security-update 型)。所以"auto-triage 正在给 security PR 打标签"不成立,留它的理由是为将来保留分类能力,不是它在干活着的事。

顺带沉淀的诊断(此前无处记录)

dependabot/* → main 的 PR 必然红:branch-flow-guard 是 main 的必填检查,只放行 head=dev(例外 bot/hardcode-sync-*/bot/token-icon-sync-*)。两条真解已写进 docs/dependabot-behavior.md:改 base 到 dev(含 gh pr edit --base 会因 Projects classic 废弃而静默失败、必须走 REST PATCH 这个坑),或给 guard 加白名单(削弱 main 防护,需 maintainer 批准)。本次即用第一条解掉了 #746。

Test plan

  • git grep 确认无残留引用(仅历史 plan 文档保留原文并加"后续"注记)
  • pre-push 全门绿:ci:remote(lint / react-singleton / 单测 / build / audit)+ test:e2e:pre-push + osv-scanner + semgrep + knip + dup:check
  • 合并后确认 dependabot-auto-triage.yml 仍在 PR checks 里出现(它是唯一被保留的 dependabot 管道)

0xPabloLI and others added 25 commits October 1, 2026 01:17
生产每次加载有 1 条 CSP console error:Cloudflare 自动注入的 Web Analytics beacon
bootstrap 被 script-src 拦。已实测证伪「加 hash」这条路——内联块里的 r/t 每请求都变
(两次拉取值不同),Chrome 建议的那个 hash 只对当次响应有效。

不是 #693/1320 引入的回归:1320 之前 script-src 就没有 unsafe-inline 也没有 hash,
这段一直被拦;1320 的 spec 只枚举了 consent 块与 gtag.js 两类。现在把第三类写进
spec,避免下个改 CSP 的 session 再当成新发现。
osv-scanner 从 10-04 起阻断所有本地推送:braces 3.0.3 命中 CVE-2026-93687(8.7 High),
而它上游没有修复版(npm 最新就是 3.0.3;OSV ranges 只有 last_affected、没有 fixed 事件),
所以不能像三天前 axios 那次用 overrides 抬版本解决。它是 tailwindcss@3 → chokidar/micromatch
的 dev 传依赖,不在生产产物里。

只豁免这一条、带理由与 ignoreUntil=2027-01-31(实测:未来日期放行、过期后重新报错,
是真执行的时间闸)。到期若仍无修复版,走根治:换掉 tailwind v3 的 watch/glob 依赖链。
AAV-1328。
自动发现的文件名不能带点(.osv-scanner.toml 实测不生效);未知键是整份配置拒绝
加载而非忽略该条,写错等于豁免全废;ignoreUntil 需 RFC3339 且真的会过期(两个方向
都实测过);osv 只在 pre-push、CI 的 security-audit 是 --omit=dev + continue-on-error,
所以存在「CI 全绿但所有人都推不动」的形态。
相对上一版的四处调整,依据都取一手源码:

1. 取消 weekly schedule,回到引擎默认 at any time,改由 prHourlyLimit=2 +
   prConcurrentLimit=5 节流。按小时滚动才是 Renovate 的模型;把一批更新攒到周一
   是 Dependabot 的成批观感,代价是双轨期看不到任何动作、出问题也发现得晚。
   prConcurrentLimit 5 仍对齐 dependabot.yml 的 open-pull-requests-limit。

2. 纳入 devcontainer manager:.devcontainer/devcontainer.json 的
   image(mcr.microsoft.com/devcontainers/typescript-node:22)与
   features(ghcr.io/devcontainers/features/github-cli:1)此前无人看守——
   dependabot.yml 只配了 npm 与 github-actions。该 manager 同时提取 image 与
   features 两处版本(源码 manager readme),正好覆盖我们 Codespaces 的两个
   版本点。typescript-node 与 CI 的 node-version 是跨消费者契约,故一律人工评审,
   不进 automerge 标签。

3. minimumReleaseAge=7 days 只加在 github-actions 的 non-major 规则上,不是全局。
   它复刻 scripts/check-dep-release-age.mjs 的供应链等待期,而那道门的判据是
   package-lock 的 diff,看不见 workflow 里的 action 钉版 ⇒ actions 此前没有任
   何等待期保护,这里是唯一能落地该策略的位置。

4. 同时设 minimumReleaseAgeBehaviour=timestamp-optional,因为等待期依赖
   release timestamp,而源码注明 Docker 源只在 Docker Hub 取 tag_last_pushed;
   我们两个引用都在 mcr.microsoft.com 与 ghcr.io,无时间戳时默认的
   timestamp-required 会把更新判成 pending 永久搁置(util/minimum-release-age.ts
   的 isPending 分支)。devcontainer 规则因此不加等待期,只设人工评审。

automerge 仍保持 false:合并决策继续走现有 automerge.yml 的 PAT 路径,避免开出
第二条合并通道(也保住 lovable→dev MERGE / 其余 SQUASH 的策略)。

生效前提:Renovate 只读默认分支的配置,本文件需再经 lovable→dev→main 一轮。
AAV-1320 在 Linear 已 Done 却还留在「仅列 open」表里,按文件自身规则移出。
dev 已由 #716(删除 Dependabot 配置)与 #717(Renovate 接管 npm + 7 天等待期)
定下"只用 Renovate"的方向;本分支的 renovate.json 与它从同一 v1 分叉,故以 dev
的决策为基底合并,只改两处会让策略静默变形的地方:

1. 规则按 manager 分域。dev 版两条 packageRules 没有 matchManagers,npm 进入
   enabledManagers 后,npm 的非 major 升级会被打上 github_actions 标签,更紧要的是
   会拿到 automerge 标签 ⇒ 运行时依赖的 minor/patch 将被自动合入。原
   dependabot-auto-triage.yml 的门槛是 npm 只放行 direct:development 的 patch/minor,
   运行时依赖一律人工评审。这里用 matchDepTypes 复刻该门槛:devDependencies 非 major
   才进 automerge 标签,dependencies(运行时)任何类型都不给,major 一律人工。

2. 加 minimumReleaseAgeBehaviour=timestamp-optional。等待期依赖 release 时间戳,
   源码注明 Docker 数据源的 tag_last_pushed 只在 Docker Hub 可得;纳入 devcontainer
   后,我们两个引用(mcr.microsoft.com、ghcr.io)都没有时间戳,默认的
   timestamp-required 会把它们判成 pending 永久搁置(util/minimum-release-age.ts 的
   isPending 分支)。

保留 dev 的选择:weekly schedule、prHourlyLimit 0、全局 7 天等待期、npm 接管。
新增 devcontainer manager(.devcontainer/devcontainer.json 的 image 与 features 此前
无人看守;typescript-node tag 与 CI 的 node-version 是跨消费者契约,故一律人工评审)。

另:不在此刻删除 dependabot-auto-triage.yml / dependabot-resolve-peer-conflicts.yml。
dependabot.yml 只在 dev 被删、main 上仍在 ⇒ Dependabot 仍会往 dev 开 PR,这两个
workflow 目前还活着;等 dependabot.yml 离开 main 之后再收。

验证:renovate.json 无冲突标记且全部键经官方 schema 校验通过(含 matchDepTypes);
overrides 在 merge 中存活(brace-expansion 1.1.21/5.0.12、fast-uri 3.1.8);
lock 与合并后 package.json 一致(npm install 无 diff);osv-scanner rc=0;
npm audit --omit=dev 0 漏洞;check:e2e-market-names 29 spec rc=0。
node 版本在本仓有两个家:workflow 的 node-version(走 node 数据源)与 Dev Container
镜像 typescript-node(走 docker 数据源),二者之间没有任何机制保证同步。正在开的
#727 就是这个裂口的形状——它只改 6 个 workflow 到 v24,不碰 .devcontainer,合下去
CI 就跑 Node 24、Codespaces 仍是 22(本仓无 .nvmrc、package.json 无 engines,所以
这两处就是全部真值)。

做法是跨 manager 分组而不是手工拼一个 PR:后者只修这一次,前者让"必须同批"成为
配置约束——matchDatasources [node, docker] + matchPackageNames [node,
/typescript-node/] → groupName "node runtime",标签 manual-review。分组只在
devcontainer manager 生效后才有意义,故依赖同一份配置里的 enabledManagers。

另:pre-push e2e 从 workers=2 降到 1。该路径跑冷启动 dev server,两条用例
(waitForTableReady、waitForLoadState('networkidle'))在别的 agent 门禁共用本机时
会超时——2026-09-29/30 两次推送被无关红挡下,安静复跑均全绿(其中 faq-anchor
本地 9/9、board 里另一 session 独立判为负载争用)。选择降并发而不是把用例加进
grep-invert 排除名单:排除等于让门禁少测东西,而慢一点不减覆盖。CI 侧的 2 分片
不变(跑 built preview,不受影响)。

验证:renovate.json 全部键经官方 schema 校验(含 matchDatasources/matchPackageNames/
groupName),7 条规则;prettier 干净;check:e2e-market-names rc=0。
建票时把 CF 边缘注入的 __CF$cv 块误归为 Web Analytics beacon。真浏览器复现 +
逐 inline script 扫字面量证明它加载 challenge-platform/scripts/jsd,且站内
已无 cloudflareinsights 引用;zone 在 Free 计划,该检测按一手文档不可关。
#716 删 .github/dependabot.yml 时,AAV-1301 的 ignore(@eslint/js >= 10)没有去处:
npm manager 已开、10.0.1 在 npm 上,下一个窗口会重新提出那个两次让 dev 的
peer-dep-check 与 lint 变红的 bump。用 allowedVersions "<10" 复刻原裁定,9.x 照旧流动。

droid-review.md 里 review_depth / security_scan_schedule 两条 workflow 实际并未设置,
删掉;后者改写为 `on: pull_request` 无 schedule 这种文件可证的说法。
reserves-table-market-filter-pin (5) 用"第 3 行"当作"筛选后会改序"的保证。CI 在
2026-10-05 的快照里整页都是同一个 market,筛选什么都没动,于是 pin 断言量到行仍停在
第三位,两次尝试 y 值一致 —— 确定性,不是抖动。旧选择器面对同一份数据也点到同一颗
chip,所以这不是 #735 的改动引入的。

改成扫可见行的 market chip label,取第一个与首行不同的行;整页同 market 时按本仓
discovery+条件 skip 的既有形状跳过并写明原因。纯函数进 e2e/reserveDiscovery.ts,
配 8 行矩阵单测(去掉 reference 条件会红 4 条,确认断言真咬住实现)。
:393 Path B 的等待是 poll tbody 行数 > 0,消息写着"等表格重新排序",实际只证明表格存在。
supply=900 在 CI 那份快照上没让列表移动,于是"按 Clear 必然触发 pin scroll"量到 0,首跑与
retry 同因,反复挡推送门。

改成用本文件已有的 getVisibleReserveOrder + didReorder(:259 早就这么守):候选场景值逐个试
到确实改序才继续,全都不改序就 skip 并写明原因。实测 :393 从 15.9s 失败变 9.7s 通过。
位置断言与"模拟子行仍可见"两次都通过,唯独 window.scrollBy 探针读 0:重新排序把目标行
上方移走之后,仅靠布局它就已经落进锚点带,不需要滚动。那条探针断言的是机制而不是契约,
且机制归 :259 那条用例专门拥有(改了序就滚、没改序就不滚),删掉重复不减少覆盖。

如实记:这是一次断言放宽,依据写在代码注释与看板第十一行段。
….md 改写为现状

dependabot.yml 随 #736 离开默认分支后 Dependabot 不再产版本 PR,该 workflow 失去输入;
peer 冲突判定已由 ci.yml 的 peer-dep-check(严格 npm ci,dev/main 均必填)覆盖。
保留 dependabot-auto-triage.yml:security updates 仍启用,它是真出现 security PR 时唯一的分类器。

dependabot-behavior.md 原文整份指向已不存在的 .github/dependabot.yml,改写为现状 +
`dependabot/*`→main 被 branch-flow-guard 挡死的成因与两条真解(本次实测 #746 用改 base 解决)。
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@vercel

vercel Bot commented Oct 6, 2026 •

Copy link
Copy Markdown
Contributor

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
aave-protocol-explorer Ready Ready Preview Oct 7, 2026 3:50pm UTC

@factory-droid

factory-droid Bot commented Oct 6, 2026 •

Copy link
Copy Markdown
Contributor

Droid finished @0xPabloLI's task —— View job


LGTM — no candidate findings survived to validation (Pass 1 generated zero candidates and none were carried forward). Verified against the full diff: deleting dependabot-resolve-peer-conflicts.yml removes a dependabot-only reporter whose detection (strict npm ci + invalid-peer npm ls) is a subset of ci.yml's peer-dep-check required gate on dev and main; the dependabot-behavior.md and DOCS-INDEX rewrites are consistent with the repo (automerge.yml PAT path and renovate.json packageRules referenced are in place). The new pickReorderCapableRowIndex helper matches its 8-row unit matrix, and the reworked scenario-pin Clear path keeps its contract assertions (pinned-to-anchor band + visible simulation sub-row) while the didReorder-based candidate loop has valid semantics (a non-reordering candidate leaves the order unchanged, so the loop correctly falls through to the next value or test.skip). All helpers invoked by the changed specs (marketChipForReserve, getVisibleReserveOrder, didReorder, moveExpandedRowAwayFromPinBand, resetScrollByProbe) exist.

0 inline comments posted

This branch was successfully deployed

1 active deployment
Preview — 6492ed0b Deployed Oct 7, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant