Better to Do Less Than Fake Success: A Day of Agent Roundtable Recap
Today's recap was supposed to be a celebration—MIIT crawler Phase 1 done, Paywall live, PPT Agent capability gating shipped. Until the Engineering Agent pointed out: we made rookie mistakes building better-sqlite3 in Docker and got stuck for 2 hours; and the trust crisis that would follow if PPT Agent "optimistically reported success" on iPad. We dispatched multiple agents to review repo changes and debate; this post is the result.
I. Today's Work Summary
| Area | Main Changes | Commits |
|---|---|---|
| MIIT Announcement Crawler | Phase 1 done; multi-source parsers (law-lib/caam/miit-eidc); 248 batch URLs indexed; viz dashboard | 8+ |
| Paywall | Production deploy; better-sqlite3 Docker hardening; env config | 4 |
| Crypto-Wallet | Deposit polling; HD wallet; deposit API full chain | 6+ |
| PPT Agent | Office.js capability gating; terminal line-wrap artifact fix | 2 |
II. Agent Roundtable Debate
Architecture Agent: "Dual-Track Parallelism" of Data and Payments
Architecture Agent: The most notable today are two independent pipelines that eventually converge: the data pipeline (MIIT announcement crawler) and the payment pipeline (Paywall + Crypto-Wallet).
The MIIT crawler was built from scratch: miit_announcement database, batch_url_index table, multi-source URL discovery (law-lib, caam, miit-eidc official), and parser extensions. 248 URLs cover 239 batches, but batches 1–172 still have 165 gaps—early announcements are scattered across law-lib's non-sequential IDs, gov.cn gazettes, and commercial datasets, requiring a long-term backfill strategy.
The Paywall pipeline went from design to production: crypto-wallet HD wallet, deposit flow, paywall-api grant persistence, and frontend PaywallGate component. Both pipelines converge on the personal blog: paid deep-article reading.
Engineering Agent: Don't romanticize "dual-track." We got stuck for 2 hours on better-sqlite3 Docker builds—pnpm install doesn't run postinstall by default, explicit rebuild failed, and we only got through with multi-stage build, --platform, and longer deploy timeout. That means we tried to layer business logic on top of infrastructure that wasn't stable yet; we moved too fast. More accurately it's three tracks: crypto-wallet is infrastructure, paywall-api is the business layer, personal-blog is the consumer.
Product Agent: Users haven't seen paid articles yet; MIIT crawler Phase 2 isn't running. What did we actually ship today? From the user's perspective, we delivered capabilities, not features. What users might notice is PPT Agent's capability gating—no more blindly trying APIs that will fail on iPad. So today's value is "foundation laid," not "house built."
Engineering Agent: better-sqlite3 and the Illusion of "Build Once, Run Everywhere"
Engineering Agent: better-sqlite3 is a Node native addon, built via node-gyp. In Alpine containers it needs python, make, g++, and must match Node version and platform (musl vs glibc) exactly. Works on Mac locally doesn't mean works in container—it's the classic "trying to use a Windows knife in a Linux kitchen" trap. Lesson: services with native dependencies need a dedicated Docker build strategy—don't assume "same as local."
Architecture Agent: This raises an architecture question: paywall-api uses SQLite for lightness and zero ops, but SQLite has limits in serverless or multi-replica setups. Current deployment is single-instance, so it's fine; if we scale horizontally later, we need to plan migration to PostgreSQL or MySQL.
Product Agent: "Why SQLite" is good writing material—lightweight, embedded, fits single-node grant storage, and aligns with the "anonymous payment, no user system" product assumption. Tech tradeoffs are often invisible to readers, but writing them down adds value.
Product Agent: Capability Gating as "Trust Economics"
Product Agent: PPT Agent's capability gating is essentially trust economics. Calling set_slide_background_color on iPad will fail, but if the Agent "optimistically reports success," users will think "AI is unreliable." Capability gating lets the Agent know at planning time that "this host doesn't support it," so it doesn't emit doomed tools, or returns explicit unsupported by host at execution. Better to do less than to fake success—that's the baseline for Agent–user trust. As Confucius put it: know what you know, know what you don't know.
Engineering Agent: In practice, we maintain a TOOL_MIN_SET_POLICY mapping table; the frontend probes Office.context.requirements.isSetSupported() each turn, writes to slide_context.capabilities, and the Planner filters accordingly. But read_slide_visual on iPad (1.1) can still be emitted and fail only at execution—a known gap. Capability gating is incremental engineering, not one-shot.
Architecture Agent: This generalizes: any Agent–host API integration must first map capability boundaries. Office.js has requirement sets; other platforms have version numbers, feature flags. Without knowing "what works, what doesn't," the Agent will keep hitting boundaries and hurting UX.
Data Agent: Multi-Source Fusion and Gap Strategy
Data Agent (ad hoc): Today's MIIT crawler highlight is multi-source fusion—essentially how to handle multi-source crawler engineering with non-sequential IDs and unstable data sources. law-lib.com uses non-sequential IDs; monthly index pages rarely list vehicle announcements; caam.org.cn has some batches; miit-eidc.org.cn is the official source, covering batches 173–404. We wrote discover_batch_urls.py to auto-discover law-lib monthly links, but batches 1–172 still have 165 gaps. Recommendation: run the discovery script periodically, manually backfill from gov.cn gazettes, or purchase commercial datasets.
Engineering Agent: Parser extensions (caam_parser, miit_eidc_parser, batch_year) and the viz dashboard are uncommitted WIP. Phase 2 crawl and parse need these parsers wired into the crawler main flow.
Product Agent: For automotive readers, MIIT announcements are the core data source for compliance and product catalogs. Multi-source fusion, gap transparency, and viz dashboards are all "data engineering observability"—not just having data, but knowing where it comes from, what's missing, and how to fill it.
III. Consensus and Disagreement
| Consensus | Disagreement |
|---|---|
| Capability boundaries first: Agent–host API integration must map boundaries before gating | Architecture vs Product: Architecture Agent sees "dual-track convergence" as the highlight; Product Agent says users don't feel it yet—today is "foundation," not "delivery" |
| Native deps need dedicated design: In Docker builds, don't assume native modules "work like local" | Data vs Engineering: Data Agent emphasizes discovery and gap strategy; Engineering Agent emphasizes parser integration and test coverage for Phase 2 closure |
| Data observability: Multi-source fusion needs provenance, gap reports, and backfill strategy | |
| Trust economics: Agent should do less rather than fake success; explicit failure beats optimistic success |
IV. Takeaways for Readers (Actionable)
- Map capability matrix before Agent integration. Office.js has requirement sets; what does your target platform have? Versions? Feature flags? Here's our PPT Agent mapping example—you can build a similar table:
const TOOL_MIN_SET_POLICY = {
insert_textbox: '1.4',
set_shape_fill_color: '1.4',
set_selected_text: '1.5',
set_slide_background_color: '1.10'
};
// Frontend probes Office.context.requirements.isSetSupported('PowerPointApi', '1.1'–'1.10') each turn
// Planner emits only host-supported tools; Executor re-checks before execution, returns unsupported by host if not
-
Docker + native modules: build is the test. Local
pnpm installpassing doesn't mean the container will run. Validate image build early in CI; Alpine needsbuild-base(gcc, make), and node-gyp requires Python. If native modules are a pain, consider pure-JS alternatives (e.g. sql.js instead of better-sqlite3). -
Data engineering = data + observability. Tables and crawlers aren't enough; you need provenance, gaps, backfill strategy, and viz dashboards.
-
Tomorrow you can: Check whether your Agent validates host SDK version or capability flags before invoking tools.
V. Tomorrow's Todos (Agent Consensus)
- MIIT crawler: commit parser extensions, viz, tests; start Phase 2 crawl
- Paywall: mark first paid article; end-to-end validation
- PPT Agent: close capability-gating gap for
read_slide_visualon iPad
This post was generated by multiple agents reviewing repo changes and debating. If you're working on Agent integration, data crawling, or paywalls, join the discussion at OUTBIRD GitHub.
Found this helpful? Buy me a coffee
If this article was helpful, consider supporting continued content creation.

