Build1 distinct publisher3 min readUpdated
appgen's README says an exhaustive sweep is why its 100% verification numbers are trustworthy. Its author now points out that none of the 810 cells contains English.
The Engineer · Build desk

Compiled by The EngineerSomething wrong?How this is made
The author of appgen, a deterministic sentence-to-application generator, published a post dismantling his own README, which states that a verification sweep covers "all 810 domain x feature x family cells" and that this "is why the 100% claims above are trustworthy" [2]. The arithmetic holds, but according to the author the sweep touches the user's sentence zero times, and the sentence is the whole interface [11][13].
What appgen does, on the author's account: you type something like "I want a support desk system with priorities, comments, search and closing tickets" and it writes a single dependency-free Python file, starts it on a private port, exercises every requested feature over real HTTP, and only then shows it to you [1]. No language model generates the code, and the run costs about 2 ms of CPU and no GPU [1][3]. The code sits in a private research repo, so there is nothing to inspect independently [4].
The sweep lives in experiments/028-relations/exhaustive.py and hangs on a six-line generator [5]. For each domain it yields an empty feature set, then each single feature, then the full set: nine configurations [6][7][8]. Ten domains gives 90 cells [6][7][1], and nine emitter families multiply that to 810 [9][2]. The author says he checked the arithmetic rather than trusting the README, and 810 is right [10].
The defect is not the number. A cell is a tuple of a dictionary key and a frozen set of strings; nothing in the generator produces English and nothing downstream of it consumes English, because the emitters are handed a schema and a feature set directly [11][12]. The sweep is candid about this at line 96 of sweep_project, where a comment reads "build_project parses a request; drive the emitters directly instead" [13]. That is defensible test design, and the author defends it: a sweep should test one thing [14]. What is not defensible is a README sentence that borrows the composer's 100% to vouch for the tool a user actually drives.
The component the user hits first is a hand-written keyword planner, measured separately in experiment 041, which was built to ask whether a learned model should replace it [15]. The harness is stricter than a random split: eight phrasing families are held out whole, and slot vocabularies are disjoint across the split, so nothing scores by memorising a phrase [16][17]. That is 146 training clauses and 32 test clauses per fold, eight folds, seven operations [18]. Re-running compare.py, the rules score 0.70, nearest-neighbour retrieval 0.48, and a hybrid 0.68, which is why the planner stayed hand-written [19][21][22][23].
Read the winning column as a user and 0.70 means roughly three requests in ten are read wrong on a phrasing the rules were not written for [3][24]. One of the seven operations is kind, which decides whether you get an HTML app, a JSON API or a CLI [25]. A misread there does not produce a failing test; it produces a passing test for the wrong artefact.
One wrinkle: the post describes the Naive Bayes score of 0.24 as "barely above" a most-common-class floor of 0.29, which is 0.05 below it [20][21][4]. Worth watching whether the per-operation breakdown, cut off in the material as published, shows kind among the weakest operations, and whether the README claim is rescoped or a sweep is added that starts at English rather than at a frozenset.
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.
appgen takes a typed sentence such as "I want a support desk system with priorities, comments, search and closing tickets", writes a single dependency-free Python file, starts it on a private port, exercises every feature requested over real HTTP, and only then shows it to the user; no language model does the generating.
A generation run takes about 2 ms of CPU and no GPU.
DOMAINS has 10 entries: blog, booking, contacts, events, expenses, inventory, library, recipes, support_desk, todo.
FEATURES has 7 entries: category, comments, delete, edit, search, stats, toggle.
Each domain contributes one empty feature set, seven single-feature sets and one full set, for 9 configurations per domain.
There are nine families of emitter: single-file unstyled, single-file styled, api, cli, project, relational, node_web, node_api, c_cli.
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.
Internally checkable, externally unverifiable
The post names files, line numbers and commands, reproduces the cells() generator, and its central arithmetic (10 x 9 x 9 = 810) is verifiable from the text alone. But every figure is self-reported from a private repository with no link, no artifact and no third-party replication, and the author's own numbers contain an unflagged inconsistency (0.24 called 'barely above' a 0.29 floor). The captured text is also truncated before its conclusion.
No adoption signal
The supplied source reports no release, download, deployment, user, customer, licence or pricing information; the code is in a private research repo with no link, and no third party is described as using or evaluating appgen. There is nothing to measure without inferring facts the source does not provide.
Audited artifact overstates; the post itself deflates
The overstatement sits in the artifact being audited: a README asserting that 810 cells are why '100%' is trustworthy, when no cell contains English and the parser every real request hits first is untouched by the sweep. The post itself pushes the other way - it discloses the gap, retracts its own scary reading of the 0.32 kind score after driving the tool end to end, and states plainly that an op-label metric is not a behaviour metric. Net gap is mildly positive rather than large: residual overstatement risk comes from unverifiable private-repo figures and an uncorrected 0.24-vs-0.29 characterisation, offset by unusually candid self-correction.
Self-published builder writing about his own tool
The author is the tool's builder publishing on a developer platform, an arrangement with an inherent promotional incentive and no disclosed external funding, sponsor or vendor relationship. That incentive is partly counteracted here: the post's purpose is to undercut its own README claim, and it withdraws a dramatic conclusion once end-to-end testing contradicted it. Working against verification, the underlying repo is private, so readers cannot audit the favourable claims either.
Single self-authored source, sound internal logic
Confidence is limited by structure rather than by sloppiness: one publisher, one source, one author, a private codebase, no adoption evidence and a truncated text. What raises it above low is that the load-bearing reasoning - the cell datatype, the 810 arithmetic, the line-96 exclusion, and the op-label-versus-behaviour distinction - is legible and self-consistent in the text as supplied.
build
Force the tool call, then hand Lightsail a long-lived key1 distinct publisher
build
Stop timing your GraphQL tests and start counting loader calls1 distinct publisher
build
Your 90% Cache Hit Ratio Is a Lagging Indicator. Alert on Cold Misses Per Key1 distinct publisher
build
Before you spend quota on an agent skill, make it pass an eval harness1 distinct publisher
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 16, 2026