User Manual · 02 · The Content Engine
WholeReach — Automated Marketing System

The Content Engine

How real posts are written from real data — four content families, deterministic templates, and the honesty guard that never guesses.

Every night this system writes finished social posts — not drafts, not prompts, finished posts — from data it can actually verify. No creative-writing model sits in the loop guessing what your business did this week. It reads real facts and pours them into fixed sentence patterns. This page explains exactly how that works, and why it is the part of the system a partner or client should trust most.

The one idea that matters. The engine never states a fact it cannot verify from source data. If a template needs a number or a name and the data doesn't have it, the post is held — shown and flagged, never guessed. That single rule is what makes it safe to run on autopilot for paying clients.

What the content engine is

The content engine is the writing brain of the system. Once a night it turns the raw facts of a website network — the sites in it, the marketing principles behind them, and how their AI-readiness scores are moving — into short, publishable social posts. Those posts flow into a queue, and from there either go out automatically or wait for a human to approve them.

It is deliberately unglamorous. There is no large language model composing prose at post time. Instead there is a small library of proven sentence patterns, a clean feed of verified facts, and a set of rules deciding which pattern gets which fact tonight. The result reads like a person wrote it, but every claim in it traces back to a real row of data.

Think of it as the difference between a reporter and a novelist. A novelist can write forever from imagination. A reporter writes only what the sources support — and when a source is thin, the reporter holds the story rather than making something up. This engine is a reporter.

4
content families
177
sites it can spotlight
47
marketing principles
~278
char cap per post
Want the how-to, not the why? This page explains how the engine thinks. For the hands-on procedures — changing a post's wording, adding a whole new kind of post, and forcing a fresh feed — go straight to Playbook 6 (change wording), Playbook 7 (add a new post type), and Playbook 8 (refresh the feed).

The four content families

For the owner's own network (the tenant named wholetech), everything the engine writes falls into one of four families. Each feed item carries a kind, and a template applies only to items of its kind — and only when every field that template needs is present. Here is the whole cast at a glance:

Family (kind)What it postsWhere the facts come from
site_featureA spotlight on one site in the network — what it is and who it's for/root/wt-sites.json (177 sites: domain + description)
ai_tipA single, genuine marketing principle worth sharingThe AME skills library, skills-data.js (47 skills) — each skill's stated goal or a real principle heading
milestoneA real week-over-week gain in a site's Agents-First AI-readiness scoreScore snapshots /root/ama-snapshots/scores-*.json (this week vs last)
spotlight (new_site)Announces a site newly added to the scorerScore snapshots — new entries that weren't there last week

site_feature — the network tour

This is the workhorse. With 177 sites on hand, the engine has a deep, honest well of things to say: each item is simply a real domain and its real one-line description, straight from the sites file. The template introduces the site and what it does, then links to it. Because the description is written once, by hand, and reused verbatim, there is nothing to hallucinate.

EXAMPLE (illustrative — not a real post): given the entry {"domain":"asiafilmfests.com","desc":"A guide to Asian film festivals across the region"}, a site_feature template might produce — “New in the network: asiafilmfests.com — a guide to Asian film festivals across the region. Take a look → https://asiafilmfests.com”

ai_tip — teach, don't sell

Not every post should be about you. The ai_tip family shares one real marketing principle at a time, drawn from a library of 47 skills. The feed builder prefers each skill's own stated goal; if that isn't clean, it falls back to a genuine principle heading from the skill. What it never does is invent a “tip” out of thin air — the words come from the library, not from a model's imagination.

EXAMPLE (illustrative — not a real post): from a skill whose stated goal is “make every page answer the question a buyer is actually typing,” an ai_tip template might produce — “Marketing principle: make every page answer the question a buyer is actually typing. It's the difference between traffic and customers.”

milestone — proof the work works

This is the family clients care about most, because it is a receipt. The engine compares this week's Agents-First scores against last week's and looks for real movement. It only celebrates a gain when it clears a meaningful bar: the improvement is at least 5 points and the site has landed at 60 or above. Small noise and low scores don't get a victory lap.

EXAMPLE (illustrative — not a real post): if a site's score rose from 71 to 84 week-over-week, a milestone template might produce — “Progress report: bastropfiber.com's Agents-First score climbed from 71 to 84 this week (+13). Steady, measurable gains.”

spotlight / new_site — the welcome

When a site appears in the scorer for the first time — an entry that simply wasn't in last week's snapshot — the engine marks the occasion. It's a lighter cousin of the milestone: the fact is “this is new,” sourced the same honest way, by diffing the score snapshots.

EXAMPLE (illustrative — not a real post): on a first appearance, a new_site template might produce — “Just added to the lineup: roquegame.com joins the network. Fresh site, tracked from day one.”

The honesty guard

This is the heart of the whole system, so it's worth slowing down on. Every template declares, up front, the exact fields it needs to make sense — a domain, a description, a before-score, an after-score, a principle. Before the engine writes a single post, it checks that every declared field is actually present in the source item. If even one is missing, the post is held.

What “held” actually means

Held is not deleted and it is not silently dropped. A held post is surfaced and flagged so a human can see it — but it is never published. The engine would rather say nothing than say something it can't stand behind. Crucially, it never reaches into the gap and fills a missing number or name with a plausible-sounding guess. A blank stays blank; the post waits.

Why this matters for clients. When you run marketing on autopilot for a paying customer, the nightmare scenario is a confident, wrong claim going out under their name — a made-up statistic, a milestone that didn't happen. The honesty guard makes that structurally impossible: a fact that isn't in the data can't appear in a post, because the post that would carry it never publishes. That's what makes unattended, multi-client operation safe.

A worked example

Suppose a milestone item arrives for a site whose score clearly rose, but the snapshot diff produced only the new score — the prior week's number is missing (say last week's snapshot was incomplete). The milestone template declares it needs both the before and the after value to write “climbed from X to Y.” With the before-score missing:

source
Item has after=84, before=(missing). The gain is real but not fully documented.
check
Template needs before + after. One required field is absent.
decision
HELD. No post is published. It's flagged for a human, not guessed — the engine will not invent “from 79” to make the sentence work.

A guessing system would have happily written “climbed from 79 to 84.” This one writes nothing until the number is real. That restraint is the feature.

Deterministic templates

A template here is a fixed sentence pattern with labeled slots — something like “New in the network: {domain} — {desc}. Take a look → {url}”. The engine fills the slots with verified fields and that's the post. There is no model deciding phrasing at post time; the phrasing was decided once, by a person, when the template was written.

Why it costs nothing to run

Because filling a template is just string substitution, generating a post consumes no AI tokens and calls no paid API. The consequence is dramatic: writing 1,000 posts costs exactly what writing one costs — effectively nothing. The system's whole monthly cost is the hub server, not the content. This is why the economics don't climb with scale, and why it can run for many tenants without the bill following.

Flat economics, by design. Content generation is template-based and free. The only channel that ever costs money is paid X posting. Everything about writing, holding, rotating, and formatting posts is zero marginal cost — the reason this scales to a whole network and a roster of clients on a flat subscription.

Predictability — and the honest tradeoff

Deterministic templates buy you predictability. You can read a template and know precisely what every post it produces will look like. Nothing goes out that a human didn't pre-approve at the pattern level. There are no surprises, no drift, no 2 a.m. hallucination.

The tradeoff, stated plainly, is range. A generative model can write with more surprise and variety than a fixed pattern. This system trades some of that flair for total control and zero cost — a deal that's clearly worth it when the alternative is unverifiable claims going out unattended under a client's name. It chooses trust over flourish.

How variety is achieved anyway

Fixed patterns don't have to mean repetitive feeds. Each family carries multiple template variants — several different phrasings of the same idea — so the same kind of fact reads differently from one post to the next. Combine that with hundreds of distinct sites and dozens of principles as raw material, and the output stays fresh without ever wandering off the facts. The variety lives in the selection, not in improvised wording.

Change the words safely. Because templates are plain patterns, editing them is low-risk and doesn't touch the data or the honesty guard. See Playbook 6 to reword an existing family, and Playbook 7 to add an entirely new one.

The feed builder pipeline

Templates are only half the story. They're empty until something hands them clean, verified facts — and that's the feed builder's job. It runs on the MAIN server (143.198.182.180), where the whole website network and all its source data live, as the script /root/gen-social-feed.py on a nightly cron at 05:00 UTC.

Turning three raw sources into clean items

The builder reads each source and reshapes it into the tidy, typed items the templates expect:

  • Site list cleaning. It reads the 177-site file, trims and normalizes each domain and description, and emits one site_feature item per usable site — skipping anything malformed so no half-built entry reaches a template.
  • Pulling a real principle from each skill. For the 47-skill library it doesn't paraphrase; it lifts each skill's own stated goal where possible, and falls back to a genuine principle heading otherwise, producing ai_tip items whose words came from the library.
  • Computing score gains week-over-week. It loads this week's and last week's score snapshots, diffs them, and derives milestone items (gain ≥ 5 and score ≥ 60) and new_site items (entries present now but absent last week). The math is done here, once, so the templates only ever see finished numbers.

Where it runs, and how it ships to the hub

The builder lives on MAIN because that's where the source data is — and MAIN is memory-constrained, which is exactly why the publishing brain sits on a separate hub. Once the feed is built, the script copies it to the hub at /opt/portal/listings/wholetech.json. From there, the hub's own drafting step (generate.py, cron 05:10 UTC) picks it up and turns items into queued posts.

05:00 UTC · MAIN
gen-social-feed.py builds the feed. Cleans sites, pulls principles, computes score gains → clean typed items.
ship
scp to the hub. Lands at /opt/portal/listings/wholetech.json.
05:10 UTC · HUB
generate.py drafts posts. Applies templates + the honesty guard, writes the queue.
See the whole nightly chain. The feed step is one link in a larger cron chain (draft, publish-due, report, backup). The end-to-end flow is laid out on How It Works, and the source files themselves are catalogued on Data Sources. To force a fresh build on demand, use Playbook 8.

Rotation & variety

With 177 sites and dozens of principles, the engine has far more to say than it should say at once. Two simple rules keep the feed varied and fair.

Least-recently-used first

When choosing what to post next, the engine reaches for whatever it has gone longest without using. This least-recently-used ordering means the system works its way through the entire network before it circles back to repeat anything — every site gets its turn in the spotlight before any site gets a second one.

A per-family cap

On top of that, each family has a cap so the feed doesn't tip into a monotone. Without it, the huge site_feature pool could crowd out the tips and the milestones. The cap guarantees a mix — some spotlights, some teaching, some proof — in any given stretch.

The net effect. Least-recently-used spreads attention evenly across the whole network, and the per-family cap keeps every day's feed feeling balanced rather than repetitive. Variety without randomness, and without ever leaving the verified facts.

Length & formatting rules

Posts are built for the platforms they land on, so the rules are strict and simple.

  • Length cap. Every post is capped at roughly 278 characters, keeping it comfortably within the tightest mainstream limits and readable at a glance. Templates are written to fit inside that budget once their fields are filled.
  • Links. Where a post points to a site, it uses the site's clean canonical URL. On X, a post that carries a link costs meaningfully more than a plain one — a fact the cost controls account for (see Connecting Social Platforms).
  • One idea per post. Each family says one thing — a site, a principle, a gain, a welcome. Short and single-purpose beats crammed.
Note. Because the length cap is enforced at the template level, a template that would overflow once its fields are dropped in should be tightened rather than left to truncate mid-sentence. Keep new variants lean — see Playbook 6.

Quality controls & changing the content

Several layers keep quality high, and each maps to a place you can adjust it:

ControlWhat it protectsWhere to change it
The honesty guardNo unverifiable claim ever publishesField declarations in the templates
Milestone thresholds (≥5, ≥60)Only meaningful, credible gains are celebratedThe feed builder on MAIN
Template variantsFreshness without driftPlaybook 6
A new content familyNew kinds of true things to sayPlaybook 7
Fresh feed on demandActing on today's data now, not tomorrowPlaybook 8
Human approval (optional)A person sees posts before they flyManaging Clients · Playbook 3

For grading accuracy specifically, one real gotcha is worth knowing: if a site looks mis-scored, it may be throttling automated requests, so the engine graded a blocked page instead of the live site. The fix is to make sure it reads the live site — see Troubleshooting & Recovery.

Why this beats volume and “AI slop”

The market is full of tools that will generate an endless torrent of posts from a prompt. They optimize for volume, and volume is cheap to fake. The problem shows up the moment one of those posts states something that isn't true — a fabricated statistic, a milestone that never happened, a claim no one can back up — going out unattended under a real business's name.

This engine is built on the opposite bet: that a smaller stream of posts you can completely stand behind is worth more than a firehose you have to police. Four things set it apart:

  • Real data, not invention. Every post traces to a source row — a site description, a library principle, a computed score gain.
  • The honesty guard. A fact that isn't in the data cannot appear in a post. Missing fields hold the post; they never get guessed.
  • Flat economics. Template writing is free, so cost doesn't climb with scale or with the number of clients — the whole system runs at the price of one small server.
  • It closes the loop. With an optional human approval step and the ability to publish and then measure, this doesn't just draft — it runs the marketing.
The bottom line. Anyone can generate a thousand posts. The hard, valuable thing is generating posts a partner can put their name on without reading each one — because the system structurally cannot lie. That's the difference between a novelty and a business you can hand a client.

Ready to see how it all fits together? Start with How It Works, then walk the hands-on steps in the Playbooks.