后端与接口
在部署到 Vercel 的项目需要降本增效时…
适用于 Vercel 上 Next.js/SvelteKit/Nuxt 等项目的成本与性能优化,先采集 Vercel 指标和用量,再按确定性门控做候选深挖并输出排序建议。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 59/100 ×0.15
适用场景
在部署到 Vercel 的项目需要降本增特定
解决思路
- 开始前不要检查源码,直到 signals.json 存在且确定性门控指向某个路由、文件或项目设置。
- 执行指标优先原则:建议必须从 Vercel 生产信号出发,而不是全仓库 grep。
- 使用确定性门控:由 scripts/gate-investigations.mjs 决定哪些候选值得调查。
- 限制候选范围:只读取候选点名的文件,或路由本地 import 链。
- 版本感知引用:只使用 references/docs-library.json;无效或版本不匹配的引用会被剔除。
- 写报告文本或聊天输出前先读 references/voice.md。
- 前置条件:安装 Vercel CLI v53+,且支持 vercel metrics、vercel usage、vercel contract、vercel api。
- 执行 vercel login 完成 CLI 认证会话。
- 执行 vercel link 链接应用目录;VERCEL_PROJECT_ID 可帮助解析项目配置,但 vercel metrics 仍要求目录已链接;link 或环境必须包含目标项目 org/team/user scope,以便采集器解析出 CLI 安全的 --scope,并让 vercel metrics、vercel usage、vercel contract 保持在同一账号。
- 使用 Node.js 20+。
- 路由级指标驱动建议需要 Observability Plus。
- 绝不在 shell 命令中放认证 token;不要输入 VERCEL_TOKEN=...、--token ...、Authorization: Bearer ... 到可能回显到聊天的命令。
- 预检读取 package.json,在指标扇出前设定框架支持预期。
- 框架支持:Next.js App Router、Next.js Pages Router、SvelteKit、Nuxt 支持;Astro 有限;Hono / Remix / unknown 默认阻塞,只有用户接受有限平台/代码审计才继续。
- 若框架不支持,先停止并在扫描或门控前询问;使用原文提示模板。若用户继续,用 --continue-unsupported-framework 重新运行采集。
- 每次审计使用全新运行目录,不复用 brief、sub-agent 输出或报告:RUN_DIR=$(mktemp -d -t vercel-optimize-XXXXXX)。
- 步骤 1:从已链接应用目录运行,或在脚本支持时传 --cwd;保持 stdout JSON 与 stderr 日志分离,不合并流。
- 执行 node scripts/collect-signals.mjs [projectId] > $RUN_DIR/vercel-signals.json 2> $RUN_DIR/collect.stderr。
- 执行 node -e 'JSON.parse(require("fs").readFileSync(process.argv[1], "utf8"))' $RUN_DIR/vercel-signals.json 校验 JSON。
- 执行 node scripts/scan-codebase.mjs <repo-root> > $RUN_DIR/codebase.json。
- 执行 node scripts/merge-signals.mjs $RUN_DIR/vercel-signals.json $RUN_DIR/codebase.json --out $RUN_DIR/signals.json。
- 采集细节、schema、指标 ID、降级行为见 references/data-collection.md;指标注册表见 lib/queries.mjs;所有查询保持在共享 14 天窗口。
- collect-signals.mjs 解析已链接项目 owner 为 commandScope.cliScope,并在检查 Observability Plus 前验证解析出的账号能读取解析出的项目;下游脚本对每个接受 --scope 的 Vercel CLI 命令复用该 scope。不要手动运行 vercel usage、vercel metrics、vercel contract 而不带同一 scope;未加 scope 的 usage 可能报告用户个人组织,而路由指标来自团队项目。
- 若项目或 scope 解析有歧义,停止并询问用户要审计哪个 Vercel 项目和 team/personal scope;不要从当前 vercel whoami team 推断目标 scope,并且在 link、.vercel/repo.json 中精确项目匹配、或 VERCEL_PROJECT_ID + VERCEL_ORG_ID 标识出目标账号前,不继续采集指标、usage 或 contract。
- 对 PROJECT_SCOPE_UNRESOLVED、SCOPE_UNRESOLVED、PROJECT_SCOPE_MISMATCH 使用原文提示:我暂时无法安全识别本次审计的 Vercel 项目和账号……请确认项目名/ID 和 team slug/name,或说明在个人账号下;确认后我会针对该精确 scope 重新链接或重跑采集,再检查指标。
- 步骤 1.1:门控前检查 blockers:jq '{frameworkSupportBlocker, observabilityPlus, observabilityPlusUsable, observabilityPlusBlocker, observabilityPlusBlockerDetail}' $RUN_DIR/signals.json。
- 若 frameworkSupportBlocker === unsupported_framework:使用不支持框架提示。
- 若 PROJECT_SCOPE_UNRESOLVED、SCOPE_UNRESOLVED、PROJECT_SCOPE_MISMATCH:停止并询问目标项目和 scope;团队项目在 vercel link --yes --project <project-name-or-id> --team <team-slug> 后重跑;个人项目在目标用户账号下重新链接,或设置 VERCEL_PROJECT_ID 和 VERCEL_ORG_ID 后重跑。
- 若 observabilityPlusBlocker === null:继续。
- 若 no_traffic:告诉用户路由指标稀疏;仅当用户接受有限输出才继续。
- 若 payment_required 或 no_oplus_probe:逐字渲染 references/observability-plus.md 并询问。
- 若 project_disabled:告诉用户为项目启用 Observability Plus,或接受有限审计。
- 若 daily_quota_exceeded:停止并告诉用户 Observability 查询配额已耗尽;等下一个 UTC 午夜重置后重试,或询问是否继续有限代码审计。
- 若 not_linked:链接应用目录后重跑步骤 1;若知道 app path 和 project:vercel link --yes --project <project-name-or-id> --cwd <app-dir>,已知团队时加 --team <team-id-or-slug>。
- 若 forbidden 或 project_not_found:修复 auth/team scope;不要推介 Observability Plus。
- 若 all_failed_other:显示原始错误码,并询问是否继续有限代码模式。
- 不要静默回退到仅代码模式。若用户接受有限审计,用 node scripts/collect-signals.mjs [projectId] --continue-without-observability > $RUN_DIR/vercel-signals.json 2> $RUN_DIR/collect.stderr 重新采集,然后重新扫描和合并。
- 步骤 2:门控候选:node scripts/gate-investigations.mjs $RUN_DIR/signals.json > $RUN_DIR/gate.json。
- 门控输出形状:toLaunch 要调查的代码 scope 候选;platform 项目/账号 scope 建议;gated 被跳过、已覆盖或取消资格但仍须出现在报告中的候选;budget 候选预算和选择模式。
- 默认预算是 6 个代码 scope 候选,并有多样性护栏。扩展:node scripts/gate-investigations.mjs $RUN_DIR/signals.json --max-candidates 12 > $RUN_DIR/gate.json;或 --max-candidates all。
- 生成的候选文档:references/candidates.md。
- 步骤 2.1:需要时询问审计范围:node scripts/budget-summary.mjs $RUN_DIR/gate.json --format json > $RUN_DIR/budget-summary.json。
- 若 shouldAsk 为 false,继续。
- 若 shouldAsk 为 true:先原样打印 exactChatMessage.body,不要总结、截断、重排或改写;然后在宿主支持结构化问题时用 questionPayload 询问 questionText;若用户选择不同数量,用 --max-candidates <choice> 重跑门控。
- 绝不把长预览放进问题字段;预览和问题是分离的界面。
- 步骤 2.2:深挖与对账:node scripts/deep-dive.mjs $RUN_DIR/signals.json $RUN_DIR/gate.json --cwd <project-dir> > $RUN_DIR/investigation-evidence.json。
- 执行 node scripts/reconcile-candidates.mjs $RUN_DIR/investigation-evidence.json --gate $RUN_DIR/gate.json --out $RUN_DIR/reconciled-investigation.json。
- --cwd 必须是已链接项目目录,以便 deep-dive.mjs 验证同一项目链接,并为后续 vercel metrics 调用复用 signals.json.commandScope.cliScope。
- 对账会在任何源码调查前确定性地把被证伪候选转为观察:metric_mismatch、error_storm、deployment_regression、scanner_only_no_metric。
- 步骤 2.3:生成 brief 并调查:node scripts/prepare-investigation-brief.mjs $RUN_DIR/signals.json $RUN_DIR/reconciled-investigation.json --list > $RUN_DIR/briefs-manifest.json。
- 为 briefs-manifest.json.briefs 中每个条目生成一个 brief。group 可以是 toLaunch 或 platform;不要只生成 toLaunch brief。
- 执行 mkdir -p $RUN_DIR/briefs $RUN_DIR/sub-agent-outputs。
- 执行 node scripts/prepare-investigation-brief.mjs $RUN_DIR/signals.json $RUN_DIR/reconciled-investigation.json --group <brief.group> --index <brief.index> --out $RUN_DIR/briefs/<brief.group>-<brief.index>.md。
- 用 briefs-manifest.json.briefs[].label 作为可见 worker 名称,例如 Low cache-hit route on /docs/llm-digest/[...slug],而不是 toLaunch-7。
- 扇出规则:1-2 个 brief 内联调查;3+ 个 brief 且宿主支持时,每个 brief 派生一个 sub-agent;宿主不支持 sub-agent 时串行内联运行。
- Sub-agent 契约:brief 即完整 prompt;只读 brief 中列出的文件,必要时加路由本地 import;使用 references/recommendations.md 输出一个 JSON recommendation 或一个 JSON no-change finding;不要引用提供的 citation subset 之外的 URL;不要推荐检测版本中不可用的框架特性。
- 若 sub-agent 伸手做全仓库 grep,说明候选畸形;丢弃或 abstain,而不是扩大范围。
- 步骤 2.4:收集输出:把每个原始调查结果保存在 $RUN_DIR/sub-agent-outputs/,然后执行 node scripts/collect-sub-agent-outputs.mjs --manifest $RUN_DIR/briefs-manifest.json --out $RUN_DIR/recommendations.json $RUN_DIR/sub-agent-outputs/。
- 收集器提取 JSON、前置已解析记录、强制 manifest 顺序,并在缺失、重复、未知或不匹配的 candidateRef 上失败。
- 步骤 3:验证建议:node scripts/verify-and-regen.mjs $RUN_DIR/recommendations.json --signals $RUN_DIR/signals.json --repo-root <project-dir> --out $RUN_DIR/verify.json。
- 该脚本提取声明,验证文件/引用/版本适配,评分质量,应用 sanitizer,输出 verifiedRecommendations、withheldRecommendations、renderableRecommendations,并为失败或不安全建议创建 regenPlan。
- 推荐 schema、写作规则、sanitizer 顺序、评分规则见 references/recommendations.md;验证规则见 references/verification.md。
- 对每个 regenPlan 条目,用同一 brief 重跑,并加入 Previous attempt failed these checks 小节列出 topFailures;只有在验证改善且不掏空引用时才保留重生成输出。
- 步骤 4:渲染报告和最终消息:node scripts/render-report.mjs $RUN_DIR/verify.json $RUN_DIR/gate.json $RUN_DIR/signals.json --project <name> --out $RUN_DIR/report.md --message-out $RUN_DIR/final-message.json。
- 仅在开发该 skill 时使用 --debug-out $RUN_DIR/debug.json。客户 Markdown 和聊天输出不得暴露 passRate、quality、sanitizer trails、原始 sub-agent 名称或其他实现字段。
- 渲染后,原样打印 final-message.json.body 并停止。不要添加 highlights、debug notes、原始计数、sub-agent 摘要或额外解释。渲染时去重、平台上限和硬安全丢弃会改变客户可见计数,因此绝不要从原始 verify.json 总结。
- 报告结构和影响框架见 references/scoring.md。
- 建议规则:每条建议必须追溯到已启动候选、平台候选、已解析观察,或已验证的流量无关 scanner finding。
- 建议必须包含来自 signals.json 或 evidence.deepDive 的已观察指标证据。
- 涉及代码时,必须引用带行号的已验证文件。
- 必须包含至少一个适用于检测框架/版本的允许引用。
- 使用精确的已观察性能数字。
- 成本只用数量级短语;绝不给客户可见的 $N 节省金额。
- 不要为 Vercel Workflow runtime 端点(/.well-known/workflow/v1/*)建议减少 duration。这些是持久化 step/flow 执行生成的编排路由,应在调查前硬门控。
- Workflow 建议必须点名被改变的边界。有效示例:入队持久工作并返回 run ID 而不是等待完成、修复 stream replay/closure/locks、减少已验证多余的 Workflow Steps/Storage。不要从 Workflow 端点 wall-clock duration 推断成本节省。
- 对 streaming、SSE、可恢复聊天或其他有意长生命周期路由,不要仅把 wall-clock function duration 当作问题。需要证据表明存在可避免的 first-byte 前工作、高 active CPU、重复调用,或可移出用户可见路径的响应后工作。
- 建议缓存时必须点名具体 cache policy。
- 除非证据证明可安全缓存,否则保持不安全响应为动态:认证敏感路径、错误、fallback 响应、缺失内容、无效请求、按地理位置/设备变化的输出、未版本化的动态 URL。
- 绝不要为 signals.project 中已有的事实推荐“验证 X 已开启”,包括 Fluid compute 状态、内存层级、区域、函数内并发、超时。
- Scanner 规则:scanner finding 是补充性的。丢弃标注 COLD-PATH 或 NO-ROUTE-MAPPING 的 finding,除非 scanner 声明 metadata.trafficIndependent === true。
- 流量无关示例:middleware matcher、source maps、React Compiler 配置、构建设置。路由本地缓存或数据获取模式需要路由级流量证据。
- Scanner 文档:references/scanner-patterns.md。
- 最终客户术语使用:recommendations ready、observations from investigation、investigated, no change recommended、not investigated in this run。
- 最终客户术语避免:sub-agent、abstention、passRate、quality score、gate、LLM。
- 失败文案:不加销售话术或流程细节。
- 最近 14 天无流量文案:> This project has no meaningful traffic in the last 14 days, so route-level metrics are sparse. I can still check traffic-independent scanner findings and project settings, but I cannot rank route fixes until traffic accumulates.
- 路由级指标不可用文案:使用 references/observability-plus.md 中的逐字选择模板。不要静默回退到仅代码模式;给出两条路选择:启用 Observability Plus 并重跑指标驱动审计,或接受有限仅代码运行。
- 项目未链接文案:> This worktree is not linked to a Vercel project. Run vercel link --yes --project <project-name-or-id> --cwd <app-dir> and rerun the audit. If the team is known, add --team <team-id-or-slug>.
- 大多数路由到文件映射失败文案:> The route inventory matched fewer than half of the routes we saw in observability. This is common in monorepos with custom routing. I've surfaced what I can match; the rest appear in the Not investigated in this run section.
适用边界 · 注意事项
- Hono、Remix 或未知框架且用户不接受有限平台/代码审计时不要使用。
- 项目近 14 天无有效流量时,不要做路由级指标驱动的排名。
- 无 Observability Plus 且用户不接受有限代码审计时,不要做路由级指标推荐。