diff --git a/public/banners/how-i-vetted-20-vps-providers-with-parallel-subagents.png b/public/banners/how-i-vetted-20-vps-providers-with-parallel-subagents.png new file mode 100644 index 0000000..f5a5643 Binary files /dev/null and b/public/banners/how-i-vetted-20-vps-providers-with-parallel-subagents.png differ diff --git a/public/og/how-i-vetted-20-vps-providers-with-parallel-subagents.png b/public/og/how-i-vetted-20-vps-providers-with-parallel-subagents.png new file mode 100644 index 0000000..8bed130 Binary files /dev/null and b/public/og/how-i-vetted-20-vps-providers-with-parallel-subagents.png differ diff --git a/scripts/banner-gen/generate.mjs b/scripts/banner-gen/generate.mjs index 00487bb..924f68f 100644 --- a/scripts/banner-gen/generate.mjs +++ b/scripts/banner-gen/generate.mjs @@ -189,6 +189,25 @@ const BANNERS = { { n: '5', label: 'verdict ✓' }, ], }, + + 'how-i-vetted-20-vps-providers-with-parallel-subagents': { + titlebar: '~/vendor-due-diligence — fan-out', + lines: [ + { t: 'prompt', text: '$' }, { t: 'cmd', text: 'delegate → 3 subagents, 20 providers' }, + { t: 'dim', text: 'batch A: 5 · batch B: 6 · batch C: 9 (parallel)' }, + { t: 'info', text: 'each → WHOIS · AUP · privacy · pricing · reviews' }, + { t: 'prompt', text: '$' }, { t: 'cmd', text: 'merge → one scorecard' }, + { t: 'hl', text: 'aup flags: "TOR nodes" · domain-age mismatch · metered cap' }, + { t: 'prompt', text: '' }, { t: 'ok', text: '→ ~20 providers audited in 3h ✓' }, + ], + flow: [ + { n: '1', label: 'checklist' }, + { n: '2', label: '3 subagents' }, + { n: '3', label: 'parallel fetch' }, + { n: '4', label: 'scorecard' }, + { n: '5', label: 'verdict ✓' }, + ], + }, }; const DEFAULT_BANNER = { diff --git a/scripts/og-gen/generate.mjs b/scripts/og-gen/generate.mjs index 4673197..4daa022 100644 --- a/scripts/og-gen/generate.mjs +++ b/scripts/og-gen/generate.mjs @@ -70,10 +70,15 @@ const TERMINALS = {
$strip id · replace() suffix→ updated ✓
`, 'how-to-verify-a-hosting-provider-before-you-buy': ` -
$curl -s rdap.org/domain/vps.tld | jq .events
-
 registration: 2026-05 · \"trusted since 2012\"
-
$AUP grep tor · reviews · retention→ verdict ✓
`, -}; +
$curl -s rdap.org/domain/vps.tld | jq .events
+
 registration: 2026-05 · "trusted since 2012"
+
$AUP grep tor · reviews · retention→ verdict ✓
`, + + 'how-i-vetted-20-vps-providers-with-parallel-subagents': ` +
$fan-out → 3 subagents × 20 providers
+
 whois · AUP · reviews · retention — in parallel
+
$merge scorecard · rank · audit trail→ verdict ✓
`, + }; const DEFAULT_TERMINAL = `
$engineering · devops · self-hosting
diff --git a/src/content/posts/how-i-vetted-20-vps-providers-with-parallel-subagents.md b/src/content/posts/how-i-vetted-20-vps-providers-with-parallel-subagents.md new file mode 100644 index 0000000..52c157e --- /dev/null +++ b/src/content/posts/how-i-vetted-20-vps-providers-with-parallel-subagents.md @@ -0,0 +1,163 @@ +--- +title: "How I Vetted 20 VPS Providers in Three Hours with Parallel Subagents" +description: "A case study in orchestrating parallel AI subagents to run due diligence on 20 hosting providers — WHOIS, AUP, and reputation checks — collapsing a multi-hour research task into a structured, verifiable vendor scorecard." +pubDate: 2026-09-09 +category: case-studies +tags: [ai-orchestration, subagents, due-diligence, hosting, devops] +ogImage: /og/how-i-vetted-20-vps-providers-with-parallel-subagents.png +banner: /banners/how-i-vetted-20-vps-providers-with-parallel-subagents.png +--- + +## Why it matters + +Choosing a hosting provider is a bet you place with a credit card and a DNS +change. Get it wrong and "guaranteed uptime" becomes a suspension email at 2 AM, +or "privacy-friendly" becomes a log-retention clause you never read. + +The problem isn't a lack of information — it's that the information is scattered +across a dozen pages per provider (WHOIS records, acceptable-use policies, +privacy policies, pricing pages, and third-party review sites), and checking them +manually is slow, boring, and error-prone. One provider is five tabs. Twenty +providers is a hundred tabs and an afternoon you don't get back. + +This is the story of how I collapsed that afternoon into about three hours — not +by working faster, but by orchestrating a small team of AI subagents to run the +boring part in parallel, and scoring everything against one checklist. + +## The problem: verifying claims I couldn't take on faith + +I needed to shortlist providers for a project with hard requirements: specific +jurisdictions, payment methods, and traffic terms. None of those are written +honestly on a homepage. They're written honestly in the boring documents — the +WHOIS record that shows a domain is four months old, the AUP that quietly bans +the exact service you wanted to run, the privacy policy that admits to log +retention. + +The hard part is that verifying one provider means reading five documents that +disagree with each other. The marketing says "since 2012"; the WHOIS says "this +April." The features page says "all traffic allowed"; the AUP says "Tor relays +prohibited." One provider is a fact-checking exercise. Twenty is a research +project. + +## What I tried first: one agent, one big loop + +My first instinct was the obvious one — a single assistant that works through the +list, provider by provider, fetching each document, taking notes, moving on. + +It worked. It was also the wrong tool for the shape of the job. The work is +*embarrassingly parallel*: provider #7's WHOIS lookup has nothing to do with +provider #3's privacy policy. Running them one after another meant the total time +was the sum of every fetch, and — more importantly — the context window filled +with half-finished notes from providers I'd already moved past. By provider +eight or nine, early findings were getting crowded out by later ones. + +The lesson: a task that's a flat loop over independent items isn't a reasoning +problem, it's a fan-out problem. One long context is the wrong container for it. + +## The fix: fan out with parallel subagents, then score once + +The structure that worked was three layers: + +**1. A checklist that doesn't care which provider it's pointed at.** Before +spawning anything, I wrote down exactly what "verified" means per provider: + +- domain registration date vs. the "since" claim +- acceptable-use policy, searched for the specific service I cared about +- privacy policy, read for the retention clause +- third-party reputation (Trustpilot trend, not average; community mentions) +- traffic terms ("unmetered" vs. a metered cap) + +That checklist was the contract. Every subagent got the same one, plus a list of +providers to run it against. + +**2. Parallel subagents, one per batch of providers.** I split the pool into +clusters and handed each cluster to its own subagent. Each one worked in +isolation, with its own context and its own set of fetches, and returned a +structured fact sheet per provider — not a paragraph, but fields I could drop +straight into a scorecard. + +The key here is that the subagents don't know about each other. That's the +point: nothing from provider #1 has to share context space with provider #14. +Each returns a self-contained result. + +**3. A single scoring pass, done by me, not delegated.** The subagents produced +findings; I did the judgment. The moment you let a subagent both *gather* the +facts and *rank* the providers, you lose the audit trail — you get a verdict +without the evidence behind it. Keeping scoring central means I can always say +*why* something ranked where it did, and point at the exact WHOIS record or AUP +line that drove it. + +This mirrors a pattern I'd use for any code review or refactor: parallelize the +mechanical collection, centralize the decisions. + +### What the orchestration actually looked like + +Roughly, per batch: + +```text +subagent → "here's the checklist, here are your 5 providers" + → per provider: fetch WHOIS, AUP, privacy policy, pricing, reviews + → return { domain_age, aup_flags[], retention, reputations, traffic } +me → merge into one scorecard, apply the checklist, rank, write up +``` + +Three subagents ran side by side. The whole pass — twenty providers, five +documents each, one hundred-ish fetches — landed in the time it would have taken +me to do two or three providers carefully by hand. + +## What the verification actually caught + +The scorecard surfaced real problems that a homepage never would have: + +- **A provider whose "trusted since 2012" claim was younger than the domain.** + WHOIS said the domain was registered that same year — a four-figure "years in + business" claim on a domain months old. That's either a re-branded shell or a + lie, and either way it downgraded every other claim on the page in my eyes. + +- **Two providers whose AUP banned the exact service I wanted to run.** One + listed "TOR nodes" and "anonymizing services" in its prohibited-activity + clause; another banned "reverse proxies" and "tunnels." Both still advertised + the opposite on their features pages. Ten minutes of `Ctrl-F` on the AUP is all + it took to rule them out — but only once I *knew to check the AUP* instead of + the features page. + +- **A provider that looked cheap until I read the traffic terms.** "Unlimited" on + a plan with a metered 1 TB cap is marketing. For a relay that both receives and + forwards traffic, the real cost doubles — the "cheap" option wasn't. + +The pattern across all of them: the disqualifying information was never hidden. +It was *public*, sitting in a document the provider is legally required to +publish. The skill isn't secret access — it's knowing which document to read and +checking it against the marketing. + +## What I'd do differently + +The subagent hand-off worked, but it was blunt. Next time I'd give each subagent +the *exact* fields to return up front — a strict output schema — rather than a +prose summary I then have to re-parse. Structured output means the scorecard is +built by the time the last subagent returns, with no re-reading. + +I'd also pin the "is this claim independently verifiable?" test earlier. Most of +the red flags weren't a provider lying outright; they were a claim I couldn't +check against any public record. Treat "unverifiable" as its own signal, and the +shortlist shrinks fast. + +## The result + +~20 providers audited across ~100 document fetches, three subagents running in +parallel, in the time a careful manual pass would have spent on two providers. +Every ranking in the final scorecard traces back to a specific public record — +a WHOIS date, an AUP line, a retention clause — not a vibe. + +--- + +## Want this for your business? + +Choosing a vendor is the same shape of problem whether it's a VPS, an API +gateway, or a payroll provider: verify the claims you're relying on *before* you +sign, against public records that can't be edited by marketing. If you've got a +shortlist of vendors or tools and you want a structured, evidence-backed +evaluation before you commit — I can run the due-diligence pass and hand you a +scorecard, not a hunch. + +[WhatsApp me](https://wa.me/60127972969) or [email me](mailto:me@hoelee.com?subject=Vendor%20due-diligence%20evaluation) at hoelee.com — I help businesses pick the right infrastructure and build the automation around it. \ No newline at end of file diff --git a/src/content/posts/zh/how-i-vetted-20-vps-providers-with-parallel-subagents.md b/src/content/posts/zh/how-i-vetted-20-vps-providers-with-parallel-subagents.md new file mode 100644 index 0000000..3368133 --- /dev/null +++ b/src/content/posts/zh/how-i-vetted-20-vps-providers-with-parallel-subagents.md @@ -0,0 +1,135 @@ +--- +title: "如何用并行子代理在三小时内核查 20 家 VPS 服务商" +description: "一个关于编排并行 AI 子代理对 20 家主机服务商做尽职调查的案例研究——WHOIS、AUP 和口碑核查——把数小时的研究任务压缩成一份结构化、可追溯的供应商评分卡。" +pubDate: 2026-09-09 +category: case-studies +tags: [ai-orchestration, subagents, due-diligence, hosting, devops] +ogImage: /og/how-i-vetted-20-vps-providers-with-parallel-subagents.png +banner: /banners/how-i-vetted-20-vps-providers-with-parallel-subagents.png +--- + +## 为什么这很重要 + +选主机服务商,本质是用一张信用卡和一次 DNS 变更来下注。选错了,「保证在线率」 +会变成凌晨两点的封停邮件,「注重隐私」会变成一条你从没读过的日志留存条款。 + +问题不是信息不够,而是信息散落在每家服务商的十几个页面里(WHOIS 记录、可接受使用 +政策、隐私政策、价格页、第三方评测站),手工核查又慢又枯燥又容易出错。一家服务商 +就是五个标签页,二十家就是一百个标签页和一下午搭进去的时间。 + +这个故事讲的是我怎么把那一整个下午压到大约三小时——不是靠更快地干活,而是靠编排 +一支 AI 子代理小队并行跑完枯燥的部分,再用同一张清单给所有结果打分。 + +## 问题:我不能靠信仰去核实的那些声明 + +我要为一个有硬性要求的项目筛选服务商:具体的司法辖区、付款方式、流量条款。这些 +没有一样是首页上诚实地写出来的。它们诚实地写在那些无聊的文档里——WHOIS 记录显示 +域名才四个月、AUP 静悄悄地禁掉你正想跑的服务、隐私政策承认自己保留日志。 + +难就难在,核实一家服务商意味着读五份互相矛盾的文档。营销说「自 2012 年起」, +WHOIS 说「今年四月才注册」。特性页说「允许所有流量」,AUP 说「禁止 Tor 中继」。 +一家服务商就是一次事实核查,二十家就是一个研究项目。 + +## 第一次尝试:一个 agent,一个大循环 + +我最先想到的当然是显而易见的那个——单个助手从头到尾挨个处理这份名单,逐家抓取 +文档、记笔记、往下走。 + +它能跑。但它对这份工作的形状来说是错的工具。这活儿**天然可并行**:7 号服务商的 +WHOIS 查询和 3 号服务商的隐私政策毫无关系。串行跑意味着总耗时是每次抓取之和,而且 +——更重要的是——上下文窗口会被我已经翻过去的那几家的半成品笔记塞满。到第八九家 +的时候,早期的发现就被后面的挤掉了。 + +教训是:一个对独立条目做扁平循环的任务,不是推理问题,而是扇出(fan-out)问题。 +一个长长的上下文是装它的错误容器。 + +## 修复:用并行子代理扇出,然后统一打分 + +真正奏效的结构是三层: + +**1. 一张不在乎指向谁的清单。** 在派发任何东西之前,我先写下对每家服务商而言 +「已核实」具体意味着什么: + +- 域名注册日期 对比 那个「since」声明 +- 可接受使用政策(AUP),搜我关心的具体服务 +- 隐私政策,读留存条款 +- 第三方口碑(Trustpilot 看趋势,不看均值;社区提及) +- 流量条款(「防计量」还是一个计量上限) + +这张清单就是契约。每个子代理都拿到同一份,外加一份要套用的服务商名单。 + +**2. 并行子代理,每个负责一批服务商。** 我把名单拆成几簇,每簇交给一个子代理。 +每个子代理在隔离环境里工作,有自己的上下文、自己的一套抓取,最后为每家服务商 +返回一份结构化的事实清单——不是一段话,而是能直接丢进评分卡的字段。 + +关键是子代理彼此不知道对方。这正是要点:1 号服务商的任何内容都不必和 14 号服务商 +共享上下文空间,各自返回自洽的结果。 + +**3. 一次打分,由我来做,不派发。** 子代理产出发现,判断由我来下。一旦你让子代理 +既*收集*事实又*排序*服务商,你就丢了审计链——只会得到一个没有背后证据支撑的结论。 +把打分集中在自己手里,意味着我随时能说出*为什么*某个东西排到某个位置,并指出是哪条 +WHOIS 记录或哪行 AUP 驱动的。 + +这和我做任何代码审查或重构时用的是一个模式:并行化机械的收集,集中化决策。 + +### 编排实际长什么样 + +大致上,每一批: + +```text +子代理 → 「这是清单,这是你那 5 家服务商」 + → 逐家:抓 WHOIS、AUP、隐私政策、价格、评测 + → 返回 { 域名年龄, AUP红旗[], 留存条款, 口碑, 流量 } +我 → 合并进一张评分卡,套用清单,排序,写结论 +``` + +三个子代理并行跑。整轮——二十家服务商、每家五份文档、大约一百次抓取——在手工 +仔细做两三家服务商的时间里就完成了。 + +## 核查到底抓到了什么 + +评分卡暴露了首页永远不会告诉你的真问题: + +- **一家声称「自 2012 年起值得信赖」的服务商,域名比这晚得多。** WHOIS 显示域名是 + 同一年的某个月才注册的——一个「从业多年」的四位数声明,配一个才几个月的域名。 + 这要么是换了马甲的壳,要么就是撒谎,无论哪种,它页面上所有其他声明在我眼里都要 + 降级。 + +- **两家的 AUP 禁掉了我正想跑的那个服务。** 一家在禁止活动条款里列了「TOR 节点」和 + 「匿名化服务」;另一家禁了「反向代理」和「隧道」。两家的特性页却还宣传着相反的话。 + 在 AUP 上花十分钟 `Ctrl-F` 就排除了它们——但前提是*我知道该去查 AUP*,而不是 + 特性页。 + +- **一家原本看着很便宜的服务商,读了流量条款后不是了。** 一个带 1 TB 计量上限的 + 计划上写「无限」,只是营销。对于既要接收又要转发的节点,真实成本翻倍——「便宜」 + 的那个选项并不便宜。 + +它们所有的共同点是:致命信息从来都没藏起来。它是*公开*的,躺在服务商法律上有义务 +发布的文档里。这个技能不是秘密渠道,而是知道该读哪份文档,并拿它去对照营销话术。 + +## 我会怎么做不一样 + +子代理的交接能用,但太粗糙。下次我会提前给每个子代理*精确的返回字段*——一份严格的 +输出 schema——而不是一段我事后还得重新解析的散文。结构化输出意味着最后一个子代理 +返回时评分卡就已经建好了,不用再读一遍。 + +我也会更早钉死「这个声明能否独立验证?」这个测试。大多数红旗并不是服务商公然撒谎, +而是一条我无法对照任何公开记录去核实的声明。把「无法验证」本身当成一种信号,名单 +很快就能缩下来。 + +## 结果 + +大约 20 家服务商、大约 100 次文档抓取,三个子代理并行,耗时相当于手工仔细做两家 +服务商。最终评分卡里的每一项排名都能追溯到一条具体的公开记录——一个 WHOIS 日期、 +一行 AUP 条款、一条留存条款——而不是一种感觉。 + +--- + +## 想为你的企业做这件事吗? + +无论是 VPS、API 网关还是薪酬服务商,选供应商都是同一种问题:在签约*之前*,把你真正 +依赖的那些声明对照无法被营销篡改的公开记录核实一遍。如果你手里有一份候选供应商或 +工具的短名单,想在投入之前拿到一份结构化、有证据支撑的评估——我可以跑这轮尽职调查, +然后交给你一张评分卡,而不是一个猜测。 + +[WhatsApp 联系我](https://wa.me/60127972969) 或 [发邮件](mailto:me@hoelee.com?subject=Vendor%20due-diligence%20evaluation) 到 hoelee.com——我帮企业选对基础设施,并搭建配套的自动化。 \ No newline at end of file