awesome-content-repurpose · diff
git:20260915.93b7e83 to git:20260920.17a2b19
289 added, 308 removed. Audit A to A.
---
name: awesome-content-repurpose
- description: "Turns one existing text — a URL, a file, or pasted notes — into platform-native posts for every platform on one canonical table: source notes every claim traces back to and verifies, an interview for platforms, voice and length, an opener catalog and paragraph-shape rules that keep posts from reading as generated, hard character caps and a per-platform depth band each version is written to, a two-stage anti-slop audit, one dated file per platform in the format awesome-content-publisher reads. Use when asked to repurpose an article into posts, adapt a text for named platforms, or 'адаптируй статью под соцсети'. Do not use for a scheduled campaign from product sources (awesome-content-campaign), to publish (awesome-content-publisher), or to build the voice profile (awesome-content-voice)."
+ description: "Repurposes one source text, URL, file, guide, repository note or research memo into a folder of platform-native posts, one file per platform on the canonical table: a source-module map that keeps a guide a guide, an interview for output language, editorial idea, voice and emoji count, verified volatile facts with locked comparison peers, a set of campaign anchors (proof, task split, caveats, setup blocks) reused verbatim while every opener, closing and frame is written per platform, hard caps and depth bands, a counted audit, then one media question that attaches images or a video derived per platform. Use when asked to repurpose an article or guide into posts, adapt a text for named platforms, or 'адаптируй статью под соцсети'. Do not use for a scheduled campaign from product sources (awesome-content-campaign), to publish (awesome-content-publisher), or to build the voice profile (awesome-content-voice)."
license: MIT
metadata:
author: Khasky
- tags: ["content", "repurposing", "social-media", "writing", "publishing"]
+ tags: ["content", "repurposing", "social-media", "writing"]
documentation: "https://github.com/khasky/awesome-agent-skills/tree/main/skills/awesome-content-repurpose"
---
# Content Repurpose
- One text in, one post per platform out, each written to that platform's register rather than trimmed to its cap. Then the posts are filed, and publishing them is one more step the user chooses.
-
- The rule that makes this skill different from writing posts from scratch: the source is the boundary. A repurposed post may sharpen, cut and reframe, but it may not add a claim, a number or an implication the source does not carry, and it may not invert the source's point by compressing it. The text arrives settled — where it came from and whether it may be published are the user's business, decided before this runs.
+ One source in, one post family out: the same guide, the same numbers and the same judgment on every platform, each version shaped to its surface rather than trimmed from one essay.
- This skill owns the repurposing craft and orchestrates the rest. Two of its own reference files carry what every run is checked against, and both are read before a line is written:
+ Two rules make this skill different from writing posts from scratch:
- - `references/authored-style.md` — the register, as countable patterns: the seven opening shapes that work, the five that are banned, the rule that the chosen persona is present in the opening of every post rather than in half of them, the three product-as-subject shapes that are banned outright, the literal read a hook has to survive, the headline shapes that fail on sight, the ban on crowning a single favourite, the closing that hands the thread back instead of restating the post, the specifics first person has to be paid for with, the ASCII-only rule for diagrams, and the paragraph-shape rules that keep a post from turning into a stack of one-line fragments.
- - `references/platform-specs.md` — the output contract, the hard character caps, and the depth band each platform's version is written to.
- - `references/fidelity.md` — the source-notes format with its IDs and positions, the claims ledger, the checks made in a fresh context, the shape of a finding, the drift check that proves a wording fix changed nothing, and the rewrite budget.
- - `references/run-memory.md` — what persists between runs: the defaults, the rules learned from the user's corrections, the sources already run, the backlog of unused ideas, and what the user's best posts are allowed to teach.
+ - **The source is the boundary and the source's structure is the skeleton.** A tutorial stays a tutorial, a repository write-up stays about the repository, a benchmark stays about the measured result. The author's angle improves the material; it never turns it into a different article, and nothing is added that the source or a primary-source verification does not carry.
+ - **Anchors repeat, frames do not.** A run writes a small set of campaign anchors once (the proof, the task split, the caveats, the setup blocks) and reuses them word for word wherever they fit. Everything around them, the opener, the section order, the closing, the sentence that introduces a block, is written per platform and never repeated. A pack whose anchors are paraphrased thirty ways reads as a machine straining for variety; a pack whose frames are copied reads as one post pasted thirty times. Both are failures, and the split between the two layers is what prevents them. Creativity 2 and 3 loosen the repeat side of that split under the registered-variant rules in `references/creativity.md`, and tighten the echo side in the same step.
- Four files persist across runs in the runtime's scratch root, beside the per-run `repurpose/<slug>/` folders and never in the invocation directory: `repurpose/defaults.md` (the interview answers from the last run), `repurpose/platform-cache.md` (the last live platform check, dated), `repurpose/rules.md` (the rules learned from the user's corrections) and `repurpose/sources.md` (the sources already run), all described in `references/run-memory.md`. All four are the agent's own temporary files; when the runtime wipes them the run simply asks in full again.
+ A third rule arrived with the dial: **the same skeleton on two unrelated subjects is a defect the audit can count.** A run picks its structure from the source in front of it (`references/registers.md` for the register, the fingerprint in `references/creativity.md` for the choice among documented shapes), so two packs from two subjects differ before anyone tries to make them differ.
- It reuses the rest by reference rather than by restating:
+ Reference files, read when their phase is reached rather than up front:
- - `references/platforms.md` (ships with `awesome-content-campaign`) — the canonical slug table: target detail per platform, media requirements, and which genre file governs each.
- - `references/genre-micro-post.md`, `references/genre-long-article.md`, `references/genre-community-post.md` (same skill) — the register each genre demands.
- - `awesome-content-graphics` — the whole image stage when a post needs a picture and none exists: the look inputs, the offline HTML/CSS renders, the headline question and the pick gate. Nothing about making graphics is reimplemented here, including the chart craft it takes from `dataviz`.
- - `awesome-humanize-en`, `awesome-document-style`, `awesome-slop-audit` — loaded only under `--deep-audit`. The part of their catalogs that applies to a feed post is written out as the Phase 4 checklist, so an ordinary run reads nine lines instead of three skills.
- - `awesome-content-voice` — the author's voice, when a profile exists.
- - `awesome-content-publisher` — everything about publishing: bridge, login, ledger, pacing, read-back.
- - `awesome-translate-ru-en` — whenever the output language differs from the source, in either direction.
+ - `references/registers.md` - how to read the subject family from the source, and how each family sounds. Read at Phase 0, right after the source type.
+ - `references/creativity.md` - the creativity dial: what each level moves, the run fingerprint, the rhythm floors, the structure alternates, the anchor policy per level, and the floor no level lifts. Read at Phase 1, before the brief.
+ - `references/fidelity.md` - the evidence-note format, the module map, the claims and coverage ledgers, comparison-peer resolution, correction locality. Read at Phase 2.
+ - `references/platform-specs.md` - the canonical file set, hard caps, depth bands, the per-platform blueprint and layout targets, emoji and hashtag policy. Read at Phase 6.
+ - `references/authored-style.md` - the anchor set and its reuse rules, the opener and closing catalogs, text diagrams, the lexicon, emoji placement, the echo rules. Read at Phase 4, before the anchors are written.
+ - `references/run-memory.md` - what may persist between runs. Read only under `--use-memory`.
## Invocation
- ```
- /awesome-content-repurpose <url | file | pasted text> [--platforms <slug,slug>] [--publish] [--recheck] [--deep-audit]
+ ```text
+ /awesome-content-repurpose <url | file | pasted text> [--platforms <slug,slug>] [--language <lang>] [--idea <text>] [--voice <mode>] [--emoji <n|0|1-5>] [--creativity <0-3>] [--footer <text|none>] [--media images|video|none|<path or url>] [--use-memory]
```
- No source given → ask for one before anything else. `--publish` is a preference recorded in Phase 2, not a bypass of the publisher's own confirmation gate. `--recheck` forces the live platform check in Phase 3 without asking; `--deep-audit` loads the external humanity catalogs in Phase 4 instead of the inline checklist.
-
- ## Phase 1 — Read the source, write the source notes
-
- Get the text onto disk first. Working state never lands in the invocation directory — it goes to the agent's own scratch or session directory for this run (whatever the runtime provides: a session scratchpad, a temp path under the agent's home such as `~/.claude/`, or `TMPDIR`), in a `repurpose/<slug>/` folder there. The user asked for posts, not for a folder appearing in whatever repository they happened to be standing in. The same holds for every file a tool writes on the way — a screenshot, a generated helper script, a dump a browser tool takes a `filename` for: those paths resolve against the invocation directory unless they are absolute, so they are given absolute paths inside the working folder from the first call rather than moved afterwards. Only the final deliverable moves to a place the user names (Phase 6), and the run states both paths.
-
- - URL — a plain fetch first; a live browser when the page is a JS app that returns an empty shell, so rendered content is not silently missed. Driving a browser means driving one of the user's, so it is not a silent step: when the session exposes more than one browser bridge, ask which one before the first navigation and remember the answer for the run; either way, name the browser that was used and warn that it is busy while the read runs. A page that turns out to need a logged-in session is no longer a public read — run the full target gate in `references/browser-interaction.md` (ships with `awesome-content-publisher`) before touching it. Save the extracted text to `source/` inside the working folder.
- - File — read it directly; a folder gets an inventory first, then the prose.
- - Pasted text — save it to `source/` on arrival, like everything else. Long source text stays out of the conversation context.
- - Transcript, recording or talk — spoken text is extracted clean: fillers, false starts and repeated words removed, speaker labels kept only where who said it matters. A quotation from speech keeps every content word and marks a cut with an ellipsis. Whatever only worked in the room goes into the notes' Not transferable to text section with its position: a demo, a reference to something on screen, an audience moment. No post points at a thing its reader cannot see.
-
- Then fingerprint the source and look it up, with its URL, in `repurpose/sources.md`. A match is the first thing the Phase 2 screen shows (`references/run-memory.md`).
-
- Then write `source-notes.md` beside it, which every later phase is checked against. It opens with the source's paragraph count, and every fact-bearing line carries an ID and its position in the source, in the exact format `references/fidelity.md` fixes, because the gate reads it:
-
- - The point — one sentence: what this text argues or reports. Compression that contradicts this line is a defect, not an interpretation.
- - Supporting claims — one line each, in the source's own terms, each with its ID and position.
- - Numbers — verbatim, with the conditions the source attaches to them. A number without its condition is not repurposable.
- - Scope and hedges — who or what each finding covers, preview or beta status, the source's own `may` and `in our tests`, sample sizes. Compression turns a narrow finding into a general one more often than it does anything else, and this is what a sentence is narrowed back to.
- - Provenance — what this text actually is and where it came from: which release, which changelog, whose announcement, what date. Two sentences at most, and every post needs one of them, because a reader who does not know what is being discussed cannot use the rest. Record two things apart: the primary origin (the vendor, the paper, the model cards), which the posts may name, and the intermediary the user pasted (a list, a thread, a channel post, a translated article), which the notes describe and the posts never do. Its language, its item count and its layout stay in this file.
- - Quotable lines — 3 to 5 verbatim excerpts worth keeping intact, with their location.
- - Named things — people, products, versions, places the source names, spelled the way it spells them.
- - What surprised the reader — the counterintuitive part, which a source usually buries in the middle rather than leading with.
- - The honest exception — the one limit a reader would hit first. Every post's caveat comes from here; where the source names none, that is recorded, and the caveat is taken from verification or narrowed from Scope and hedges, never invented to fill the slot.
- - Candidate ideas — three, each a mechanism or a consequence resting on named IDs. The interview picks one; the other two become the run's backlog.
- - What the source does NOT say — the tempting adjacent claims a shorter version would drift into. This section exists because compression invents.
-
- A historical source stays historical. Where the text is a retrospective, the posts say so in their own words, placing the author's knowledge at the time it was written and stating plainly that this is not a current-state audit, and an old product rule is never rewritten into a present-tense fact.
-
- The link a post may carry is not automatically the link the source arrived on. A conversation with an assistant is a private artifact, so a share URL on an assistant's own domain never reaches a post: not in the body, not in frontmatter `links`, not as a "full thread" closer. The hosts this covers, and any other assistant's own domain that appears in a source: `chatgpt.com`, `chat.openai.com`, `claude.ai`, `gemini.google.com`, `aistudio.google.com`, `notebooklm.google.com`, `deepseek.com`, `chat.deepseek.com`, `grok.com`, `x.ai`, `copilot.microsoft.com`, `chat.mistral.ai`, `chat.qwen.ai`, `kimi.com`, `poe.com`, `perplexity.ai`, `hf.co/chat`, `you.com`, `phind.com`, `meta.ai`, `character.ai`. Three reasons, each sufficient: for most readers the URL does not open at all, a research transcript is the opposite of the author's own knowledge, and publishing a session is a decision the user never made. The URL stays inside `source-notes.md` as provenance and goes nowhere else.
-
- So the run looks for the link the post deserves, and the search is bounded: one query for what the text is actually about (the release note, the changelog entry, the documentation page, the repository, the vendor announcement, the original article), the best public result opened once, and it counts only if it carries the claim the post will make. Nothing public in that one pass → the post ships with no link and an empty `links`, which is honest. A second query, a guessed URL, or a fall back to the chat share is not.
-
- The point, the three candidate ideas, the notes and the proposed link are shown on the interview screen in Phase 2 rather than in a gate of their own, so the user answers everything in one round. Every gate in this skill goes through the structured-question UI: a gate written as a closing sentence the user must answer in prose reads as narration and gets passed over.
-
- ## Phase 2 — Interview
-
- One round, structured-question UI when available, custom answer always allowed. Where the UI caps a screen at four questions, a first run cannot literally be one screen, and "one round" then means the fewest full screens the answers fit on, planned before the first is sent: every screen carries four questions, the target detail each selected platform needs rides on the same screens as the settings, and no screen is spent on something a default already answers. Two round-trips are what a first run costs; a first run that took eight spent five of them on questions that could have shared a screen with the platform list, and one on a browser it did not need to open yet. Never open a browser mid-interview for a target the user can answer from memory: that question keeps its default-plus-escape-hatch shape, and only `show me my options` sends the run to the account, once the rest of the interview is settled.
-
- The round opens with the Phase 1 notes: the point in one line, the provenance, and the link the run proposes (or that none exists), with the options correct · the point is wrong, here is the right one · use this link instead · no link at all · stop. A second question on the same screen offers the three candidate ideas, each in one line with what it rests on, and a custom idea the user types; a custom idea is framing only, and where the source does not support it, the source wins. Where the notes carry too little for the long platforms, that is on the same screen: how many distinct claims the source supports, which of the selected platforms cannot be filled without padding, and the options write those short · drop them · write them anyway. When `repurpose/sources.md` shows this source was run before, that comes first of all, with the idea the earlier run used, whether its posts went out, and its unused backlog.
-
- Then the answers. When `repurpose/defaults.md` exists from an earlier run, the interview is one screen: the last run's answers summarised (platforms, every target detail, voice, language, shape, emoji, hashtags, closing questions, what happens after the files exist including any spread over days, and how many rules `repurpose/rules.md` carries, with an option to see them) and three options — same as last time (recommended) · change something · start from scratch. "Change something" re-asks only the items the user names; "start from scratch" runs the full interview below. With no defaults file the full interview runs once, and its answers are written to `repurpose/defaults.md` at the end of the round so the next run opens on the one screen. The file records answers, never source material: no notes, no text, no links from the source.
-
- The full interview, on a first run or a reset:
-
- 1. Platforms — the default is every row of the canonical table in `awesome-content-campaign`'s `references/platforms.md`, the single source both this skill and the publisher read; `references/platform-specs.md` carries the numbers for each of them and adds none of its own. The run asks whether the user wants all of them before it asks which ones. The realistic answer is "all", so the first question is a single one — write for the whole set, or trim it — with "all of them" the recommended option and the count stated as `All <n>`, with n counted off that table in this run rather than carried in this sentence, where it would go stale the first time a platform is added. Only when the user chooses to trim does the checkbox pass run, split across several questions because the question UI caps options per question, and phrased as removing rather than adding (`Untick anything you do not want`). This ordering exists because the UI has no pre-checked state to give: a bare checkbox list makes the common answer the most laborious one, a tick per platform to say "everything", which is the shape that gets abandoned halfway.
-
- No slug on that table is held back for a special request: a platform the user can be published to is a platform the interview offers, because a set the run quietly narrows is a set the user cannot choose from. What varies is the target detail each one needs, collected below.
-
- Never offer a shortlist, a bundle, a "recommended set", or a subset inferred from the source, the language, or what looks like a fit — narrowing the list is a decision the user did not delegate, and a platform missing from the question is a platform they cannot choose. Keep one open option for a platform the table does not carry.
-
- Then collect the target detail each selected platform requires, under the rule below. Two annotations, when the data exists: mark platforms where `publish-state/performance.md` shows the user's own median engagement, and mark platforms where the publisher's ledger already carries this source — repurposing into a feed that already has this piece is usually a mistake worth surfacing. When the performance file holds three or more posts for a platform, Phase 4 also takes their countable traits, never their wording (`references/run-memory.md`).
-
- A target question offers what the user actually has, and it is one question per platform. The Target column names a kind of thing (an instance, a community, a board, a squad), and the failure to avoid is filling that in with plausible names the run made up — three Mastodon instances the user has never heard of, three Lemmy servers when their account lives on one, a menu of Pinterest boards chosen from general knowledge. A user cannot answer "which of these three" when nothing in the question says why those three or which is theirs, and the honest reading of such a menu is that the run does not know either.
-
- So, in this order:
-
- - The default plus an escape hatch, and a third option that opens the account. The question offers the value from `defaults.md` or the table's canonical default, `another one, I will type it`, and `show me my options`. Only that third answer sends the run to the browser: then the real list is one read away and it is read — the communities their own instance carries, the squads they have joined, the boards on their profile, the client they are signed into — through `awesome-content-publisher`'s `references/browser-interaction.md`, as a read and never a write, and the options come back ranked by fit to this post's topic with the number that makes each choosable. Reading the account on every run, unasked, is a browser session and a target gate spent on a question the user usually answers from memory in two words.
- - Never a menu of guesses. `mastodon.social` and `another server` is a real choice; `mastodon.social · fosstodon.org · hachyderm.io` is a quiz.
- - Never re-ask what is already settled. When the user has said `lemmy.world`, the instance is decided and the only open question is which community there. Re-offering `lemmy.ml` and `programming.dev` reads as the run having forgotten, and it invites an answer that contradicts the account they actually have.
- - One platform per question. A question headed `lemmy target and daily-dev target?` forces one answer to cover two unrelated decisions, so neither can be answered properly. Give each its own, and say in the question what the detail is for.
- - A hazard is not a question. Where a platform has a dangerous path and a safe one, take the safe one by default and say so in one line; do not turn the danger into a gate the user clears on every run. `substack` is the worked example: publishing an Article from the personal profile sends no email at all, so the run takes that path and never opens with "publishing also sends email that cannot be recalled, which publication?" — a question that is unanswerable for an account with no publication, and that reappears every run because nothing about it can ever be settled. Ask only when the user wants the irreversible path.
- 2. Voice — first person, the author reporting their own experience with the thing (default) · first person plural · neutral third person, for a source the author has no standing to have used · a voice profile from `awesome-content-voice` (path; `voice/*.md` is where to look) · a style guide from `awesome-style-mimic`. Whichever answer comes back binds every post in the run and the opening of every post, short platforms included; it is not a preference the writing stage gets to average out.
- 3. Output language — same as the source (default) · another language. A different language means the posts are written in it by someone who thinks in it, never carried across word by word; Phase 4 holds the rules, and for the Russian and English pair they come from `awesome-translate-ru-en`, applied in whichever direction this run needs.
- 4. Length and shape per platform — native to the platform (default) · deliberately short · thread or multi-part where the platform supports it and the content is genuinely sequential. Under the long shape `threads` can also take a text attachment of up to 10,000 characters beside the post, asked as its own yes or no; it is neither indexed nor federated, so the post still carries the point.
- 5. Emoji, on a screen of its own: `1-5 emoji` (recommended) · `no emoji` · a custom answer where the user types the count or the format. The first option is the placement rules of Phase 4, which put one or two on a short post, an update or a status and up to five across a long read; the second turns them off everywhere, and the human-signal rule then falls back on a question or an aside.
- 6. Hashtags, on a screen of their own: `best practice (x-y)` (recommended), with x and y filled from the hashtag table as the lowest and highest norm among the selected platforms · `no hashtags` · a custom answer where the user types the count or the format. Best practice applies each platform's own norm, and a platform whose composer refuses tags carries none whatever the answer; `no hashtags` is passed to the gate as `--no-hashtags`.
- 7. Closing questions — rooms only (recommended): `reddit`, `lemmy`, `devto`, `hashnode` and `daily-dev` hand the thread back and every other post ends on its content · also on `x`, `bluesky`, `threads` and `linkedin`, for a user who will answer the replies. The answer binds the closing section of `references/authored-style.md`.
- 8. What happens after the files exist — publish now · publish at a time the user names · files only. Whatever the answer, the files are written first. With a named time, a follow-up offers to spread the platforms over a number of days the user names, so someone who follows the author in three places does not meet the same post three times in an hour; each file then carries its own `scheduled` time.
-
- One image, and it goes everywhere the platform takes one. Ask for media once, with the cheap answers first: I will supply one (path) · no image, drop the media-required platforms · generate a set with `awesome-content-graphics` · a carousel for `linkedin` and `instagram` (below). Generation is the explicit third choice, never the default, because it opens a whole rendering stage and a second gate. On that yes, ask that skill's look question in the same round, with its three labels verbatim and nothing else: `Random (based on the post topic, tone, purpose)` · `Reference (URL, text description, or another image)` · the free-text entry for custom info. Never a mood, never `same look as last run` (the look is not a default `repurpose/defaults.md` carries), never the look bundled with the set size into one option; the reference itself is collected in a follow-up. Asked later, it interrupts the run for nothing.
-
- No image supplied means a whole set and a second gate, never one graphic chosen by this skill. The post's title travels with the facts: it is the first line of the headline pool, and every generated headline is measured against it, so the picture and the post tell one story. The set size is the user's answer there (10, 50, 100 or a number they type), and the variant rules, the spread of the set, the spread across the source's different facts, the gallery and the pick gate all belong to `awesome-content-graphics` and are not restated here; this phase hands it the facts from `source-notes.md`, that file's "What the source does NOT say" section as the boundary, `repurpose/<slug>/media/` as the output folder, the look inputs, the target ratio from Phase 3, and the output language the interview settled, so the words on the graphic match the posts and the user is not asked the same question twice. Then it takes back the chosen render, its alt text and the `graphics.md` receipt. That skill not installed → say so, and offer the same two options: the user supplies an image, or the media-required platforms are dropped. What belongs to this phase is the sequencing: the interview's media answer only settles *whether* a graphic is generated. Which one ships is a separate question, and it is never asked before the set is in front of the user: the gallery is opened on their machine and the message that asks carries its absolute path and the folder's, so a number in the question points at a picture they have already seen. A pick question sent while the gallery is still a path nobody opened is the defect this sequencing exists to prevent — the run has to wait for the open to happen, not mention the file afterwards. No post file declares an attachment until they have answered it. A user who supplied their own image never sees this gate. Whatever image the run ends up with — supplied or generated — is then attached to every selected platform whose Media column is `optional` as well as every platform where it is `required`, not only to the ones that cannot post without it. A run that renders a graphic for `instagram` and ships text-only posts everywhere else has done the work and thrown most of it away; the same picture earns its keep on `linkedin`, `x`, `mastodon`, `tumblr`, `patreon` and the rest, and on the article platforms it becomes the cover image.
-
- Three exceptions, and only these: a platform whose Media column says media is not supported (`hackernews`) gets nothing; a platform whose requirement is video cannot be satisfied by a still, so it is dropped rather than given the graphic; and a post whose own text argues against the picture — the user says so, or the image contradicts what that version says — carries no attachment, with the reason recorded in `campaign.md`. Every attachment carries alt text describing what the image shows, the same text on every platform.
-
- A carousel is the opt-in fourth answer and the one format that is a sequence rather than a picture: five to eight slides, a hook slide stating the post's point, one sourced fact per slide, and a closing slide naming the source. The slide plan goes into `campaign.md` first, each fact slide pointing at the note ID it shows, so the fidelity pass can check the slides like any other text. `awesome-content-graphics` renders them from that plan as one set; tell it the renders are a sequence, so the pick is an ordered choice of the slides that ship rather than one winner. Assemble the ordered slides into the single PDF `linkedin` takes as a document post — one page per slide, at the slide's own size, any transparency flattened onto white (frontmatter `document`); `instagram` takes the same slides as its `attachments` list, in order; every other platform gets the first slide as its single image. Every slide carries its own alt text. Engagement data favours these formats on both platforms, and it is correlation, which is why a carousel is offered and never chosen for the user.
-
- ## Phase 3 — Platform check
-
- The structural facts are already in the tables and do not expire: the hard caps are the floor in `references/platform-specs.md`, the hashtag norms and media requirements are in `awesome-content-campaign`'s `references/platforms.md`, editor types do not move. Live research may only lower a cap, never raise it; a number that cannot be verified stays at the table value, and a number that looks higher is treated as unverified. So this phase is off by default and the user turns it on.
-
- Read `repurpose/platform-cache.md` and ask one structured question: *The last live format check for the selected platforms was YYYY-MM-DD (or: has never run). Check all selected platforms again?* — no, use the last references (recommended) · yes, check all of them · check only these. `--recheck` answers yes without asking. On "no", the whole phase is skipped and the manifest records the cache date that was relied on.
-
- Two things run regardless of the answer, because they are about the user's specific target rather than the platform, and they change without notice: the rules of the community actually being posted to — the subreddit, the Lemmy community, the Facebook group, the daily.dev squad, a Hashnode or Medium publication's submission rules — and a community that forbids link-drops or self-promotion is reported with the option to pick another target; and anything the user's account tier changes where the cache does not already record the tier.
-
- Which hosts answer a plain fetch is settled knowledge, and the run does not rediscover it by retrying. Reddit refuses the fetcher on `www.reddit.com` and `old.reddit.com` alike, `about/rules.json` included, so a subreddit's rules are read only through the user's browser (asked once, with the bridge named) or confirmed by the user in words; a run that could do neither records the rules as not read and says so in `campaign.md`. X returns 403 to the fetcher, so a thread's text is taken from search snippets and marked as such. GitHub pages and raw files answer the fetch tool but not `curl` from this shell. Lemmy's instance API answers everything: `/api/v3/search?q=<topic>&type_=Communities&listing_type=Local` ranks communities with subscriber and post counts, and `/api/v3/community?name=<name>` returns the sidebar and its rules. A Lemmy community the user names is checked against those counts before it is accepted, because a room with a handful of subscribers and no posts is a room nobody will read, and the user is offered the live rooms on the same instance instead.
-
- When the check does run, it verifies the volatile facts only (a cap that may have moved, a media format, a hashtag norm the table marks *verify live*), writes each entry to `repurpose/platform-cache.md` with its platform, values, source URL and checked-on date, and reports what changed against the tables. A cache entry records the page that was actually opened — a value recalled from memory, taken off a search-result snippet, or written from a URL that did not load is not a source: record that it could not be reached and treat the table value as still binding.
-
- ## Phase 4 — Write
-
- Load four things before writing: `references/authored-style.md`, `references/platform-specs.md`, the genre file for each selected platform, and `repurpose/rules.md` when it exists. A rule there outranks a default of the style file where the two disagree, because it is the user's own decision about their posts (`references/run-memory.md`). The register belongs to the genre, the shapes and the numbers belong to the two reference files, and this phase adds the repurposing craft on top.
+ Defaults: every platform on the canonical table; language, idea, voice, emoji, creativity and footer asked every run; one folder of `.md` files and nothing else. A value supplied in the invocation is the user's answer to that question and it is not asked again. No source given: ask for one before anything else.
- Each platform version is composed to its own band from the start. The band is in `platform-specs.md`, and it is a writing instruction rather than a validation threshold: a `buymeacoffee` unit is drafted as a two-to-five-thousand-character mini-blog, a `peerlist` unit as four hundred characters, and neither is derived by cutting the other. Writing one long version and trimming it per platform at publication time is the single most expensive mistake this skill makes, because the cut always falls on the tail: the pricing, the closing line, the link. When a version comes out over its cap, it is rewritten to the band, never amputated.
+ **The run folder is `repurpose/<slug>-<YYYYmmdd-HHMMSS>/` under the agent's scratch area.** The slug is the source kebab-cased to at most six words - its title, its filename without the extension, or its first heading when it was pasted - and the stamp is the moment this run started. Working state (`source/`, notes, brief, anchors, plans, ledgers) goes there, and so does the finished posts folder (Phase 10).
- The band is a shape and not a quota, and the material decides how much of it is used. Before a long version is drafted, count what this post actually has: the distinct claims, numbers and quotations from `source-notes.md` it will carry. One of them per 250 characters of prose is the honest density (`platform-specs.md`), so eight usable claims do not become a five-thousand-character essay, and a post that runs out of material finishes there, under its band, with the reason in `campaign.md`. Nothing is stretched to reach a floor: no paragraph restating the one above it, no section whose content is its own title, no caveat in three places, no mechanism explained twice at two depths, no closing that summarises the body. Where the source cannot fill the long-form platforms at all, the user hears it on the Phase 2 screen and chooses between shorter posts and fewer platforms; the run never quietly writes filler instead of asking.
+ The stamp is what makes a second run on the same source a second run. Two invocations of one article produce the same slug, and a slug alone puts them on one path, so the second run overwrites a set the user may still be reading or publishing from. An existing run folder is therefore never written into and never cleared to make room: take the next free stamp and name the folder this run used. The memory files of `references/run-memory.md` stay in the `repurpose/` root, outside every run folder, because they are what one run leaves for the next.
- The opener comes from the catalog in `authored-style.md`, and the run varies the shape across platforms rather than reaching for the same one every time. Three openers are drafted for the unit in three different shapes, each put through the five checks in that file, and the best survivor leads; the other two go into `campaign.md` and the report, so the user can swap the hook without a rewrite. On a platform with a fold (`platform-specs.md`), the opener's job is done above it. No post opens on an abstract category doing something a category cannot do, and none opens on a vague event with a vague time attached.
+ Nothing is written beside the source file or into the invocation directory. A source is a thing the user pointed at, not a workspace they offered: it may sit in a repository, a synced drive, a downloads folder or a read-only mount, and a run that leaves a folder of its own next to it has decided where the user keeps their work.
- Paragraphs are paragraphs. Never three one-line paragraphs in a row, and in anything over 1500 characters the one-line share stays well under half. A stack of short lines is the loudest structural tell these posts carry and it survives every other pass, because each individual line reads fine.
+ This skill never asks about publication time, timezone, cadence, target accounts or queues, and never writes `scheduled`, `timezone`, `status`, `target`, `queue` or `cadence`. Those belong to `awesome-content-publisher`. It does ask about media, once, after every post is written (Phase 11), and it writes the `attachments` key that the publisher reads; the pictures themselves are made by `awesome-content-graphics`, which owns its own gates.
- One post, adapted per platform — not one post per platform. The run picks ONE idea out of the source and writes it once; every selected platform then gets that same post adjusted for its mechanics: trimmed to the verified cap, hashtags in that platform's norm, the title-and-body split where the platform has one, the hook above the fold where the feed cuts. A reader following the author on three of them should recognise the same post three times, not discover three unrelated ones. Producing a different extract per platform is the failure this rule exists to prevent: it multiplies the work, dilutes the message, and leaves nothing that can be pointed at as "the post".
+ ## Phase 0 - Read the whole source and classify it
- The user asks for more than one idea → that is more than one run, or an explicit list of units decided together up front and stated in the manifest. It is never a side effect of having several platforms selected.
+ Save the complete text to `source/` and read all of it before deciding anything. A URL that returns an empty shell is read through a browser; a folder gets an inventory first, then the prose. A link the source arrived on is provenance, not a post link: an assistant's own share URL (`chatgpt.com`, `claude.ai`, `gemini.google.com`, `chat.deepseek.com` and the like) never reaches a post.
- Choosing the idea: compression is selection, not summarizing. A 2,000-word article becomes one post about its sharpest single point: not a synopsis, not a table of contents, not a numbered set of takeaways unless the source genuinely is a set of takeaways. The reader who never opens the original should still get something whole. The choice is made on the Phase 2 screen from the three candidates in the notes; the two not taken are the backlog, never a second idea in this run.
+ Classify the source into exactly one primary type by its information architecture, not its topic: `guide/tutorial` (commands, configuration, several setup paths), `project/repository`, `announcement/update`, `benchmark/report`, `essay/opinion`, `retrospective/historical`. A source with six setup sections and commands is a guide even when its most interesting implication is cost.
- What makes an idea worth the post. Prefer the mechanism, the consequence, the thing that changes how someone works, and skip the inventory. A list of version numbers, a table of names, a feature roll-call carries no insight even though it is factual and easy to extract: it tells a reader what exists, never what it means for them. A sentence that explains how something behaves and what that behaviour costs the reader is a post; a sentence of version floors per operating system is a footnote to one. Where a number genuinely matters, it belongs inside the mechanism it constrains, not as the subject.
+ Then read `references/registers.md` and decide the **subject family** by what the source does rather than by what it is about: `dev-howto`, `eng-concept`, `incident`, `research-data`, `release`, `career-industry`, `business-money`, `design-ux`, `personal-essay`, `learning`. The type and the family are independent, and the pair is what stops a pack sounding like the last pack: the type keeps a tutorial a tutorial, the family decides whether it sounds like a runbook or like an essay. Where two families fit, take the one the title and the first section carry and name the runner-up in the report.
- Verify the claims the idea actually uses, and only those. Verification runs here, after the idea is chosen, because the ladder is expensive and a source carries far more claims than one post will ship. For each claim, number or command the unit will carry that is current, version-sensitive, priced, benchmarked, install-related, support-matrix-related or counted (stars, downloads, rank): the official site, the official repository, the official documentation, the paper or model card, the vendor's own announcement, in that order, stopping at the first that settles it. Reputable secondary sources only when none of those carries it. A claim the unit does not use is not verified, however tempting.
+ Record `Source type`, `Source family`, `Primary subject`, `Source promise` (what a reader receives when the source is faithfully repurposed), `Source language`, `Historical/current`. Then a preliminary outline from the supplied text only: major sections, the primary audience, the numbers already in the source, the caveats already in the source, and the source's own recommendation when it has one.
- Where the source is stronger than the evidence, keep the interesting idea and correct the claim: narrow an absolute to what the evidence supports and name the caveat that bites, and where the source credits a capability to the wrong layer, give it to the layer that actually does the work. A claim that cannot be verified either goes with the hedge the evidence supports or does not go.
+ From that outline, write exactly 3 candidate editorial ideas, one sentence each, describing a reader takeaway rather than a format:
- Numbers that came from the project rather than from an independent test say so: `the project reports`, `the paper reports`, `the README shows`. A project benchmark presented as a universal guarantee is a fabrication with a citation attached. Fast-moving counts are date-stamped in the notes and written evergreen in the post (`200k+`, `when it landed`), because a star count is stale within the week. An install command is verified or it is not published: never invented, and the official quick-start path is preferred over a source build unless the source is specifically about building from source.
+ 1. **Source-central** - the most direct expression of the source promise. For a guide this already carries the practical reason the source gives (cost, privacy, portability). Marked `Recommended` unless another idea is materially better supported.
+ 2. **Practical/decision** - the strongest supported reason a reader would use, avoid or compare the subject.
+ 3. **Alternate supported** - a genuinely different emphasis that still preserves the source type and its modules.
- Every post carries its provenance. One clause, early, saying what is being talked about and where it came from: the release, the changelog, the announcement. Without it a post about a mechanism reads as an opinion out of nowhere, and the reader cannot tell whether it is news, a manual, or a thought.
+ An idea changes emphasis, titles, openers and which module gets the extra paragraph. It never changes the source type, the module set, the verified facts, or whether the run's proof point appears (Phase 4).
- Provenance names the thing's own origin: the vendor, the release, the paper, the model card. It never names the text the user pasted in. A compilation, a channel post, a thread, a translated article or a list someone else assembled is the run's input, not the post's subject, and the post does not describe it: not its language, not how many items it held, not how it was sorted, not who put it together. Those are facts about a document the reader will never see. The post stands on its own. Claims are stated as what they are, with their conditions, and attributed to the primary source where attribution matters. One light mention of how the author ran into the topic is allowed when it earns its place, worded fresh like every other sentence, and then the intermediary leaves the post: it never becomes a character that says, files, suggests or closes on anything. Where the pasted text is the only support for a claim, the condition carries the honesty, not the intermediary's name.
+ ## Phase 1 - Interview: language, idea, voice, emoji, creativity, footer
- Numbers follow the same logic, and `references/authored-style.md` carries the rule: a number that is the payoff is written in digits, because digits are what an eye in a feed catches, and a number that only counts the items in the source's container is not written at all. Every count of a technical thing is digits as well, however incidental it looks (`3 agents`, never `three agents`), and what stays spelled out is the language that counts nothing technical: idioms, an ordinal inside a phrase, and a deliberately vague quantity.
+ Six questions, one screen where the UI allows several structured questions (four on the first screen, then creativity and the footer), otherwise in this order. Nothing is drafted, not a title, not a hashtag, until all six are answered. Never recover an answer from an older run.
- Write it as the author's own experience, because that is what a feed post is. Someone saw the thing, tried it, and is reporting back: ran into it, spent an evening on it, changed how they set something up, would not bother with half of it. First person, an opinion, a recommendation, a thing that annoyed them. A post that reads as a neutral summary of someone else's announcement has no reason to exist on a personal feed.
+ 1. **Output language** - `English` (Recommended) · `<detected source language> - same as the source` · `Other, type it`. Option 2 names the detected language; for an English source it reads `English - source language`. The answer binds every body and metadata title. Code, commands, identifiers, model names, URLs and paths stay exact. No `language` frontmatter key. Where the answer is English, the pack is written in one variant of it: American by default, and another only where the user named one or the voice profile fixes one. A pack whose LinkedIn post says `optimise` and whose Medium post says `optimize` was written by two hands; `awesome-humanize-en/references/spelling-variants.md` carries the families and the exclusions; without that skill, the one-variant rule named here is the whole check.
+ 2. **Editorial idea** - the 3 ideas from Phase 0, the first marked `Recommended`, plus `Other - describe it`. A custom idea the source cannot support is said so before drafting, with a narrower supported reading offered.
+ 3. **Voice** - `First person` (Recommended for a personal feed) · `First person plural` · `Neutral third person` · `Voice profile from awesome-content-voice (path)` · `Style guide from awesome-style-mimic (path)`. A profile or guide is read before drafting. First person is editorial stance, never invented hands-on experience.
+ 4. **Emoji** - `1-5` (Recommended) · `0` · `type a number`. Under `1-5` each post draws its own count at random from 1 to 5 and places them where an emoji underlines the meaning of the sentence it lands on; a typed number is the count per post; `0` turns them off everywhere. Placement rules and the two platform exceptions are in `references/authored-style.md`.
+ 5. **Creativity** - `1 - Normal` (Recommended) · `0 - Default` · `2 - Medium` · `3 - High`. The dial decides how much of the pack's shape and phrasing the run chooses for itself, and `references/creativity.md` is where each level is defined. In the question itself the levels read as what the user will see:
- That applies to every post in the run and to the top of every post, not to a majority of them. The persona the interview settled is a property of the batch: under `first-person`, every post has the author in it, and the author arrives in the first two paragraphs rather than in paragraph eight after the mechanism has been explained by nobody. Phase 5's script measures exactly that, because it is the rule this skill broke most often: a run whose short platforms open with the product as the subject has published vendor copy under a personal name, and the shortest posts are where it happens, since that is where the author looks like the first thing worth cutting. The author is the last thing worth cutting. Cut a fact instead.
+ - `0 - Default`: every rule as written. The run still varies, because the structure it picks comes from this source rather than from habit, so two subjects do not land on one shape.
+ - `1 - Normal`: sentences and paragraphs move the way a person's do, the prose around the anchors speaks plainly, and part of the pack takes a different shape from the default.
+ - `2 - Medium`: the subject family leads the structure, the repeated sentences carry two or three registered wordings instead of one, and openers may be written rather than chosen.
+ - `3 - High`: the pack is composed the way a writer composes, from the material rather than from the template, with the facts, the numbers, the caps and the caveats exactly as strict as at 0.
- The product is never the grammatical subject of the post's own claim, and neither is a feature list. No capability roll-call, no support matrix, no stack of bare bullets standing in for sentences. `references/authored-style.md` carries the three banned shapes and the swap test that catches them: if the product's name could be replaced by a competitor's and the post would still be true, nobody wrote it.
+ Whatever the answer, the floor in `references/creativity.md` section 2 holds: no invented experience, no fabricated specifics, no softened caveat, no changed number, no re-voiced command. A higher level buys a freer shape, never a freer fact.
- Then read the hook literally before anything else is checked. It is read once, at speed, by someone who knows nothing, so a first line that is only defensible three paragraphs later is a defect however true it is. The failure this skill has actually shipped is a hook that praises a property which, read cold, is a defect: the point underneath is real and the reader leaves with its opposite. Where a hook rests on a word that reads negative out of context (`slow`, `smaller`, `less accurate`, `more expensive`), either the reason travels in the same sentence or the word goes.
+ 6. **Footer** - `Yes, add a footer to every post` · `No` (Recommended when the user has not asked for one). On `Yes` a follow-up collects the footer text verbatim, several lines allowed, typically a follow-me line with handles. The text is appended byte for byte after the link line and before the tag line, separated from each by one blank line, on the platforms that take it. Verbatim means verbatim: the ASCII sweep, the dash rule and the punctuation cleanup all read it and none of them rewrites it, so a hyphen the user typed stays a hyphen and the run never turns it into a dash. Its own lines stay contiguous, which is what makes it one block rather than three paragraphs; it is exempt from the echo and emoji checks and never carries a frontmatter key.
- Then the headline, which is read alone and gets its own rules in `references/authored-style.md`: it names the subject and states the point in one clause, and it never explains why something is good, announces what `we just got`, runs a product roll-call, bolts a qualifier on after the point has landed, or lets a product name read as a quantity. A title that needs a second sentence is a title plus the first line of the post.
+ A follow-me block is self-promotion, so it ships only where the author owns the surface. Three cases, and `references/platform-specs.md` carries the per-platform list:
- Nothing is crowned. A declared favourite, a best or a go-to is a ranking a reader cannot check and cannot disagree with, so the description of what the thing does replaces it, and membership among several things the author keeps is the ceiling where the enthusiasm genuinely belongs in the sentence.
+ - **ships** on the author's own blog, channel, profile or supporter page;
+ - **never ships** into a room somebody else moderates or where the platform's own guidance reads a promotional block as spam: `reddit`, `lemmy`, `hackernews`, `quora`, `imgur`, and any post whose `target` names a subreddit, a community, a group, a Space, a squad or a Flickr group, whatever the platform's default;
+ - **skipped for budget** on the hard caps, where the anchors and the link already fill the cap.
- The first person is paid for with specifics. A post that carries an opinion and no number, command, version, name or quotation is a paraphrase with a pronoun in front of it, and the reader can tell. Every first-person post lands at least a couple of checkable details taken from the source and the Phase 4 verification: the number with its condition, the exact command, the flag, the limit that bites, the line the documentation actually uses. Depth is the same material, read further: what the mechanism is, what it costs, where it breaks, what was surprising when the author looked. The boundary does not move, though, and it is the one from the fidelity rule above: specifics come from the source or from verification, never from invention.
+ The report names every platform that shipped without it and why. The user can override a `never` only by saying so for that platform by name, and the run states that the platform's own rules read it as promotion.
- The ending does one of two jobs. On a surface that is a room (`reddit`, `lemmy`, and usually `devto`, `hashnode` and `daily-dev`) it hands the thread back with a question the author actually wants answered, specific to the post, never a call to action wearing a question mark. Everywhere else it lands the argument the facts made. What it never does is restate the post in general terms: a small-thing-big-effect pair of sentences, a maturity-stage label or one hedge set against another is derivable by anyone who read to that point, and it is the closing this skill produces most often when it has run out of things to say.
+ The six answers are recorded as `Output language`, `Selected idea`, `Voice`, `Emoji`, `Creativity`, `Footer` and bind every file in the run. With the level known, compute the run fingerprint from the source as `references/creativity.md` section 3 defines it, record it beside the level, and use it for every choice among documented shapes from Phase 6 onward.
- One diagram is allowed where the shape is the point, and it is ASCII: hyphens, pipes, plus signs, angle brackets, slashes, equals signs and spaces, never box-drawing glyphs or Unicode arrows, because those render as tofu or misalign on somebody else's font and a broken diagram is worse than none.
+ ## Phase 2 - Evidence notes and the source-module map
- The frame is invented on purpose; the substance never is. Allowed: having read it, tried it, set it up this way, preferred one option, given up on another, expected something else. Forbidden: invented outcomes and measurements, a build time cut by a number, a bug caught, a team convinced, a client saved, any result the source does not carry. The Phase 5 fidelity pass reads first-person framing as framing and any specific result inside it as a fabrication.
+ Read `references/fidelity.md`. Write `source-notes.md` with the evidence lines it defines: `[C#]` claims, `[N#]` numbers with their conditions, `[S#]` scope and hedges, `[Q#]` quotations, `[E#]` named entities, later `[V#]` verified facts, `[X#]` corrections and `[D#]` derivations. Every `[V]` and `[X]` line carries a propagation label: `core`, `local`, `long-only` or `omit-short`; `local` is the default.
- No calendar dates, in any language. An audit stamp on the author's own reading, an as-of qualifier with a month, a dated opening line: each is the loudest machine tell a post can carry, because nobody stamps their own writing with an audit date. Recency is a relative word: yesterday, last week, the other day, recently, a few days ago, soon. The single date allowed to survive is one that is the subject itself, a deadline or an event day the reader has to show up for. A date attached to the author's act of reading, checking or verifying is never written, in the body, in a graphic, in alt text, or in a title. The frontmatter `scheduled` field is machinery, not prose, and is the one place a date belongs.
+ Then the module map `[M#]`, which is what keeps the output recognisably the source. For a guide the modules are its real sections and paths, each with a role: `primary-path` (at most 2: the routes the source explains first and most fully), `secondary-path`, `decision-axis`, `caveat`, `troubleshooting`, `auxiliary-detail`. Each module records its portable takeaway (one decision-useful sentence that survives on a hard-cap post), its medium details, its deep details (raw rates, exact windows, policy wording, alias history, full config), its representation in the source (prose, list, steps, code/config, table) and the evidence IDs behind it. Record the source's representation inventory: how many code/config blocks, semantic lists, tables and ordered procedures it has.
- Cut the specification. Version floors, per-OS build numbers, tier matrices and requirement tables are what release notes are for, and a person writing about an update says roughly what changed and how recently, in one relative phrase rather than a number. Where a constraint genuinely decides whether the reader can use the thing at all, it gets one plain clause and never a matrix; a long-form platform may carry one line more, still as prose. Whatever number does survive keeps the condition `source-notes.md` recorded.
+ A module being required means its portable takeaway travels broadly. It never means its deep details do: exact time windows, jurisdiction and storage wording, retired names and alias history, and the long diagnostic block are `long-only` even when the source states them plainly. They appear on at most 2 files, the deepest surfaces, inside the module they belong to, and nowhere else. Exact hours belong to that budget too: a conditions sentence names the condition (peak or off-peak, input against output) without the clock times.
- A public repository's price, licence and signup are never written. It is free to read, it asks for no account and its licence is permissive: the reader assumed all three before they clicked, and the clause otherwise lands in front of the link on every post in the run. The one exception is a post whose news is one of those three, and there the headline says so (`references/authored-style.md`, "Access boilerplate").
+ For the other source types the modules follow the blueprints in `references/platform-specs.md` section 5.
- How technical each version gets is its own axis, set by the technical-depth table in `platform-specs.md`: concept, command, snippet or code. The topic can raise a version one level and never lowers it below the platform's own; the level decides what kind of material goes in, and the band decides how much of it.
+ ## Phase 3 - Verify current facts without writing a second source
- Energy is set by the genre, and it is read before writing rather than after. A micro-post opens on the hook and carries its emoji where that platform's natives use them; a community post opens on the problem and stays plain; a long article earns its first line. Where the genre supports it a post is allowed to sound like someone who found something good: an opener that promises a payoff, a sharp line, the question the reader already has. Still banned everywhere: emoji as bullets, hype closers, and a loud label such as "PRO TIP" stamped on a post that carries no tip.
+ Verify what is volatile or operational and what the source itself claims: prices and rates, model names and tiers, install and config commands, endpoints, temporary routing or fallback states, the privacy or retention statement when the source raises privacy, the repository state when a claim depends on it. Primary sources in this order: official documentation, official repository, official API page or model card, official announcement; a reputable secondary source only when none of those settles it.
- No em dash in a post. Zero, not "sparingly". The `—` character (and its long siblings `–` and `―`) is the single most recognisable machine fingerprint in a feed, and hand-set typography is not what a person types into a composer anyway. Every one of them becomes a full stop, a comma, a colon, or a pair of parentheses, and the sentence is usually better for it. This covers the body, the title, hashtag lines, alt text, and any words on a graphic. Two exceptions and no others: a verbatim quotation that carries one (prefer quoting a different line), and text inside a code block or a command. A hyphen inside a compound word, a flag or a slug is not a dash and stays.
+ The budget: verify what the source claims, correct what is stale, add only the minimum external facts a source-requested comparison needs. Do not introduce a theme because official documentation contains it. For every externally added factual point a long version keeps at least two source-origin points, corrections of stale claims exempt.
- Emoji are part of how these platforms are written, so use them, and place them the way a person does. A writer does not decorate a post evenly. They punctuate it: the emoji lands right after the phrase that earned a reaction, and the choice reports what the reaction was. 🤯 after the number nobody expected, 🧐 next to the caveat, 🤑 on the cost, 😅 on the part that went wrong. Put it at the end of that sentence or open the post with it, and the reader feels a person reacting rather than a template being filled.
+ **Correction locality.** A correction repairs the source where the stale statement occurs: the correct name goes into every code block silently, and the sentence explaining what changed appears once, in the relevant setup section, on the deepest surfaces only. A correction that changes the reader's decision (a tier that no longer exists as a separate option, a path that no longer works) is `core`: it travels to every surface that carries the decision, as one sentence, and may carry an `as of <date>` qualifier because the state is temporary. A correction that changes no decision (a retired alias, a renamed variable) is never mentioned on a feed post at all.
- The budget is 0 to 5 for a whole text, scaled to its length, and the exact count matters less than the spacing. A micro-post carries none or one. A medium feed post carries one or two. A long article carries three to five across the whole piece, and it is allowed to go several paragraphs with none. Two emoji inside the same paragraph, or a pair a line apart, reads as decoration however good each one is on its own; keep real distance between them.
+ **Comparative economics.** When the source keeps an existing client and routes it to another provider, discusses price, and names competing or default provider families anywhere (recommendation, escalation path, comparison), a provider-substitution comparison is mandatory and an internal cheap-tier-versus-premium-tier table does not satisfy it. Resolve the peers once, before any post is drafted, by the rule in `references/fidelity.md`: the exact model the source names; else the exact family or tier; else, when only a provider or product brand is named, the **standard rung** of that provider's current flagship family. Number the family's rungs from the top of its own pricing page: rung 1 is the premium tier, rung 2 the standard general-purpose tier, rung 3 and below the small, mini or nano tiers. The headline peer is rung 2 (rung 1 only when the family has just two rungs), and when the source names a tier of one family (its standard tier by name), that name fixes the rung for every family in the comparison. Both peers sit at the same rung, and the brief records each family's ladder with the rung chosen. A client's current default model, a preview, a reasoning-only, a specialist or a product-bound model is never the peer, however easy it is to find and however much the client would bill it. Ambiguous after official verification: omit that peer. Up to two provider families as headline peers; each family's premium rung may appear as an extra line inside `proof-full` only, never in a compact proof.
- On a piece with headings, pick ONE surface and stay on it. Either the emoji live in the prose, three to five across the article, or one sits at the end of every heading down the whole outline. Never both surfaces in one piece, and never a subset of the headings: two decorated out of six is the pattern a reader clocks immediately, because it looks like whoever wrote it stopped caring after the second section. If the last heading has no emoji that honestly fits, that is the signal to use the prose surface instead and leave every heading bare. The article's own title sits outside the choice and may carry one either way. The check is countable: headings with an emoji must equal 0 or all of them.
+ Compare like units only (API against API, never against a fixed subscription), use cache-miss input plus output unless the source's workload is explicitly cache-heavy, compute the minimum and maximum ratio across the peak and off-peak and input and output combinations, round to a readable range, record each ratio as `[D#]`, and keep one range per peer: two peers with different ranges are never merged into one phrase. Distinguish token cost from completed-task cost in one clause where the long form has room.
- Restraint still applies: never as bullet markers, never one per line, never a row of three, never in place of a word the sentence needs, and never on a platform whose natives do not use them (the genre file and the Phase 3 research decide that). The interview's emoji answer overrides this default in both directions, and a custom count the user typed replaces the budget above.
+ ## Phase 4 - Editorial brief and campaign anchors
- Write it in the English people speak. The register is a competent person talking, so the vocabulary stays where speech is. Literary and rare words are the tell that something reached for a synonym instead of a word: `duller`, `says it outright`, `thus`, `hence`, `myriad`, `plethora`, `albeit`, `bespoke`, `salient`, `wherein`, `heretofore`, `deliberately`. Write `more boring`, `says it plainly`, `so`, `many`, `on purpose`. The test is spoken, not written: would you say this word out loud to a colleague? No → replace it. Technical precision is untouched by this — `worktree`, `merge conflict` and `file lock` are the words for those things and stay.
+ Read `references/authored-style.md`. Write `editorial-brief.md` with exactly: `Source type`, `Source family`, `Primary subject`, `Source promise`, `Source language`, `Output language`, `Selected idea`, `Voice`, `Emoji`, `Creativity`, `Fingerprint`, `Primary paths`, `Secondary paths`, `Core frame`, `Decision axis`, `Core proof point`, `Task split`, `Main caveat`, `Current corrections`, `Comparison set`, `Title spine`, `Hashtag pool`, `Frontmatter links`, `Body anchor link`, `Representation inventory`.
- Every post has a person in it. A run that produces four flat declarative sentences and stops has written a machine report, whatever the facts are. Somewhere in each post there is a reaction: the emoji where the surprise lands, the question the reader already has, a short fragment, an aside, an exclamation on the part that went wrong. One human signal per post is the floor, and it is checked in Phase 5. The exceptions are narrow and named: a platform whose natives write flat (`hackernews`), and an interview answer that turned emoji off — and even then a question or a wry half-line still belongs there, because flat register is not the same as nobody being home.
+ - **Core frame** for a guide is `what the reader keeps + what layer changes + why they would change it`. The guide remains the body; the why is a layer on top.
+ - **Decision axis** is the practical reason the setup is worth doing: cost, privacy, latency, portability, or whatever the source rests its recommendation on.
+ - **Core proof point** is the one concrete result that proves the decision axis. When the source's recommendation rests on cost and a comparison was triggered, it is the verified cross-provider ratio bundle, one range per peer. It appears on every platform, in the rendering the class allows, whatever idea the user selected; the idea changes what surrounds it.
+ - **Task split** names 5-8 concrete task types that belong on the cheap or default path (repository exploration, tests, docs, boilerplate, routine refactors, CI fixes, subagent loops, whatever the source and the domain support) and 4-6 cases that belong on the stronger path (ambiguous architecture, hard debugging, security review, risky migrations, final review of critical changes). Generic words such as `repetitive work` do not satisfy it. The escalation target is the frontier model family the source names for the final check (`a frontier <family A>/<family B> model`), never the subject's own premium tier: that tier is an intermediate rung of the routing block, and a split that escalates to it misstates the source's recommendation.
+ - **Main caveat** is the one limit a reader hits first, as one practical sentence: what not to send, what breaks, what it costs.
+ - **Title spine** is the set of ingredients every title composes from (primary subject, primary clients, task, practical reason); never a reusable string.
+ - **Hashtag pool** is one ordered set of 3-5 tags for the run: the subject, the primary clients by the short name people tag them with, and one category tag chosen by what people actually search on for the topic, checked live in this run rather than assumed (for AI-assisted coding tools the larger community tags `VibeCoding`, and `AICoding` is the weaker choice). Every platform takes an ordered subset.
+ - **Frontmatter links** are 1-3 reader-facing official URLs chosen once, and the same set goes on every file (Phase 5).
- Name what a tool is the first time the post mentions it. A paragraph that compares products by bare name only works for a reader already inside the ecosystem and tells everyone else nothing. The first mention carries a short identifying clause: what kind of thing it is, who makes it where that matters, and, where it decides whether the reader can try it, how it is switched on (the flag, the setting, the plan). This applies to every platform and every length; on the shortest posts it is the reason to name one tool instead of three.
+ Then write `anchors.md`, the sentences and blocks that are reused across the pack. The full set and the wording rules are in `references/authored-style.md`; the run writes at least these, each once, verified once. At creativity 2 each prose anchor also carries 2 or 3 registered variants, written here, verified against the same evidence line, and assigned to whole presentation classes; at creativity 3 the prose anchors are recorded as fact sets that every post writes in its own words. The `setup-` blocks, the config blocks and every command stay one string at every level:
- One hashtag set for the whole run, trimmed per platform, never re-invented. The tags come from the unit's subject once, then each platform gets the share its norm allows: the fuller block where hashtags are the discovery mechanism (`mastodon`, `instagram`, `tumblr`'s tag field), one or two on `x` and never more (more measurably costs reach there), none where they read as noise (`hackernews`, community rooms, `reddit`). Trimming drops whole tags off the end. A tag is never cut mid-word to fit a cap, and no post ends on half a hashtag. A platform whose post file has an empty `hashtags` list because nobody thought about it is a defect, not a decision.
+ ```text
+ proof-micro one sentence with the subject, each peer's own range, the basis hard caps
+ proof-compact one sentence: the reason, the basis, each peer's range in bold, the conditions feeds, community
+ proof-full the raw rates by condition, the peers' rates, the resulting ranges, the
+ conditions sentence, the like-for-like sentence, the two task lists, the
+ non-ranking sentence, the current-correction sentence when there is one mini-blogs, articles
+ split the task split as one sentence pair under the selected voice; as two lists in proof-full
+ split-micro one voiced sentence: routine or high-volume work named by 2-3 tasks on the cheap path, then hard or critical work escalated to a frontier <family> model
+ scope the like-for-like sentence (API against API, not against a subscription)
+ caveat the main caveat as one practical sentence naming 3-5 concrete things not to do
+ setup-<path> the minimal verified block per primary path: only what makes it run plus the launch line the source shows, and no line the source or the official page does not carry
+ paths the path inventory, as a fenced text block on long forms and as
+ `<Subject> also works behind <A>, <B>, <C> and local <D>.` on feeds and hard caps
+ model the mental model as a fenced text diagram (the thing kept = A, the thing changed = B)
+ gotcha the troubleshooting kernel: symptom line, the config block, the restart line
+ ```
- A tag of more than one word is written in CamelCase wherever the tag lives in the body, because a screen reader reads a lower-case compound as one unpronounceable word. The platforms that lower-case every tag themselves (`devto`, `daily-dev`) and the tag fields are exempt.
+ A `proof-full` for a guide whose source rests on cost has the shape the deep surfaces expect: the subject's rates in a fenced text block by condition, the peers' rates in a second block, the resulting per-peer ranges in a third, then the conditions sentence (the conditions named, no clock times), the like-for-like sentence, the cheap-path task list, the escalation list under the selected voice, one sentence refusing to rank the models universally, and the decision-changing correction if there is one. Every long version carries this section verbatim under its own literal heading, and it runs about 1,100-1,400 characters.
- The link belongs to the sentence that points at it. Where a post refers the reader to the thing, the announcement or the documentation, the URL follows on that same line after a colon or a space, never on a line of its own with a blank line above it. A URL floating between two paragraphs is the shape of a post assembled out of blocks, and a reader scanning a feed sees a naked link rather than a reason to click. The exception is a platform whose composer wants the URL alone to build its preview card, and that comes from the Phase 3 research rather than from habit. Anywhere else, a blank line between prose and its own link is a defect: the closing sentence carries the URL inline.
+ The angle-selection priority is fixed: preserve the source promise and modules, preserve the source's strongest practical implication, add why and when judgment, correct stale facts, then compress for the platform. A derived insight never outranks source centrality.
- And a URL never goes in parentheses. A link shoved into the middle of a clause reads as a footnote marker and breaks the sentence in half. The sentence makes its point, then hands over the link at its end.
+ ## Phase 5 - Links
- The post lands without its link. Delete the URL and the sentence pointing at it, and the point is still there; a closing whose only words point at the link without naming what is behind it fails that test.
+ Frontmatter carries 1-3 official reader-facing links chosen once for the run: the primary path's page, the second equally central path's page, and one pricing or benchmark page when the comparison rests on it. The same set goes on every file. A project post normally carries only the repository. Setup-script download URLs and raw API bases used inside code are never frontmatter links.
- On a platform whose editor does not linkify text, the link is applied, not typed. A pasted URL in a rich editor publishes as dead characters — `medium`, `substack`, `tumblr` and `telegraph` all need the words selected and the editor's own link control used on them. The post file still carries the plain URL; making it a link is the composer step, and Phase 5 checks the published page rather than the file.
+ **A URL inside a command is not a link and must never be written as bare text.** Platforms that autolink rewrite every URL they find, and they do not stop at the ones meant for the reader: LinkedIn published `$env:ANTHROPIC_BASE_URL="https://api.deepseek.com/anthropic"` as `$env:ANTHROPIC_BASE_URL="https://lnkd.in/<hash>"`, so the command a reader copies is broken, and Minds did the same to two setup lines in the same pack. The composer cannot prevent it and an edit re-applies it, so the defence is here, in the file: every command line lives in a fenced block, every inline flag, path, env var and dotted token (`CLAUDE.md`, `api.deepseek.com`) is a code span, and nothing shaped like a URL is ever left bare except the one body anchor below. A file that ships a command as plain prose has handed the publisher a defect it cannot fix.
- No trademark word carrying its ordinary meaning. A common noun that is also a large company's name stops reading as the noun the moment it lands in a feed: `slack` for spare capacity, `stripe`, `square`, `notion`, `discord`, `prime`, `oracle`, `meta`, `swift`, `zoom`, `teams`, `windows`. The reader sees the company, the sentence bends around it, and on a post about software the misread is instant. Write the ordinary synonym instead — head start, margin, band, idea, disagreement — and keep the word only where the post genuinely is about that company. This covers the body, the title, alt text, hashtags and any words on a graphic.
+ **LinkedIn rewrites every URL it finds, so a LinkedIn post carries no command that contains one.** The shortener replaces the address inside a fenced block as readily as one in prose — a published post shipped `$env:ANTHROPIC_BASE_URL="https://lnkd.in/<hash>"`, which is the command the reader is meant to copy, wrong on the page, and an edit re-applies the rewrite. The platform has no code span and no code block, so nothing protects it. On this one platform, name the setting in prose (`point ANTHROPIC_BASE_URL at the provider's Anthropic-compatible endpoint`) and let the article-length files carry the literal line; a `linkedin` file that still contains a URL inside a command is a defect the audit catches, not something the publisher can repair.
- Distinctions that collapse under compression, and must not. Each pair below reads as a shorter version of the same claim and is a different claim: `can run` against `runs fast`; context capacity against reliable recall; a VRAM requirement against total system memory; official support against community compatibility; open-weight against free to use; model size against active parameters per token; local-first against fully offline; no cloud storage against no server involvement; an agent skill against a native model capability. Technical credibility outranks keeping a viral headline intact: where the headline needs one of these collapsed to work, the headline changes.
+ That rule has a cost the plan must carry: the plain-text platforms render no code at all, so the fence disappears and the bare command returns. For a feed post whose band is too short for a fenced block anyway, do not include a command whose correctness depends on a URL — name the setting and let the article-length posts carry the command. The blueprint's code allowance per platform is the place that decision is recorded, not an afterthought at publish time.
- The shape a post about a tool takes, adapted to the platform's depth rather than forced whole into every one: the hook, what the thing is, why it matters, the concrete headline result, how it works, the caveat that matters most, who it is for, and the link or quick start. A short platform carries three of those, a long article carries all of them. The recurring framing that earns its place: the headline sounds like magic, the architecture is more interesting because it is not magic at all, then the actual mechanism.
+ Alignment is the same kind of promise a composer may not keep. Multi-space columns (`Flash vs Claude Sonnet 5 ~7-17x cheaper`) collapse to single spaces in any plain HTML composer — VK ships them collapsed — so a comparison whose meaning lives in the alignment must either sit in a fenced block on a platform that renders one, or be written so it reads correctly as ordinary prose.
- Every post carries the caveat. Not a hedge and not a disclaimer, the one limit a reader would hit first: what it costs, what it does not do, where it breaks. A post with a result and no caveat is marketing copy, and it is the shape a reader has learned to discount.
+ A tilde pair inside one block is read as strikethrough by the markdown-aware paste rules several rich editors run, and the approximation sign is how it happens. `~7-17x cheaper` and `~7-20x cheaper` are innocent on their own; flattened into one block by a composer with no `<pre>` node, they become a matched pair and everything between them publishes struck through — the two ratios, the model names and the line break that separated them. Keep the two ratios in separate blocks in the source (one line each, never joined into a prose sentence), or write the comparison without the sign (`about 7-17x cheaper`). One tilde alone in a block is safe; two are a pair waiting for a composer to close them.
- Rules that hold across every platform:
+ The first URL in the body becomes the link-preview card on plain-text platforms, and it is not always the one that should. Bastyon built its card from `https://api.deepseek.com/anthropic` — a URL that exists only inside a command — because that is the first one the body contains, and nothing in the composer selects which. Where a post's band is plain text and it carries both a command URL and the body anchor, the anchor has to come first or the card is wrong. That is a writing decision, recorded in the plan, and the publisher cannot repair it.
- - Numbers keep the conditions `source-notes.md` recorded. A benchmark without its machine, a percentage without its base, a claim without its scope is not a shorter version — it is a different claim.
- - Quoted lines stay verbatim, inside quotation marks. A paraphrase presented as a quotation is a fabrication.
- - The source's own terms and spellings survive; renaming its concepts to something punchier is how a repurposed post stops being about the source.
- - Nothing from the "What the source does NOT say" section reaches a post.
- - Threads only where the content is sequential, and each part must survive being read alone — the platform will show it alone. Before a thread is drafted its plan goes into `campaign.md`: one line per part with what that part has to do and the note IDs it rests on, so the fidelity pass can check it part by part.
- - Tags with their own field in the composer never appear in the body. The article platforms (`devto`, `hashnode`, `hackernoon`, `medium`) and `tumblr` take tags in an input of their own, so the post file carries them as a `tags` frontmatter list and the prose ends on prose. A line of bare words under the last paragraph (`ai machine-learning video news`) is a tag dump that publishes as literal text, and it is the tell that a feed post's hashtag habit was applied to a platform that does not work that way. Inline `#hashtags` stay in the body only where the platform's own natives write them there.
- - No invented idiom. A phrase shaped like a saying that is not one is machine phrasing: it reaches for the rhythm of a colloquialism without any colloquialism behind it. Write what happened in ordinary words, the way it would be said out loud to a colleague. When a phrase cannot be found in speech, it does not belong in a feed post.
- - Voice per the profile when there is one, including the habits its *Personal tics* section protects; those are exempt from the Phase 5 slop pass.
- - The link is the one Phase 1 settled on, or none at all. An assistant's own domain never appears, and no post closes on a research transcript.
+ A bare URL alone on its own line is a link card on the block editors, and the card eats the paragraph after it. Tumblr converted the closing anchor line into a rich card on the next `Enter` and consumed the empty block that followed, so the tag line went missing without a word of warning. Keeping the anchor as the **last** line of the body, with nothing after it but the tag line the publisher can re-add deliberately, costs nothing and removes the failure.
- ### The author's own angle
+ The **body anchor link** is one short official URL a reader can click from a feed post, usually the documentation root; feeds carry exactly one, near the close, as a bare URL on its own line before the tag line. Deep articles and mini-blogs may carry contextual links inside sentences and may close on a short labelled list: the official pages of the primary paths, the subject's pricing page, and one pricing page per comparison peer, since a reader checking the ratio needs both sides of it. The list carries one entry for **every** primary path the title or the body names, so a post whose title names two clients and whose list carries one has lost a link the reader was promised. The frontmatter set and the body's list agree on which paths are represented, and a path in the frontmatter that the body's list skips is a finding, not a trim. A frontmatter link never satisfies the visible-link rule.
- Before the unit is cleaned and long before it fans out, the run does the one thing that separates a first-person post from a summary with a pronoun: it works on the material. A unit that restates the project's own numbers, however accurately, has an author in name only, and the reader can tell because nothing in it needed the author to exist. The step is written into the unit as its own paragraph or two, and `references/authored-style.md` ("The author's own angle") carries the full rule.
+ ## Phase 6 - Platform plan and variation plan
- What the step produces, at least one of and usually two:
+ Read `references/platform-specs.md`. The file set is every row of the canonical table (or the requested subset), the bands are writing targets (draft toward 92-106% of `Aim`), the hard caps are absolute, and the blueprint table is each platform's **default** shape: visible H1 or not, coverage mode, code allowance, section order. What the creativity level may do to that default is the alternates table in `references/creativity.md` section 6, and which alternate this run takes is the fingerprint's decision, not a preference.
- - Arithmetic the source did not do, from the source's own numbers: a total against an active count, a size on disk against a peak in memory, a rate against a price. The sum is shown in the sentence, and it lands in `source-notes.md` as a `[D]` line with the IDs it was computed from, so the gate grounds the result (`references/fidelity.md`).
- - A reading of what a published metric counts and leaves out, stated as the author's reading with the source's wording beside it.
- - A comparison against a public fact verified in this phase, never a recalled one.
- - The question the source leaves open, and the author's reasoning about it, marked as reasoning.
- - A check made inside the material at hand: a line in the repository, a footnote on a card, two of the project's pages disagreeing.
+ Write `platform-plan.md`, one row per platform: target characters, H1, primary and secondary paths, anchors carried, proof rendering, representation targets, body link, closing shape. Then `variation-plan.md`, one row per platform: opener move, where the author first enters, title move, closing move, emoji count drawn for that post, and the structure moves applied with the fingerprint index that chose them. Both are internal.
- The boundary does not move: a measurement the author did not make, a benchmark not run, an outcome on a machine the author does not own is a fabrication, and the fidelity pass reads it as one. The frame is the other half of the same step, and it is welcome: a sentence of the author's own history with the subject, what they have bought, kept, replaced or given up on, carrying no number and no claim about the thing. It is often the best opener a post has, and it is never evidence.
+ The plans carry the level's own requirements as rows the audit can read back: the rhythm floor each file is written to, the structure moves it took, and, at level 2 and up, which anchor variant each presentation class carries. A plan that records no move at any level is a plan that decided nothing, which is the failure this dial exists to prevent.
- Two consequences for the wording. The author's effort lands on the project, the repository, the release or the model, never on a document: an evening spent with the README, a table saved from the model card, a verdict about what a file does or does not settle, all review a file the reader did not come for, and the gate counts both the effort verb with a document as its object and a document named more often than once per 1200 characters. A document is named to attribute one number, once, and then it leaves. And semicolons are split into sentences or joined with a comma where the grammar takes it: none on a short post, one per 1500 characters at most on a long one, counted by the gate.
+ The variation plan is bound by the catalogs in `references/authored-style.md`, with the register in `references/registers.md` steering the choice at level 1 and leading it at levels 2 and 3:
- ### The unit is cleaned before it fans out
+ - at least 5 opener moves in a pack of 12 or more platforms, no move on more than 25% of it, exact openers unique, the mechanism sentence (how the integration works on the wire) never an opener on more than 2 platforms;
+ - under first person about 10-25% of posts open on the author; elsewhere the author enters between 20% and 65% of the body, never only in the last line;
+ - at least 4 closing shapes, none on more than 40% of the pack, the recommendation-stance closing on at most 6 of a full pack, no non-anchor closing sentence in more than 2 posts;
+ - titles composed from the spine: unique strings, at least 4 title moves, no 4-word prefix on more than 25% of the pack, the subject in every title, no mechanism noun or abstraction as the title's centre.
- Write the unit once, whole, as a single text. Then run the humanity pass on that one text, before any platform adaptation touches it. A tell copied into ten files gets fixed ten times and usually only in nine.
+ Per level, on top of those bounds: at 0 the pack takes one structure alternate and one section-order variant, both by fingerprint; at 1 up to a third of the files take an alternate; at 2 every class is planned from the register with no two files in a class sharing a section order; at 3 the plan is built from the module map and records the blueprint only as the fallback it departed from. At every level no file takes more than two moves and no two files take the same combination.
- What runs is this checklist, inline, against the one text. It is the part of four external catalogs that applies to a feed post, written out here so the run does not load the catalogs themselves — a mirror of `awesome-humanize-en`'s `references/lexicon.md`, which owns the vocabulary and is what an entry is added to first; `--deep-audit` loads them (`awesome-document-style` Pass 1 and Pass 3, `awesome-humanize-en`'s structure pass and vocabulary tiers, `awesome-slop-audit`'s marker catalog) on top of this list, for a piece the user wants read harder than usual.
+ ## Phase 7 - Write
- - Chatbot residue: citation markers, `utm_source=` parameters on any surviving link, visible placeholders, zero-width characters, a chat-UI leftover such as a "Sources:" block.
- - Filler: adverbs that add no fact (`truly`, `really`, `very`, `actually` outside a contrast), `it is important to note`, `it is worth mentioning`, `in conclusion`, `overall`, sentence-initial `Furthermore` / `Moreover`.
- - Inflation: `not only X but also Y`, forced groups of three, a vague positive ending, an opener that stamps a summary on what follows, a closing line that restates the opening.
- - Contrast frames as the default shape: `not X, but Y`, `it is less about X than Y`, `the real question is not X`. One per post at most (one per 2500 characters on a long read), and never as the opener; the gate counts them.
- - The list rhythm: an emoji or a bold lead on every bullet, bullets that all start with the same word, a list where prose would carry it.
- - Em dashes: zero, counted by search, in body, title, hashtags, alt text and graphics alike.
- - Vocabulary: the literary word list in `references/authored-style.md` and the hype list beside it, searched as words rather than judged by feel. The test is spoken: would you say it out loud to a colleague.
- - Restatement: a point made twice in different words, the second time usually opening with `In other words` or `Put simply`.
- - Structure tells: an outline showing through as a heading per source section, a run of rhetorical questions, a stance announced (`I would argue`) rather than taken.
- - What a scrub leaves behind: a one-word question standing in for a reveal, a run of negations landing on one word of relief, an empty announcement of honesty, a hedge the source never had, a staccato run cut out of one sentence. `references/authored-style.md` describes them and the gate counts the first three.
- - Over-used words in a cluster: three or more of the gate's marker words in one paragraph fail, however ordinary each is alone.
- - An intensified comparative with nothing measured under it: it becomes the number, or says it was one run.
+ Compose every version to its own band and blueprint from the anchors and the module map. Never write one essay and trim it thirty times, and never write thirty unrelated angles. The shapes below are the level-0 defaults, and the moves the plan took under `references/creativity.md` section 6 change the order and the entry point inside them without changing what a class covers, what it caps, or how many links it carries. The shapes, by class:
- Then read it out loud. Uniform sentence length, every line engineered to land, no ordinary sentence anywhere: that text was scrubbed rather than written, and one plain observation goes back in.
+ - **Hard caps** (`x`, `bluesky`, `threads`, `mastodon`, `peerlist`, `truthsocial`, `pinterest`, `pixelfed`): a stance or the subject in one line, `proof-micro`, `split-micro`, on name-all surfaces one "also covers" line naming the other paths, the body anchor link. The proof is never cut to make room for a mechanism sentence.
+ - **Feeds** (professional, visual, `minds`, `telegram`, `vk-wall`): opener, the primary `setup-` block where the class allows code, the `model` diagram or the `paths` block, the other paths in one sentence, `proof-compact`, `split`, `scope`, one troubleshooting sentence when the source has a gotcha, `caveat`, the link, the tag line where the platform uses one. Several short complete paragraphs, not two dense ones.
+ - **Community** (`facebook-wall`, `reddit`, `lemmy`, `hackernews`, `quora`): a question or a direct answer first, the proof in the class rendering, the split as short lists where the surface renders them, the paths in one sentence, `scope`, `caveat`, links, and a closing question only this post could ask (not on `hackernews` or `quora`, which end on the content).
+ - **Mini-blogs** (`ko-fi`, `buymeacoffee`, `patreon`, `tumblr`, `teletype`): the `model` diagram or a keep-and-change text block as the intro, one heading (or a bold lead on `tumblr`) per path in source order with the primary blocks and, per secondary path, one to three sentences or one short block but not both, `proof-full` under its own heading (`tumblr` and `teletype` take `proof-compact` with the split and the scope instead), `caveat`, `gotcha` with its block, a routing text block or a one-line stance to close, 2 labelled links.
+ - **Deep articles** (`devto`, `hashnode`, `hackernoon`, `medium`, `substack`, `telegraph`, `daily-dev`): H1, a short intro with the `paths` block, one literal heading per path in source order (grouping only where the blueprint allows it), each primary section its `setup-` block plus at most three sentences, each secondary section one block at most (its command or a text list, never both) plus at most two sentences, `proof-full` under a question heading that names the peers, a `Privacy`-style caveat heading, a troubleshooting heading with the symptom, the config block, the restart line and a bold one-line lesson, then the labelled reference links. `daily-dev` is the short member of the class: grouped secondary paths in a bullet list and `proof-compact` with the split and the scope. Setup sections come before the economics section; the economics section exists and does not consume the article.
- Only the cleaned unit fans out. Adaptation may cut and reshape; it may not put back what this pass removed. The cleaned unit is saved as `unit.md` beside the notes, because the echo check and the fidelity pass both compare against it.
+ Rules that hold on every surface:
- ### Writing in a language other than the source
+ - **Sentence length is a spread, never a pattern.** Each file meets the rhythm floor its level names in `references/creativity.md` section 5, including that level's limit on consecutive sentences of near-equal length. Writing long-short-long to satisfy the floor is the defect the floor was built to catch: vary because the thought varies, then measure the result.
+ - **Nothing is invented to make a post livelier.** No experience the author did not have, no stake the source does not carry, no specific invented to satisfy a specificity rule, no opinion manufactured for contrast. This holds at every creativity level and is the first thing the audit checks when a post suddenly reads well.
+ - Fragments are a level decision: none at 0, allowed above the hard caps at 1, ordinary at 2 and 3. Where a fragment lands, it lands because the sentence before it earned the pause.
+ - **The subject family sets the register** (`references/registers.md`): its rhythm, its lexicon, whether a question to the reader is native at all, and what its writers never say. At level 0 it steers word choice, at level 1 it also sets the emoji baseline and the heading style, and at 2 and 3 it leads. It never changes a fact, a cap, a module's presence or the interview's voice.
+ - The opener names the promise in the reader's terms (what they keep, what changes, why), and its first sentence carries the subject's name and at least one client's product name. A first sentence built from category nouns alone (`a cheaper model`, `the client you already have running`, `a terminal agent`, `the provider`) fails, however elegant. The wire mechanism is a supporting sentence, at most one per post.
+ - No meta-framing anywhere in the pack: no sentence about how the topic is usually framed, argued or decided (`picking a side`, `a camp`, `a routing decision rather than`, `separate purchases`, `the question is`, `the decision is smaller than`, `a winner`). The posts explain the guide and say what the author would do with it; they do not comment on the debate around it.
+ - Path sections keep the source's order on every surface that has them; the primary path the source explains first comes first, whatever the title emphasises. Titles and openers name the primary paths only: a secondary tool never stands in a title beside the subject.
+ - **Both primary paths survive to every platform, in the title and in the body.** Count the client names in every title before the file is saved: a title naming one where the source has two is rewritten, whatever platform it is for and however well the shorter line reads. The per-platform title shapes stay as they are; what changes is which names go into them, so `Keep <A>, put <subject> behind it` becomes `Keep <A> or <B>, put <subject> behind them` and `<Subject> as a replaceable model layer behind <A>` becomes `... behind <A> and <B>` or the collective `coding CLIs`. Where the source has two primary paths, every title carries both (`<Subject> behind <A>/<B>: <plain nouns>` is the compact form the hard caps use) or one collective noun (`your coding CLI`, `coding CLIs`), and every body names both at least once even where the blueprint says `coverage primary` and only one gets its setup block. Dropping the second client from a 280-character post is not compression, it is a different post: the reader is told the subject works behind one tool when the source is about two. A title naming one client over a body that covers two is the same defect from the other side.
+ - No self-positioning contrast in an opener: `I have been looking at <subject> as X, rather than as Y`, `I read <subject> as X rather than Y`, `I would rather change X than learn Y`. The author's stance is stated forward (`I see <subject> behind <A> mainly as a <role>.`), and `rather than` earns its place later in the body, inside a sentence about the work rather than about the author's framing.
+ - Never point at the post's own blocks with a demonstrative: `that table`, `this block`, `the list above`, `the diagram below`. Name what it holds or state it in words. The same ban covers counting or ranking what is about to appear (`Four lines of state, and the last one is the part I keep coming back to`) and pointing at a position inside a block (`everything above the second line`, `the first line here`): the block is read by the reader, not narrated to them.
+ - No self-benefit framing. `The useful part for me`, `what I like about it is`, `the part I keep coming back to`, `what this buys me` put the author's relationship to the thing where the judgment about the thing belongs. The judgment goes on the subject (`That is a more useful way to think about coding models than picking one permanent best model`), and first person stays on what the author would do.
+ - Plain spoken US English, in the order a person says it: somebody does something to something. No idiom that is not in ordinary speech (`stay put`, `in front of your day`), no abstraction as the subject of a verb about the reader's life, and no sentence that hands the reader a list of abstractions to keep (`does not cost you <tool>, your permissions or your muscle memory`). Where a sentence needs a second read to parse, it is rewritten short.
+ - One question put to the reader per post, never two, and on a family whose writers do not ask (`references/registers.md`), none at all unless the blueprint's own shape is built on one. A visible title that asks the question is the post's question, so the body asks none, a body that opens on the question does not close on another, and a closing question exists only where the title is a statement and the platform's blueprint calls for one. A question-shaped section heading (`Why use <subject> instead of <peer>?`) is a label on a section, not a question to the room, and does not count.
+ - Every sentence on a hard cap does one of five jobs: the promise, the proof, the split, the caveat, the link. A sentence that states an abstract property of the setup without telling the reader what to do with it is cut, however true it is.
+ - Every line is a complete sentence with a verb on the hard caps, at every level: 280 characters has no room for a line that asserts nothing. Above the hard caps the level decides, and a fragment there is still a choice a writer made rather than a sentence that ran out. `<Client A>/<Client B>, add <subject>` is a label, not an opener: it names two things and says nothing about them, and a reader who meets it first learns nothing. Fitting both clients into 280 characters is done inside a sentence (`I would put <subject> behind <A>/<B> mainly for <reason>.`), never by dropping the verb. The same holds for the split: both halves keep their own verb, and `and escalate` is never the word that gets cut to save four characters.
+ - Inside a path section only the block is the anchor. The sentence that introduces it and the sentences after it are frames, written for that platform: what a secondary path buys the reader, what the author would do with it, is said differently on every surface that has the section. The same holds for the sentence about the fuller published block, the sentence about the variables' scope, and the sentence advising to read a remote script: each is frame prose and falls under the echo rules.
+ - The band is written to, not audited into: a long form is composed section by section against the budgets in `references/platform-specs.md`, and its body length is measured before it is saved.
+ - Blocks are separated by one blank line, on every platform and at every length. A hard-cap post is four or five blocks with blank lines between them, not five lines glued into a wall, because every surface here renders Markdown or collapses single newlines and the post then arrives as one paragraph. The only contiguous lines in a body are the lines inside a fenced block, the items of a list, and the footer, whose lines are one block by design.
+ - **The footer's contiguous lines need a hard break, or the same collapse eats them.** One block does not mean one line: a footer written with bare newlines publishes as one run-on sentence — the intro line, then both handle lines, separated by spaces — on every platform that renders Markdown, which is where three posts in one run shipped their three footer lines glued together. End every footer line but the last with **two trailing spaces** — the CommonMark hard break, invisible in the rendered page and invisible to a reader of the file, which is why it has to be written deliberately. The footer's own characters stay verbatim: the two spaces are the separator between its lines, not a change to its text, and the verbatim rule in Phase 1 still forbids touching anything else in it. The audit reads the footer back as three lines, not as three lines' worth of characters.
+ - No two consecutive paragraphs open on the same words, and no two consecutive sentences inside an anchor do either. What is compared is the whole opening phrase and not two words: `<Client A> and <Client B> stay where they are` followed by `<Client A> and <Client B> both take <subject> as their provider` puts the same subject at the front of the post twice, and the second sentence starts somewhere else or goes. The split anchor opens its second sentence on the cases (`For <cases>, I would still escalate ...`), and the caveat anchor opens on the imperative (`Do not casually send ...`), so an `I would` paragraph is never followed by another.
+ - **One fact, one sentence.** Two sentences carrying the same fact in different words are one sentence and a defect, the opening pair most of all, because a reader who meets the promise twice before any proof has been given nothing the second time and reads the post as padding. A frame sentence that would restate the opener either adds what the opener left out or is cut.
+ - **Every sentence makes one claim the reader can check.** A sentence that gathers several findings and closes on a collective verdict (`the pricing table, the terms and the failure mode are all part of the same picture`, `it all points the same way`) asserts a relation instead of showing one, and no reader can say whether it is true. Write the single claim that belongs here with the fact it rests on, and leave the others to the paragraphs that carry them. On a hard cap it is always the sentence to cut, since it spends the most characters per fact delivered.
+ - No inventory of the steps as a summary line (`Three variables for <A>, one script for <B>, and the interface stays`, `Two variables and a key do it for one, an official setup script for the other`): the steps are shown once, in their blocks, and a lead line states the promise instead. Rewording the count is the same defect, because naming the ingredients is not telling anyone what they get.
+ - **A post points at nothing it does not carry.** Where the surface renders no block, naming the variables, the key or the script sends the reader to hunt for them inside a linked page, and a short post is the one place that costs the most. The sentence those words would have filled carries the promise, the proof, the split or the caveat instead, all of which are complete where they stand.
+ - **Every opener names what stays and what changes, and says the change is possible rather than done.** The client the reader keeps is a thing in the sentence, the provider that replaces the old one is a thing in the sentence, and the verb is `can`, `could`, `do not have to` or `I would`. A present-tense report (`<Subject> sits behind <A> or <B>.`) claims it is already installed; a negation carrying the whole meaning (`Nothing about <A> or <B> has to change for <subject> to answer them.`) makes the reader assemble the point. Both are rewritten forward, and a stance opener keeps the reason clause that makes it a stance (`... for the cheap half of the work.`) even at 280 characters.
+ - A room question asks about the reader's result with the subject (a comparison on a real repository, a task that failed, a cost that did or did not hold), never about the mechanics of the setup or which client handled it. It also has to be a question a person would type. One clause, one thing asked, nothing invented to make it specific: `Has anyone run a week of ordinary repository work on <subject> behind <A> or <B> and compared what it produced with the defaults?` stacks a duration, a workload, a setup and a comparison into a study nobody ran, and the reader cannot answer it at all. Read it against the title before the file is saved: it is the question that title provokes, it is about what the post is about, and someone who has used the subject once can answer it.
+ - **Claims about effort, cost and what is expensive to replace come from the source or are not written.** This reader configures these tools daily, so a list of what is costly to rebuild that includes something they change with one flag or one config line (`the permissions`, `the prompts`) reads as invented, and one invented item takes the rest of the sentence with it. Check each item against what a competent user actually does with it: what they set once from a flag is not an asset, and it comes out of the list. What stays is what the source shows the reader keeping.
+ - The post is the guide, and often the only thing behind the link is vendor documentation. So the word `guide` and its cousins (`write-up`, `note`, `the source`) never appear in a body: no `this guide`, `the same guide`, `the guide shows`, `the guide covers`, no guide that repeats, walks, lays out, is good at anything or is liked, and no count of its paths in prose (`six clients`, `five more`, `four other`). The inventory is the `paths` anchor: the fenced block on long forms, `Also covered: <A>, <B>, <C> + local <D>.` on feeds and hard caps, and on community surfaces the neutral sentence `<Subject> also works behind <A>, <B>, <C>, <D> and local <E>.`
+ - No self-praise and no caption of the obvious. A sentence that says the guide, the post, the setup or the idea is simple, useful, good, whole or the entire idea (`That is the entire idea:`, `That is the whole shape`, `The useful pattern here is simple:`) is deleted; a sentence whose subject is the thought itself (`The useful idea here is that ...`, `The point is that ...`, `The interesting part is that ...`) is cut back to the thought, and the test is mechanical - delete everything up to and including `that`, and if what remains still stands as a sentence, that deletion was the fix; a caption that announces what the next block visibly shows (`Three variables and the launch line:`) is deleted; an italic deck line listing the article's contents under the H1 is deleted. A subtitle, where the blueprint has one, states the idea in one clause and never lists the sections.
+ - Text diagrams in fenced `text` blocks carry mental models, splits, path inventories and before-and-after states on every surface that renders fences; ASCII only. The `model` diagram sits in the intro or directly after the primary path's block, never after the secondary paths or between them and the economics section.
+ - Bold is for the numbers inside `proof-compact`, for a bold lead where the blueprint says so, and for the one-line lesson in a long form. Nothing else.
+ - Semicolons: none, at any length. Two clauses that each carry a thought are two sentences, and a clause that only qualifies the one before it joins with a comma. A run of them is one of the plainest machine tells a body can carry, and an opener that needs one is an opener that has not been written yet.
+ - ASCII punctuation: `'`, `"`, `-`, `->`; no em or en dash, no Unicode arrow, outside exact code or a quotation. No `#show`.
+ - The selected voice binds every body: under first person every post carries at least one genuine stance (`I would`, `I like`, `for me`), long forms a second one at the recommendation; a personal frame with no number is welcome (what the author has kept, replaced or expected), an invented result is not.
+ - Emoji follow the interview answer, capped by the family's baseline in `references/registers.md`: a family whose writers use none takes at most one per post however high the interview number, because a technical post wearing four emoji reads as written by someone who does not publish there. `hackernews` carries none whatever the answer. An emoji never lands inside an anchor (an anchor is verbatim and travels without it), and the same emoji sits on the same sentence in at most 2 posts. Only the palette in `references/authored-style.md` is used: an emoji from a newer Unicode block or one that needs a variation selector renders as a box on the platforms these posts land on.
+ - No calendar date in prose except an `as of` qualifier on a `core` correction of a temporary state.
- The other-language version is written in that language, not carried across from the version that already exists. Sentence order, connectors, idiom and sentence length all belong to the target language, and the English original stops being the skeleton showing through.
+ ## Phase 8 - Frontmatter
- For Russian and English in either direction, `awesome-translate-ru-en` holds the rules, and the load-bearing ones here are semantic-over-literal, its connector map read in whichever direction this run needs, register matching, and its forbidden-phrase list. On top of that, the tells that give away a Russian post assembled out of English: English word order left intact, «это не X, это Y» negation frames, calqued connectors («более того», «важно отметить», «в современном мире»), passive constructions where Russian wants an active verb, participial chains nobody speaks in, and a formal «вы» register on a feed written on «ты». The test is reconstruction: if a native reader can rebuild the English sentence behind the Russian one, the sentence is rewritten rather than adjusted.
+ Every file begins with exactly these 5 keys, in this order, and no other:
- Identifiers, commands, flags, product names and error text stay in the original, untranslated. One rule of that skill does not carry over: where it says to preserve em dashes as em dashes, the zero-dash rule above wins, because these outputs are composer text rather than formatted prose.
+ ```yaml
+ ---
+ platform: <slug>
+ title: "<platform-specific metadata title>"
+ voice: first-person | first-person-plural | third-person-neutral | profile: <path> | style-guide: <path>
+ links: [https://...]
+ hashtags: [TagOne, TagTwo]
+ ---
+ ```
- ## Phase 5 — Audit: the counting pass, then four readings
+ Phase 11 adds one optional key, `attachments`, after `hashtags` and nowhere else. Until it runs, the five above are the whole contract. One blank line follows the closing `---` before the body. `title` is metadata even where the body shows no title; it is composed from the title moves in `references/authored-style.md`: the subject's name plus at least one client's product name (or the exact phrase `the coding CLI you already use` on at most 4 titles), the relation word `inside` or `behind`, in at most 80 characters. Never count-led, never a label about the post itself (`the short version`, `setup notes`, `in numbers`), never a thesis with a colon, never announcement voice (`<vendor> documents`), never `replace <peer>` (the guide keeps the client and routes the model), never `a <subject> setup for <audience or occasion>` with no client named. A roll-call of more than two clients fits at most one title in the pack. `hashtags` is an ordered subset of the pool on every platform except `reddit`, `lemmy`, `hackernews` and `quora`, which carry `[]`; the metadata list is independent of whether the body carries a tag line, which `references/platform-specs.md` decides. The same first 4 words open at most 3 titles in the pack, the colon-contents form stays off the deep articles, and the question form is used only where the blueprint names it (`reddit`, `quora`, `facebook-wall`).
- The mechanical half runs first and it is counting, not reading. Settle it over the whole posts folder in one pass, against the run's source notes, with the platform list the user actually kept, with the hashtag answer the interview gave, and — after a wording fix — against the copies taken before it. Everything with a countable answer belongs to this pass: filename shape and platform slug, frontmatter agreeing with the filename, title length and terminal period, attachments present on disk, ASCII punctuation, `#show` and internal labels, assistant domains, a URL in parentheses, calendar dates, the literary and hype word lists, the hard caps at their 98% margin, the depth bands, one-line paragraph runs and their share, the banned opener shapes, emoji-bullet rows, body hashtag counts against each platform's norm, duplicate platforms, the file count, the persona reaching each post's first two paragraphs, support matrices and bare bullet stacks, the headline shapes and their length, a crowned favourite, a missing question on a discussion surface, the small-thing-big-effect closing, first person with no specifics under it, semicolons past the per-length allowance, a document as the object of the author's effort or named past once per 1200 characters, the opening phrases and verbs repeated across the run, the access boilerplate a public repository never needs said, the report word standing in for a number, a spelled-out count in front of a technical noun, and prose past what the post's ledger claims carry. Report one line per finding, naming the post and the check. A finding is fixed in the file and the pass is repeated until nothing is left; no judgment pass starts before that, because a reader spending attention on a post that is over its cap is attention spent twice.
+ ## Phase 9 - Audit
- Then the four passes a script cannot run, one at a time across all posts, listing every finding before fixing any — detection mixed into rewriting collapses onto one dimension:
+ Run every check before the folder is revealed, counting first and reading second. A finding names the post, the rule and the span, with a verdict of `FIX` or `REWRITE` (`references/fidelity.md`). Fix an anchor in `anchors.md` first and rebuild every post that carries it.
- 1. Fidelity — the post's point matches `source-notes.md`; every claim and number traces to it with its condition; quotations verbatim; nothing from the "does NOT say" section present; every version still carries the same point, the same provenance and the same numbers, and no adaptation quietly turned into a second claim. A post that fails here is rewritten, not patched.
- 2. Structure — the outline test, the question sequence, position tells and stance, run on the unit itself. Where `--deep-audit` is on, this is `awesome-humanize-en`'s structure pass in full; otherwise the structure items of the Phase 4 checklist.
- 3. Slop — vocabulary and syntax beyond what the word lists catch: the invented idiom, the contrast frame that survived, the paragraph engineered to land, with the voice profile's protected tics excluded. Under a declared voice the voice's *known costs* are reported, not fixed against the user's chosen aesthetic, while uniformity findings keep full strength: the same signature move on every platform's version is a finding even when the profile lists the move. An announcement-shaped unit also takes the release-notes tells — marketing inflation, benefit claims with no mechanism, the journey intro and the road-ahead outro. Where a voice rule and a slop rule directly conflict, name both in `campaign.md` and let the user pick.
- 4. Register and placement — the things that need a reader: every rule in `repurpose/rules.md`, cited by name; each post still landing with its link deleted; the persona the interview chose present in the opening of every post with no invented result inside it, and the post reading as a person reporting rather than a product describing itself; the hook surviving a literal, uncharitable read by someone who knows nothing about the source; no capability roll-call and no support matrix anywhere; nothing crowned as a single favourite; the headline naming the subject in one clause with no why-shape, announcement voice, roll-call or trailing qualifier; at least a couple of checkable specifics under the first person; the ending handing the thread back on a discussion surface and landing rather than restating everywhere else; any diagram in ASCII and labelled; at least one human signal per post (an emoji, a question, an aside, a fragment) unless the platform is one of the named flat ones; emoji placed the way a person places them, never one per line; every tool beyond the main subject carrying an identifying clause at first mention; every link belonging to the sentence that points at it; on article platforms the image in the body under the title; the title naming the subject and stating the point rather than teasing it; for a post in another language, the nativeness test from Phase 4 with technical tokens untranslated; and the link being the one Phase 1 settled on or none.
+ The audit reads the creativity level first and applies that level's thresholds (`references/creativity.md` sections 4, 5 and 9). A breach of the floor blocks at every level, a missed level requirement blocks, and polish inside the level's allowance is reported rather than blocking. Every number below is counted on the files as they stand: a rhythm figure that was asserted rather than counted is itself a finding.
- Pass 1 starts by writing `claims.md`, one row per atomic claim per post with the note IDs behind it, and the gate's ledger check runs on it. Passes 1 and 4 are made in a fresh context: the ledger rows are checked against `source/` by a reader that never sees the posts, each post's point is written down by a reader that sees only the post and compared with the notes, and the register pass is read by one that never saw the drafting. Where the runtime has subagents these are read-only subagents; otherwise the separation is sequential and the report says so. Every finding carries the quoted span, the named rule and a verdict of `SHIP`, `FIX` or `REWRITE`; a hunch that maps to no rule is not reported (`references/fidelity.md`).
+ Counted:
- **A finding against the unit is fixed in `unit.md` first, and only then in the versions.** Every platform version is the unit adapted, so a sentence corrected in 13 files while the unit still holds the old wording is 13 files carrying a phrase the unit never had, which is exactly what the echo check counts: one run fixed the posts first twice and both times the next mechanical pass came back with a fresh crop of echo findings it had just created. The order is: correct the unit, re-save it, rebuild every version that carried the sentence, re-run the script. A finding that belongs to one platform only — a cap, a tag norm, a target's register — is fixed in that file and never in the unit.
+ - **Files and frontmatter** - exactly the requested set, canonical names, the 5 keys in order plus `attachments` where Phase 11 wrote one, no forbidden key, `voice` equal to the interview answer, the same 1-3 link set everywhere, hashtags an ordered subset of the pool.
+ - **Length** - every body measured in characters after the frontmatter and listed against its band in the report; hard caps with margin; a post over its band ceiling re-enters the compression ladder in `references/platform-specs.md` and is not shipped until it is under. The section budgets in that file are the first thing to check on an overrun.
+ - **Anchors** - every anchor present in the classes that carry it; `proof-*` on every platform; no anchor deep detail on a surface its label forbids. What "present" means is the level's: at 0 and 1 verbatim, and a reworded proof, split, scope or caveat is a `FIX` back to the anchor; at 2 one of the registered variants verbatim, with the whole class on the same variant and no fourth wording anywhere; at 3 the fact set complete and unchanged in meaning, checked element by element, with every number, unit, condition, peer name and named case identical to `anchors.md`. Setup, config and command blocks are verbatim at every level.
+ - **Rhythm** - per file, on prose only: sentence count, mean, longest, shortest, the share inside the 10-to-20-word band, the longest run of sentences within 3 words of each other, and the paragraph-length span. Each is checked against the level's floor in `references/creativity.md` section 5, and a file that meets the floor by alternating long and short on a schedule is a `REWRITE`, not a pass.
+ - **Structure variety** - the moves each file took, read against the plan: no file over two moves, no two files in one class sharing a combination, the level's minimum met, and no move applied to a whole class. A pack whose files all carry the blueprint default at level 1 or above has not planned, it has defaulted.
+ - **Register** - the family's rhythm band, lexicon, question habit and emoji baseline against what shipped, plus the family's own avoid-list. A post that reads as written by someone who does not publish in that family is a `REWRITE` of that post.
+ - **Invention** - every concrete detail, stake, result and opinion traced to an evidence line or to the selected voice's allowance. This check runs first at levels 2 and 3, where the freer frames make an invented specific easiest to write and hardest to see.
+ - **Echo** - a mechanical count, not a reading: every prose sentence of every file goes into one table with the number of files it appears in, `anchors.md` is the only whitelist, and the table is kept with the run. After that whitelist and code, URLs, quotations, tags and identifiers: no prose sentence in 3 or more posts, no opener sentence twice, no 6-word opener prefix in 3 or more posts, no closing sentence in 3 or more posts, no coined phrase of 3 or more words the source never used in 3 or more posts, no source aside lifted into a slogan on more than 3 platforms; and no anchor whose first four words are a placeholder stem copied out of `references/authored-style.md` rather than written for this subject, which is the one echo that crosses runs instead of files. The report states the number of non-anchor sentences found in 3 or more files, which is zero when the pack ships. The thresholds tighten as the dial rises, because repetition is the tell that survives every other change: at level 2 no prose sentence in 2 or more files and every claim carrying a named referent, at level 3 no non-technical 6-word span in 2 or more files and every post carrying at least one concrete detail no other post carries.
+ - **Distribution** - opener moves, first-person openers, closing shapes, title moves and prefixes, mechanism-sentence openers, recommendation closings, all against the Phase 6 bounds.
+ - **Locality** - retired names, alias history, exact clock windows, policy and jurisdiction wording, the diagnostic sequence: on at most 2 files, the deepest surfaces, inside their module; a non-decision correction on no feed at all; a workload cost example on at most 3 files.
+ - **Representation** - code blocks, list blocks and text diagrams against the layout targets; a command-heavy source rendered as prose on a code-friendly surface fails.
+ - **Style** - ASCII punctuation, zero semicolons, one question per post, no self-benefit framing, no counting or narrating a block the reader can see, no position reference inside a block, no idiom outside ordinary speech, bold allowance, no `#show`, no date outside the allowed qualifier, display names rather than identifiers in prose, no run of three one-line paragraphs, no meta-framing sentence, no `guide` or `write-up` in any body, no path count in prose, no self-praise, no caption of the obvious, no step-inventory line, no italic deck line, no bookish phrase (`received wisdom`, `conventional wisdom`, `the prevailing view`), no two consecutive paragraphs opening on the same two words, every opener's first sentence carrying the subject and a client by name, every setup block line-for-line inside what the source or the official page shows, every hard-cap caveat a sentence about what to do with sensitive code.
+ - **Tags and footer** - where the platform carries a body tag line it is the last line of the body, every tag with `#`, CamelCase, identical in tags and count to the frontmatter list, and at the platform's target count in `references/platform-specs.md`, never at the floor of a range when the budget holds one more; where the platform's tags live in its own field the body has no tag line and the frontmatter carries the norm count, and the report names those platforms so an empty body reads as a decision rather than an omission; the footer, when chosen, sits after the link and before the tag line, verbatim, and only on the platforms its permission table allows, with every line but its last ending in two spaces so the block survives as separate lines on the Markdown surfaces.
+ - **Logic** - every closing link list read against its own title, one entry per primary path the title names before any supporting page is counted; every title carries both primary paths or the collective noun, every body names both at least once, each client in the title appears in the body, and no post names a client in its title that its own prose never mentions. Count the primary paths per file: a file naming fewer than the source's primary paths, in either the title or the body, is a `REWRITE` of that file, never a note.
+ - **Tells** - at levels 2 and 3, machine-favored constructions counted per 200 words of body by the list in `references/creativity.md` section 8, with three in one paragraph a `REWRITE` of that paragraph and the per-file count in the report.
+ - **Format** - the file set is complete, with no platform missing for want of media; every line on a hard cap is a complete sentence, and above the hard caps every line is a complete sentence except the fragments the level allows and the plan recorded; every body's blocks are separated by one blank line, with only fenced blocks, list items and the footer running contiguous; the footer is byte-identical to what the interview collected; the body's labelled link list represents every primary path the post names, and agrees with the frontmatter set.
+ - **Emoji** - the count per post equals the drawn count; every emoji-bearing sentence is listed and checked against `anchors.md`, and one found on an anchor moves to a frame sentence; no emoji as a bullet; the same emoji on the same sentence in at most 2 files; every emoji reported next to the word in its own sentence that it stands for, and one with no such word removed; every code point checked against the three-line gate in `references/authored-style.md`, since the palette is a map of meanings and the gate is what decides.
+ - **Voice** - a genuine stance in every body under first person, at the planned position.
+ - **Repetition** - no two consecutive paragraphs or anchor sentences open on the same phrase, and no two sentences in one body carry the same fact; every post's opening pair is read as a pair before anything else in it is read.
- The gate, per post: any fidelity finding, any structural finding, or three or more findings total → rewrite from the source notes; one or two wording findings → fix in place; none → ship. A rewritten post re-enters at the script and then pass 1 only; passes 2 to 4 are re-run on it only if pass 1 changed its text again. Fixes skew replace and delete over insert; the only addition allowed is specificity already present in the source notes. Before a fix in place the post is copied to `before/`, and the gate re-runs with `--before`: a changed number, name or negation is a drift finding and sends the post back to pass 1. A post gets at most two rewrites; a rewrite is kept only when it adds no fidelity finding and carries no more findings than the version it replaces, and a post still failing after the second stays `status: draft` with its open findings in `campaign.md`. Report, do not "fix", posts that read scrubbed — no contractions anywhere, every line engineered, no ordinary sentence left.
+ Read:
- ## Phase 6 — Files, always
+ - **Fidelity** - every claim in `claims.md` traces to an evidence line with its condition; quotations verbatim; the peers locked; numbers, names and negations unchanged after any wording fix; the cold read of each post's point matches the source promise.
+ - **Coverage** - deep surfaces cover all modules, feeds name all major paths and detail one or two, hard caps carry the portable takeaways; a guide reduced to one path on a long surface fails however accurate it is.
+ - **Why and when** - every substantial version says why, which tasks, when to use the other option, and the caveat; setup still dominates a tutorial long read.
+ - **Questions** - every question in the set read against its own title: one clause, one thing asked, every noun in it found in the body of the same post, no protocol invented to make it concrete, and a person would type it as it stands.
+ - **Openers** - every opener read for the two halves and the modality: what stays, what changes, and a verb that offers rather than reports; every stance opener read for its reason clause.
+ - **Competence** - every claim about effort, cost or what is hard to replace traced to an evidence line, and every item in such a list checked against what a daily user of these tools does with it.
+ - **Structure** - the blueprint shape: H1 as specified, sections literal, setup before economics, a skimmable path list where the source is a multi-path guide, a question where the surface is a room.
- `repurpose/<slug>/posts/`, one file per platform, in the format `awesome-content-publisher` reads, named exactly as it expects:
+ ## Phase 10 - Deliver
- ```
- YYYY-mm-dd_HH-mm_<pub-timezone>_<title>_<platform>.md
- ```
+ Create `<slug>_social_posts/` inside the run folder, containing the final `.md` files and, once Phase 11 has run, a `media/` folder beside them: no README, no manifest, no archive. The only thing that moves the folder elsewhere is a path the user named in the invocation, and the source file's own directory is never that path by default. The posts folder keeps the plain readable name, because that is what the user reads in a file manager; uniqueness lives one level up in the stamped run folder, so no set is ever overwritten by a later run on the same source. A named path that already holds a post set is reported before anything is written, never merged into and never emptied.
- The scheduled time is the publish time chosen in Phase 2 (now, or the time the user named). Frontmatter carries `platform`, `scheduled`, `timezone`, `title`, `voice`, `target` where the platform needs one, `attachments` with alt text, `links`, `hashtags`, `source_anchor` (the paragraphs of the source the post's idea draws on), `status: draft`; and where they apply, `attachment_text` on `threads` when the long attachment was chosen, and `document` on `linkedin` with several ordered `attachments` on `instagram` when the media answer was a carousel. `links` holds the public source Phase 1 settled on, or nothing at all; the URL the source arrived on never lands there when it belongs to an assistant.
+ State the absolute path here, in full. A scratch path is not one the user can guess, and the folder is opened for them at the end of the run rather than now, because the media question of Phase 11 is still to come and an empty `media/` folder is not what they asked to look at.
- The `<title>` field is a lowercase kebab-case slug, cut from the post's title after that title is written — the publisher parses the name against `[a-z0-9][a-z0-9-]*` for this field, so a capital letter or an underscore fails the round trip before a word of content is read.
+ ## Phase 11 - Media, the last question
- What the title has to say is `awesome-content-campaign`'s rule and is not restated here: name the subject and state the point, never an unanchored fragment, a topic label or a teaser. It is the same rule the unit's own headline follows, applied to the field a composer and a file listing will show without the post around it.
+ Every post is written and the folder exists. One question, and the run does not end before it is answered:
- `voice` is written on every post file, always, and it names what was actually used rather than what was offered. A post read back months later has to answer which voice wrote it without the manifest beside it, and a batch written under a profile that has since been rewritten is unreadable evidence otherwise. The value is the Phase 2 answer resolved to its source:
+ | # | Option | What happens |
+ | --- | --- | --- |
+ | 1 | Images | Generated here with `awesome-content-graphics` from this post set, or supplied by the user |
+ | 2 | Video | The user supplies one file, and the run derives what each platform can take |
+ | 3 | No graphics | Every post ships as text, media-required platforms included |
+ | 4 | Type here | Anything else the user means by media |
- - A profile from `awesome-content-voice` → `profile: <path>`, the path as it was read, so the file can be opened again.
- - A style guide from `awesome-style-mimic` → `style-guide: <path>`, same rule.
- - One of the built-in answers → `first-person`, `first-person-plural`, or `third-person-neutral`.
+ A supplied file is a path on the machine or a URL. A URL is downloaded into `media/` and the run says what it saved, from where, and its size and type. Anything that does not download, or is not an image or a video, is reported and the question asked again rather than guessed at.
- Where a post deviates from that voice on the platform's orders — a genre demanding what the profile's evidence does not carry, a tag field that overrides the profile's hashtag casing, a platform whose natives use no emoji — the deviation goes on the same file in a `voice_deviation` line saying what was overridden and what overrode it. A deviation recorded only in `campaign.md` is lost the moment a post file travels on its own.
+ **Images.** Either answer ends at the same place: one approved picture, and then every platform's own frame of it.
- Beside them, `campaign.md` — the name is the publisher's contract, not a claim that this was a campaign. It records the source and its provenance, the link the posts carry with how it was found (or that none exists and the posts carry none), the notes the posts were checked against, the one idea the unit carries, per-platform limits with their checked-on dates, what each platform's version had to cut or reshape, and any Profile prerequisite (a bio link a "link in bio" post depends on). It also carries the three candidate ideas with the one chosen and the two kept as backlog, the two openers that lost with the shape of each, the thread plan or the carousel slide plan when there is one, every post the rewrite budget left at `status: draft` with its open findings, and whether the fresh-context checks ran in subagents or in sequence.
+ - *Supplied.* The user gives a path or a URL. It is resolved into `media/` and that file is the approved picture.
+ - *Generated.* `awesome-content-graphics` is handed the facts from `source-notes.md`, that file's boundary section, the post title, the output language, the target ratio and `<posts folder>/media/` as its output folder, and hands back the picked file with its alt text. It asks its own count question and runs its own pick gate; this one does not restate them, does not ask anything it is about to ask, and does not proceed until it hands control back.
- Files exist before anything is published. A run that fails at the third platform leaves seven finished posts on disk, and the publisher's ledger knows which two already went out.
+ Then, without another question, `awesome-content-image-adapter` is called with the approved picture and the posts folder. The posts are already written, so the platform list is the folder itself: one `<slug>.png` beside each `<slug>.md` whose platform takes an image, in that platform's frame. It skips a platform the canonical table marks as taking no attachment and says which. Nothing existing in the folder is moved or overwritten, and the run does not proceed until that skill hands control back.
- Then one structured question before Phase 7: accept the posts as they are (recommended) · revise named posts · drop named platforms. A revision re-enters Phase 5 for the named posts only, never the whole run. When the user's words in a revision correct how posts are written rather than a fact of this source, the correction is also written to `repurpose/rules.md` under that file's rules, so the next run starts with it. Last, the run appends its line to `repurpose/sources.md`.
+ **Video.** One source file becomes two things, both made before a post file is touched, and both needing video tooling on the machine (`ffmpeg` is the usual one): confirm it answers before promising either, and where nothing is installed say so, ship the posts text-only and name what was skipped.
- ## Phase 7 — Publish, or stop
+ - **Stills, for the platforms that do not take video.** At most 4 frames, chosen as the moments the posts actually talk about (the first clear frame of each distinct state, screen or scene), never four ticks off a stopwatch. They land in `media/` named in the order they occur, and a frame that is a transition blur or a title card is re-picked rather than shipped.
+ - **A short, for the platforms that do.** Vertical 9:16, cut to the shortest limit verified for the video platforms in this run so one file serves them all, and the cut keeps the moment the post's proof lands. A platform whose verified limit is shorter gets its own cut. A source already vertical and inside the limit ships as it is, and the run says so. Every platform limit here is verified live or read from the platform cache, never assumed.
- Files only → the skill reports where they are and stops.
+ **Who gets what.** The video platforms (their Media column, confirmed in Phase 3) take the short, and it is the default there rather than a still. Every other platform that takes media takes stills: one on a single-image surface, the frame that matches what that post leads on; up to all four where the surface takes a sequence, which is the carousel, the photo set and the document. A platform whose Media column says nothing is supported gets nothing. A media-required platform with no media is **not** dropped: its text is written and its file ships with the rest, because whether a post goes out without its picture is a publication decision and `awesome-content-publisher` owns it. `No graphics` is an answer about pictures, not about which platforms get written, and a run that answers it by writing six fewer posts has decided something the user did not.
- Publish now, or at a named time → call the Skill tool with "awesome-content-publisher" and hand it the folder:
+ **Frontmatter.** Media is declared where the publisher reads it, after `hashtags`:
- ```
- /awesome-content-publisher repurpose/<slug>/posts --now
+ ```yaml
+ attachments: [{ file: <slug>.png, alt: "<what it shows and what it means>" }]
```
- Everything about publishing belongs to that skill and is not reimplemented here: the browser-bridge preflight, the login check with wait-or-skip, the ledger that survives a restart and prevents duplicates, the confirmation gate, the human pacing, the read-back of every post, the incident handling. Drop the `--now` when the posts carry real future times; it will wait for them.
-
- That skill not installed → say so, leave the files, and print the command to run once it is. Nothing about the output depends on it.
-
- ## Verification
+ Paths are relative to the posts folder, so the publisher resolves them there. A post whose picture came from the image adapter names the file that sits beside it and shares its name; a still or a video derived in this phase names its file under `media/` the same way. Alt text is written in the run's output language, says what the picture shows and what it means, and carries no date. The key is absent on a post with no media, several entries in order carry a sequence, and `scheduled`, `timezone`, `status` and `target` stay forbidden here as before.
- The report states: the source and its provenance, the link the posts carry and how it was found (or that no public one exists, and that the posts therefore carry none), the one idea extracted from it, the N platform versions of that single post and what each had to cut, the mechanical pass with its final finding count (a report claiming a clean pass without the count is the claim this phase exists to replace), the platform-cache date the run relied on or the platforms it re-checked live, each of the four judgment passes with its findings and the gate row each post landed on, filenames parse-verified, the voice the posts were written in named by its resolved source rather than by the interview option that chose it, the folder path, and — when publishing ran — the publisher's own report rather than a restatement of it. Anything skipped (a platform dropped for want of media, a community whose rules forbid the post) is named, never implied.
+ **Then open the folder on the user's machine and say that it was opened**, adding in the same breath that it sits in the session's working area and is copied somewhere permanent by the user if they want to keep it, with the absolute path in the same sentence so it survives a failed open: `explorer` on Windows, `open` on macOS, `xdg-open` on Linux, checked to exist before it is called, skipped in a headless or scheduled run, and a failure is one line naming the path rather than an error that stops the run. Another skill called this one -> hand the path back and open nothing, since the caller decides what the user sees and when.
- It also states the source-notes half of the mechanical pass with its finding count, the ledger rows still marked unsupported (none, or the posts that carry them), whether the fresh-context checks ran as subagents or in sequence, the two openers that lost, every post the rewrite budget left at draft.
+ The final message states: the folder path and file count, the source type, the subject family and the selected idea, the creativity level with the fingerprint and what it chose (the structure moves in play and, at level 2 and up, how the anchor variants were assigned), the comparison set and how each peer was resolved (the pricing page and the rung), the material corrections, every body length against its band, the rhythm figures against the level's floor, the echo count at the level's threshold, the media answer with what was attached where (and what each platform got), any platform dropped for want of media, and anything not verified. Post bodies are not pasted into chat unless asked.
## Anti-patterns
- - Writing a different post for each platform. One unit, adapted — a reader who follows the author on three of them should meet the same post three times.
- - Building the post out of an inventory: version numbers, feature roll-calls, lists of names. Factual, easy to extract, and worth nothing to a reader who wanted to know what changed for them.
- - A post with no provenance, leaving the reader unable to tell what is being discussed or where it came from.
- - Summarizing instead of selecting: the numbered-takeaways post that reproduces the source's table of contents and gives the reader nothing whole.
- - Publishing the URL the source arrived on when it points at an assistant's own site, or closing a post on a pointer to the research chat and its share link.
- - A calendar date in a post: an audit stamp on the author's reading, an as-of qualifier with a month, a dated opening line, in any language.
- - A version and OS matrix inside a feed post, where a person would have said in one relative phrase that it needs a recent version.
- - The neutral-summary voice: a post that reports someone else's announcement instead of the author's own run at it.
- - Fanning the unit out to ten platforms before the humanity pass has touched it, then hunting the same tell ten times.
- - A Russian post with English sentence order and calqued connectors showing through, produced by translating the English one instead of writing it.
- - An em dash anywhere in a post, including the title, the alt text and the graphic.
- - A post with no emoji at all on a platform whose feed is full of them, and the opposite failure: emoji as bullet markers or one on every line.
- - Inverting the source's point by cutting the qualifier that carried it.
- - A number without the condition the source attached to it, or a paraphrase inside quotation marks.
- - Adding the adjacent claim the source stopped short of — that is what the "What the source does NOT say" section is for.
- - Rendering a graphic for the one platform that demanded it and shipping every other post text-only. The image was made for the idea, not for `instagram`; it belongs everywhere the platform accepts one.
- - A post built out of one-line paragraphs: a stack of fragments where a paragraph belonged, or a sequence of steps formatted as four separate blocks. Each line reads fine on its own, which is why this survives every other pass.
- - Opening on an abstract category doing something a category cannot do, on a vague event with a vague time, or on a tease that withholds the subject to build suspense.
- - Opening every post in the run on the same phrase. Variety across the seven working shapes is the rule, and it governs the wording, never whether the author is there: `I think` opening every post is a tell; a person in every post is the brief.
- - Answering the persona question with `first person` and then shipping short posts with no author in them, because the cap felt like the more careful choice. The product-as-subject sentence is what that produces, and it is the single defect this skill has shipped most.
- - A capability roll-call, a support matrix or a stack of bare bullets in a feed post. Landing-page furniture, and it carries no judgment about which of those the reader should care about.
- - Crowning one thing as a favourite, the best or the go-to. A ranking the reader cannot check, in place of the description that would have told them something.
- - A headline doing anything but naming the subject and stating the point: explaining why the thing is good, announcing what `we just got`, listing the products it works with, bolting a qualifier on after the point landed, or letting a product's name read as the quantity it is named after.
- - A post that describes the text it was made from: its language, its item count, its sort order, its author, and then the document recurring as the one who says, files or closes on things for the rest of the post. The reader never sees that document; they came for the subject. Name the primary source where attribution matters, keep the condition where the pasted text is the only support, and let the intermediary appear once at most, as the author's own encounter.
- - A payoff number spelled out where digits would have caught the eye, and the opposite failure: an inventory count of the source's items written in at all.
- - A count of a technical thing spelled out because it felt incidental: `three agents`, `two folders`, `four languages`. The noun decides, not the size of the number, and the noun there is technical every time.
- - A stretch of time as the actor, a week or a month handing the author a preview or a lesson. A period of time hands nobody anything, and the sentence hides whoever actually shipped the thing.
- - A closing that puts the subject on a maturity curve, early or at some named stage. It fits everything ever written about and commits the author to nothing.
- - A closing that pits one hedge against another, the current state called rough against the idea called bigger. Name what the idea points at instead, and the same sentence carries a claim.
- - A closing that restates the post in general terms, most often a small-thing-big-effect pair of sentences. It is what this skill writes when it has run out of things to say; the reader derived it three paragraphs ago.
- - A post into a room that never asks the room anything, on `reddit`, `lemmy`, `devto`, `hashnode` or `daily-dev`, and the opposite failure, one generic request for opinions stamped on every one of them.
- - First person with nothing under it: an opinion, an adjective and no number, command, version, name or quotation anywhere in the post. The pronoun is not the evidence.
- - A diagram drawn in box-drawing characters or Unicode arrows, which arrives as tofu or a misaligned mess on somebody else's font.
- - A run where every post opens `I found`. The pronoun may repeat; the verb after it may not, and a few posts should reach the author in their second clause instead.
- - A hook that only survives a charitable read, praising a property that reads as a defect until three paragraphs of context arrive. The reader who stops at the first line leaves with the opposite of the claim.
- - A `ko-fi` or `buymeacoffee` post written at feed length. Both are blog surfaces, and a 400-character post there reads as abandoned rather than concise.
- - A `bastyon` post written as a long read. The Shares composer is the target and its band is what the feed is made of.
- - Writing one long version and trimming it per platform at publication time, which always amputates the tail: the closing line, the number, the link.
- - Publishing without files, or writing files the publisher cannot parse.
- - Reimplementing any part of publishing, humanizing, or voice-building here instead of handing off.
- - Repurposing into a feed the ledger shows already carries this source, without telling the user.
- - Letting the whole source text into the conversation context instead of reading it from disk.
- - Re-verifying every platform's caps and formats on every run when the tables already hold them and the user was never asked whether they wanted the check.
- - Opening the user's browser to populate a target question they can answer from memory, before they asked to see their options.
- - Asking the full interview on a run whose answers are the same as last time's, when a one-screen "same as before?" would have done.
- - Verifying every claim in the source before the idea is chosen, then shipping a post that uses three of them.
- - Reading a post for a defect a script can count: an em dash, a cap, a run of one-line paragraphs, a banned opener.
- - Loading three external audit skills for a routine run whose checklist fits on one screen.
- - A claim the ledger cannot trace to a note line, kept because it sounded right.
- - A wording fix that changed a number, a name or a negation, shipped without the drift check.
- - Reviewing a post in the same breath that wrote it and calling the agreement a check.
- - A third rewrite of a post that has already failed twice.
- - Asking the user for the same correction twice, because the first one was never written to `rules.md`.
- - Correcting a sentence in every platform version while `unit.md` keeps the old wording, so the next mechanical pass reports the fix as an echo the adaptation stamped on.
- - Spending a whole interview screen on one question when the UI takes four, or opening a browser for a target the user would have answered from memory.
- - Writing the counting pass as a shell heredoc, so its regular expressions arrive with the backslashes eaten, or editing it with `sed` and paying for the whole file to come back into the conversation.
- - Working around a defect in the checker instead of fixing it: a grounding sweep that reads hashtags as claims, or a closing test that reads a tag footer as the last paragraph, hides real findings behind noise.
- - A multi-word hashtag in lower case on a platform that keeps the case.
- - Asking which render ships before the gallery has been opened on the user's machine.
- - Picking the idea silently when the notes carried three candidates the user could have chosen between.
- - A first-person unit that restates the project's published numbers and stops, with no arithmetic, reading, comparison or open question of the author's own in it. The pronoun is not the analysis.
- - The author's evening spent with a README, a table saved from a model card, or a closing that judges what a file does not settle. The effort lands on the project; a document is named once, to attribute a figure.
- - Telling the reader that a public repository is free, that it is MIT licensed, or that it needs no account and no key. All three were assumed before they clicked, and the clause rides in front of the link on every post in the run.
- - `Figure` doing the work of `number`, in post after post, every time a number is handed back to whoever measured it.
- - Padding a post to reach its band: a paragraph restating the one above it, a section that is its own title, the same caveat in three places. A source carrying two thousand characters of substance gets a two-thousand-character post, under band, and says so.
- - Semicolons doing the work of full stops, across a run, in a register nobody speaks.
- - Retrying a Reddit fetch, or recording a subreddit's rules as read on the strength of one; the fetcher is refused there and the browser or the user is the only path.
- - Accepting a Lemmy community the user named without reading its subscriber and post counts off the instance API, and posting into an empty room.
+ - Drafting before language, idea, voice and emoji are answered, or recovering any of them from an earlier run.
+ - Opening most of the pack on how the integration works on the wire, reworded each time, instead of on what the reader keeps and gains.
+ - Paraphrasing the proof, the split, the scope or the caveat per platform instead of reusing the anchor verbatim, and the mirror failure: copying an opener, a section intro or a closing from one platform to another.
+ - A coined tagline the source never used (a contrast pair, a two-word aside, a slogan about the numbers) stamped across the pack.
+ - A task split that says `routine work` and `something stronger` where the anchor names the tasks and the escalation cases.
+ - Choosing a client's default model, a premium top rung, a small rung, a preview or a specialist as the comparison peer because it was easier to find, and merging two peers' ranges into one phrase.
+ - A split that escalates to the subject's own premium tier where the source escalates the final check to a frontier model.
+ - A title that describes the post (`the short version`) or an audience (`for everyday coding work`) instead of naming the subject and the client; a title that puts a secondary tool beside the subject; an opener made of category nouns; a paragraph about how people argue the topic instead of what the guide shows.
+ - `I like this guide because`, `what this guide is good at`, `the guide repeats it five times`, `the same guide also covers`: the post is the guide, and a guide admiring or counting itself is the loudest machine tell in the pack.
+ - A hard-cap caveat written as a noun list (`No keys, no .env, no dumps.`), which reads as a fact about the system instead of advice about the reader's code.
+ - A title naming Codex CLI over a body that only sets up Claude Code, or a two-client body under a one-client title. The reader meets the title first and the body has to keep its promise.
+ - An opener that positions the author against an alternative (`I have been looking at X as a provider, rather than as another client to learn`). It is a shape, and four posts in one pack wearing it is the tell.
+ - A hard-cap line that sounds like an aphorism about the setup and tells the reader nothing to do with it.
+ - A demonstrative pointing at the post's own furniture (`That table is what I would run`).
+ - A follow-me footer shipped into a subreddit, a Lemmy community, a Quora answer, a Facebook group or the Hacker News front page, where the platform's own guidance reads it as promotion.
+ - Ending the run without asking about media, or asking about it before the posts exist, when the answer depends on what the posts turned out to be.
+ - Four stills cut at even intervals out of a video, or the same still pasted onto every platform regardless of what that post leads on.
+ - A command, flag, path or dotted token written as plain prose instead of a code span, which the autolinking platforms then rewrite into a link and break. The publisher cannot repair it and an edit re-applies it, so the file is the only place it can be prevented.
+ - A comparison that only reads correctly in monospace columns, shipped to a platform whose composer collapses runs of spaces.
+ - A landscape video shipped to a platform whose native format is the vertical short, or a cut made past a limit nobody verified.
+ - Reimplementing the graphics gates here: the count question and the pick belong to `awesome-content-graphics`, and this skill waits for them.
+ - Two questions in one post: the title asks one and the last line asks another, so the reader is asked twice and answers neither.
+ - A line that counts the block underneath it, or tells the reader which part of it matters before they have read it.
+ - A title carrying three or four client names, or one client plus a count of the rest (`<A>, and 4 other coding CLIs`).
+ - `I read <subject> as a provider`, which is the self-positioning opener wearing a different verb.
+ - A body that repeats its own frontmatter title as its first line on a platform whose composer has a title field.
+ - A hard-cap post that drops the second primary path from its title and its body, leaving the reader with a post about one tool when the source is about two.
+ - A body whose lines are glued into a wall because the blank lines went missing, most often after something was appended to the end.
+ - A footer whose punctuation the run improved: the user typed a hyphen and the post shipped a dash.
+ - A closing link list that names one primary path when the title named two. The list carries one entry per primary path the title and the body name, so two clients in the title means both setup pages in the list. A pricing page is welcome after them and never instead of one of them.
+ - A hard-cap line built as a label rather than a sentence (`<A>/<B>, add <subject>`), or a split whose second half lost its verb.
+ - A title that keeps its platform's shape by dropping a client: the shape is the template, the clients are the content.
+ - A body that repeats the submission title as its first line on `reddit`, `lemmy` or `hackernews`, where the composer has a title field of its own.
+ - Six fewer posts because the user said no graphics.
+ - A posts folder created beside the source file, or anywhere in the invocation directory, when the user named no path.
+ - A run folder named from the source alone, so the second run on one article lands on the first one's path.
+ - An opener and the sentence after it starting on the same phrase, or saying the same thing twice in different words.
+ - A sentence that lists unrelated findings and closes on a collective verdict rather than a checkable claim.
+ - A question no reader could answer, built by stacking a duration, a workload and a comparison the source never ran.
+ - A list of what is expensive to replace that contains something the audience sets with one flag.
+ - `Also covered:` as a label, where the anchor is a sentence saying the subject works behind those paths.
+ - A short post naming variables, keys or a script it does not show, so the reader has to go find them.
+ - An opener in the present indicative, which tells the reader the change has already happened to them.
+ - An opener built on `Nothing ... has to change`, where the forward sentence was available and shorter.
+ - A stance opener that dropped its reason clause to fit, leaving a bare preference.
+ - A question containing a duration, a workload or a measurement that appears nowhere in the post.
+ - A sentence that announces a thought before stating it (`The useful idea here is that ...`).
+ - A launch line or a variable added to a setup block because it seemed implied; the block carries what the source shows and nothing else.
+ - Retired model names, alias history, exact price windows, jurisdiction and storage wording or the full diagnostic block on feed posts.
+ - A hard-cap post that spends its budget on setup and drops the proof or the link.
+ - A deep article whose why section replaces the setup sections, or a guide with six paths collapsed into three generic headings.
+ - A command-heavy guide rendered as prose, or a source path list dropped because it looked like an inventory.
+ - Titles built on the mechanism or an abstraction, count-led titles, or the same title string on two files.
+ - The full published setup block on every surface where the minimal block plus one sentence was the shape, and the mirror failure: every secondary path carrying both its command block and a text block on every long form, so the article runs a third past its band.
+ - The same introducing sentence, the same read-the-script advice and the same scope sentence copied into every path section of every long form, as if the prose around a block were part of the anchor.
+ - Bold outside the proof numbers, a bold lead and the one-line lesson; emoji as bullets; an emoji count that ignores the interview.
+ - A closing that restates the post, a generic question, or the same recommendation sentence closing most of the pack.
+ - Frontmatter with scheduling or publishing keys, more than 3 links, or a different link set per file.
+ - A different central story per platform, or one essay mechanically trimmed to thirty lengths.
+ - Two packs on unrelated subjects that share a section spine, an opener grammar and a sentence-length band. That is the defect the dial exists to catch, and it is visible in a count rather than in a reading.
+ - Long-short-long alternation written to pass a rhythm floor. The floor asks for a spread that follows the thought, and a schedule is the newer tell.
+ - A creativity level used as permission to invent: an experience the author did not have, a stake the source does not carry, a number nobody verified, a contrarian line written for the shape of the sentence.
+ - One structure alternate applied to a whole class, which replaces a template with a template.
+ - A register chosen from the topic's vocabulary rather than from what the source does, or a register allowed to soften the caveat.
+ - Rhythm, tell or echo figures reported without being counted, and a fingerprint quoted in the brief that nothing actually selected.
+ - Raising the level because the source is thin. A source with two facts makes a short pack at every level.