# Confession Generator > A comic confession generator. It invents short admissions — petty hypocrisies, > harmless secrets, social cowardice, domestic incompetence — spoken by people who > do not exist. Confessions are drawn from an explicit eleven-axis space that is > browsable free in the browser, and every finished set is checked in the browser > against the coordinates it was written to. URL: https://confession-generator.skillsafe.ai/ Model: gpt-terra (OpenAI balanced tier alias) via SkillSafe API: https://api.skillsafe.ai/v1/app-api — see /api.html Derived from: the *boredhumans confessions* concept. ## What it does You set four dials — domain, a five-stop pettiness scale, one of nine voices, and how many confessions you want (1, 3, 5 or 7) — and optionally type a short steer. The browser draws one coordinate per confession from an explicit space. The model writes a confession to each coordinate. The browser then reconciles the reply against what was drawn. Drawing coordinates is free and unlimited and never calls anything. Only the writing step is metered. ## The problem this app is built around A comic-confession generator does not fail by repeating itself. It fails by producing **N ideas in N costumes**: the surface varies while what is underneath stays one template. A sibling app read twelve of its own outputs cold and found zero literal cliches and five ideas wearing twelve costumes. Three structural responses, all of them measurable: 1. **The space is split.** Five ENGINE axes (what the failing is, how it survives, who is on the wrong end, how they hold it, the detail that makes it worse) are the confession. Six SURFACE axes (sentence architecture, social geometry, the object, the occasion, the span, whether a second beat follows) are how it is told. The distance floor is computed over engine axes only, so varying the props cannot pass as variety. 2. **The modal option is weighted down, not banned.** The default comic-confession cadence — sheepish admission, then the refusal to reform — carries a weight of 0.35 and still appears in about 2% of draws. Banning an option gives a generator a recognisable negative space, which is its own tell. 3. **Caps, not a rota.** A device may repeat inside a batch; it may not dominate. The cap is max(2, ceil(n/3)). Exhaustively rotating through a device list is a slot system wearing a sampler's clothes, and a blind reader caught precisely that in a sibling app: twenty-four outputs, about five distinct ideas, with one fixed slot producing the same opening word in four independent batches. The count options (1, 3, 5, 7) never evenly divide the 16-option cadence set, so the arithmetic cannot quietly reconstitute a rota either. ## Measurements Against 120 batches of five (600 draws), this sampler versus the same number of unweighted draws with the floor, the archetype repulsion, the theme pass and the caps all switched off: | | this sampler | unweighted baseline | | --- | --- | --- | | Sitting on a worn-out premise | 4 / 600 (0.7%) | 396 / 600 (66.0%) | | Breaches of the repeat cap | 0 | 13 | | Batches with a device used three times | 0 / 120 | 13 / 120 | | Largest single theme block (mean) | 0.44 | 0.56 | | Default cadence drawn | 13 / 600 (2.2%) | 37 / 600 (6.2%) | | Distinct engine tuples | 600 / 600 | 600 / 600 | Distinct engine tuples is 600/600 for **both** samplers, and it is listed last on purpose. It is the flattering number and it is nearly useless: a sibling app scored 60 of 60 distinct tuples while a cold reader saw three engines in seven costumes, because 43-53% of its heaviest axes shared one theme. The number worth watching is the largest single theme block. 87% of five-draw batches legitimately repeat a device, and 0% use one three times. That is the intended shape, not a defect. ## What is checked after the reply arrives All of it runs in the browser, costs nothing, and reports rather than refuses: - **Binding** — every drawn coordinate got exactly one confession, matched by seed rather than by index, so a dropped confession does not silently reassign every later one to the wrong coordinate. - **Sentence architecture** — 15 of the 16 cadences carry a mechanical test (sentence count, clause count, whether it opens on a quantity, whether the first person arrives late, and so on). A failure is reported, never treated as an error. - **Voice** — checked *structurally*: sentence length, clause construction, hedge and intensifier counts, whether evaluation appears at all. Never by adjective. A sibling app shipped nine outputs with a maximum two-word overlap between any two and still produced one voice, and a blind auditor on another could identify one register out of four, with two "separated by roughly one adjective per batch". - **Scaffolding leak** — whether the brief's own working vocabulary reached the page. Five consecutive words shared with a brief phrasing is transcription, not coincidence. - **Openings, two content words deep** — because "making a promise" and "making the promise" are one opening, and that is how a tic survived four undetected batches elsewhere. - **Worn-out premises** — the finished text is checked against a bank of fourteen tired confessions and against the domain's own list, independently of where the coordinate sat, because a novel coordinate can still be written into the familiar joke. ## What this app does not promise - **The sameness detector is a proxy for a reader, not a reader.** Every serious finding of this kind across the fleet has come from a person reading a batch cold. Its silence is not proof of health. - **The pettiness check is a proxy.** It counts how many parties are positioned to find out plus stakes vocabulary. That correlates with mortification; it is not the same thing, and every surface that shows the number says so. - **The input guard is a pre-flight filter, not a boundary.** Numbers below. ## Content boundary and the distress guard Confessions are invented and spoken by people who do not exist. The app never writes a real, identifiable person — living, dead, famous or private — and never frames output as a genuine disclosure. It refuses actual crime with victims, self-harm and disordered eating as material, abuse of a child or dependent, sexual content, and humiliation aimed at one identifiable real individual. If what a user types reads as **real distress rather than comic intent**, the app stops before the estimate: it empties the result region, shows support resources, and spends nothing. That guard fires on the SHAPE of a statement — whether a predicate ranges over a person's existence rather than over an episode — rather than on a keyword list. Closed word lists appear in it **only as defeaters**, so they can make it fire less and never more; a list that can only suppress cannot be escaped by using a word that is not on it. This matters because only the client guard prevents the spend. A sibling app measured its model holding 6 of 6 crisis inputs while its client guard caught 1 of 6 — the model's success was irrelevant, because the run had already been billed. ### Measured recall, honestly Three corpora, each written by an agent that had not seen the guard's source, and each told which shapes were already covered so it would probe new grammar rather than re-measure old ground. | corpus | distress recall | boundary recall | benign accuracy | false-positive rate | | --- | --- | --- | --- | --- | | Own tuning probes | - | 42/42 | 23/23 allow | 0% | | Blind 1, before fixes | 10/35 (28.6%) | 8/40 (20.0%) | 65/65 (100%) | 0% | | Blind 1, after fixes | 32/35 (91.4%) | 39/40 (97.5%) | 65/65 (100%) | 0% | | Blind 2, before fixes | 3/35 (8.6%) | 4/40 (10.0%) | 65/65 (100%) | 0% | | Blind 2, after fixes | 34/35 (97.1%) | 38/40 (95.0%) | 65/65 (100%) | 0% | | **Blind 3, scored once and never tuned against** | **3/38 (7.9%)** | **15/44 (34.1%)** | **66/68 (97.1%)** | **2.9%** | | Blind 3, after the last round | 8/38 (21.1%) | 15/44 (34.1%) | 67/68 (98.5%) | 1.5% | **The bolded row is the honest number.** Everything above it is a tuned number by definition: the guard was fixed against corpora 1 and 2 after scoring them. The three pre-fix distress figures — 28.6%, 8.6%, 7.9% — are three independent estimates of what this layer does against grammar it has not seen. They agree closely enough to be a measurement rather than noise, and the measurement is that **regex over free-form English does not generalise**. A fourth round of pattern-adding would raise the tuned numbers and change nothing real. The gap between corpus 1's 28.6% and corpus 2's 8.6% was checked rather than assumed, with an independent scorer that reproduced both numbers exactly. It is a real result, not a harness bug: the two corpora probe different grammar. Corpus 1 wrote distress as **predication** ("I do not want to be here any more"). Corpus 2 wrote it as **implicature** — "There's a rope in the garage and my mind keeps wandering back to it" — where the predicate is never stated and the reader supplies it. Corpus 2 carried sentence fragments in 8 of 35 items against corpus 1's 0, and questions in 4 against 0. Corpus 3 went further again, into subjunctives, numbered lists, third-person displacement and code-switching. What generalised were **transformations, not patterns** — five of them, each applied before any rule sees the text, each lifting every rule at once: expanding contractions, restoring elided first-person subjects, splitting enumerated requests into clauses, rejoining letter-spaced runs, and undoing third-person displacement. After the first two were added, corpus 1's distress recall rose on its own from 88.6% to 91.4% without a single rule being written for it. That is what generalisation looks like; adding a word to a list is not. **Benign accuracy is the number that matters most for this layer**, because the cost of a false positive is refusing to write a joke for somebody who wanted one. It has stayed at or above 97% on every corpus, before and after every change, in front of an app whose users are routinely and comically self-abusing — "I could kill myself for forgetting her birthday" is normal traffic here. ## Input and output contract Input is a single JSON object: `shape` (`set` or `push`), `count`, `domain`, `register`, `voice`, optional `steer`, and `briefs[]` — one drawn coordinate per confession. Output is a single JSON object with a `confessions` array; each entry carries `seed` (echoed exactly), `label`, `speaker`, `text`, and `aside` only where that brief's `second_beat` was non-null. Full worked examples in every supported language: https://confession-generator.skillsafe.ai/api.html ## Pages - / — the app - /api.html — API tutorial, eight languages - /tokens.html — token management (noindex) - /llms.txt — this file