Build1 distinct publisher3 min readUpdated
A build wave shipped four Apify Actors with clean lints, valid schemas and green tests. All four were still running the scaffolder's placeholder, and one monetized listing had been billing customers.
The Engineer · Build desk

Compiled by The EngineerSomething wrong?How this is made
Every gate in that pipeline was reading something the scaffolder itself had written. The build counter flipped an Actor to "built" the moment `src/models.py` existed, and `models.py` is a file the scaffolder emits [8]. The input, output, dataset and manifest schema checks passed because the scaffolder writes valid schemas [7]. The linters and type checker passed because a placeholder is well-formed code [6]. The tests passed because they were written against the placeholder and asserted what the placeholder does [5]. One tool produced the artifact and the evidence, and the evidence agreed with itself.
That is how the board came to read 2 of 5 built with tests green when the delivered count was zero [9], and how the wave's real yield came out at four stubs from four attempts [3]. The only component that objected was the dataset schema, which refused the row shape the stub produced [2]. That check had been added for an unrelated reason, which the author calls luck rather than process, and notes that a more permissive schema would have passed a placeholder emitter straight through to the Store [10].
Which is roughly what happened to the fifth one. It validated input, charged the start fee, logged, and exited zero [12]. Eleven customer runs in thirty days, every one recorded SUCCEEDED [13]. On the success-rate dashboard that put it at 100 percent while the Actors under active triage sat between 69 and 89 percent [14], so the no-op led the fleet by at least eleven points [1]. A status-only metric will always rank it first, because the failure modes it measures are things that only happen to code that tries.
The gap in the account is worth reading closely. The team now also checks whether an Actor has any runs of their own; that one had none, its mandatory pre-publish QA had never executed, and all twelve of its runs belonged to customers [15]. Twelve total against eleven in the last thirty days leaves one run outside the window [4], which is to say the first paying customer arrived before the QA step that was supposed to gate the listing.
The fix is where the engineering actually is. Grepping for `placeholder` was rejected because working scrapers in the fleet talk about placeholders: a comment describing selectors as "not a placeholder hypothesis", a documented placeholder-slug URL pattern, a query string built with a `{query}` token [16]. The replacement walks the syntax tree and flags three shapes: a placeholder-keyed dict literal, a `run()` that yields a dict whose keys are not the Actor's declared row fields, or an explicit stub banner in the module docstring [17]. The middle rule is the one described as load-bearing, because it encodes the requirement itself and survives a future scaffolder that stops using the word [18]. The first draft walked every `return` in the module and flagged a dozen good Actors, since a helper returning a headers dict is structurally a dict literal coming out of the row module; narrowing it to yields inside `run()` fixed that [19]. The stated reason for the care: a gate that cries wolf gets switched off, which is worse than not having it [20].
The same class of defect showed up in billing. A trailing batch flush charged an event called `result` while the pricing manifest declared `result-row`, and Apify does not error on the mismatch, it logs an ignored-charge line [21]. Another output nobody was comparing against its own declaration.
Follow any of these and your For You feed starts watching them — no settings page required.
Ranked by verification strength, evidence, and original report placement.
A sweep of the whole fleet found one Actor that had shipped: a listing public for two weeks, monetized, taking real customer runs, whose entry point docstring read "*** SCAFFOLD-ONLY RUN - 0 dataset rows is the expected, correct outcome. ***".
That shipped Actor validated input, charged the start fee, logged, and exited zero.
It had eleven customer runs in thirty days, every one recorded as SUCCEEDED.
A build wave finished four scrapers in a day, every test was green, and not one of them scraped anything.
The first of the four deployed cleanly and died on its smoke run with apify_client.errors.ApifyApiError: Schema validation failed, raised at await Actor.push_data(batch); the team's own dataset schema refused the rows the scraper produced.
Running the scraper's entry point locally against the live target returned a single row: {"placeholder": true, "note": "src/scraper.py is a T01 scaffold stub - the real implementation lands in T02-T06", "search_terms": ["chanel"]}.
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
Detailed first-party artifacts, no external corroboration
The account is unusually concrete for a single post: a verbatim traceback, the exact placeholder row payload, the shipped Actor's docstring banner, the mismatched charge call against the manifest, and specific counts (30 tests, eleven of twelve customer runs, 100% versus 69-89%). All of it, however, comes from one dev.to post written by the team that both caused and fixed the problem, with no named Actor, no dashboard export and no second publisher to check any figure against.
Real production and billing footprint, but one team only
There is genuine deployed usage: Actors pushed to the Apify platform, a monetized public listing taking twelve customer runs, a 48-Actor internal audit of charge event names, and a rebuilt Cameo scraper released. All of it sits inside one vendor's fleet. Nothing indicates that the AST stub detector, the row-count-plus-status monitoring or the charged-event pinning test has been adopted, packaged or reused by anyone else.
Deflationary account, mildly understated implications
The post argues against its own dashboards rather than for a product, discloses that detection was luck rather than process, and closes with a narrow lesson about what a green suite certifies. Its most consequential facts - a monetized listing billing customers for zero rows while topping the health dashboard, and a silently ignored charge event - are stated flatly without pressing the governance implications or the customer-remediation question. The only inflationary element is the closing promotion of the rebuilt Cameo scraper, which is small relative to the self-critical body.
Vendor self-disclosure ending in a product pitch
The publisher sells Apify Actors and closes the post by introducing Cameo Talent Listings Scraper along with a pitch about handling retries, rotation and awkward status codes. Candid failure disclosure is itself a credibility-building marketing form, and every quantitative claim - test counts, run counts, success percentages, the isolation of the charge-name defect across 48 Actors - is supplied by the interested party with no audit trail. There is no sign of undisclosed sponsorship or third-party payment, which keeps this moderate rather than severe.
Coherent but single-sourced and unaudited
Internal consistency is high and the mechanisms described are technically plausible and independently reasonable (stubs pass tests written against stubs; status-only monitoring cannot see empty datasets; unknown charge event names are ignored). Confidence is nonetheless capped by one publisher, one first-party source, unnamed subjects, and remedies whose post-deployment effectiveness is argued rather than measured.
build
Force the tool call, then hand Lightsail a long-lived key1 distinct publisher
build
A cache hit is a quota refund: semantic caching with trigrams and no vector database1 distinct publisher
build
Stop timing your GraphQL tests and start counting loader calls1 distinct publisher
build
Agent memory rots by accumulation, and the missing primitive is a supersession key1 distinct publisher
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 24, 2026