GenieOS · Strategy

Strategy is an object.

Not a deck, not a document in someone's drive. read_marketing_strategy returns what the business is trying to do as structured JSON, so no agent in any repo has to be told. And because it is an object it can be written to: patch_marketing_strategy is how the loop turns a measured result into the next campaign's starting point.

agent.tsts
// what is this business trying to do? one call, no briefingconst strategy = await genieos.read_marketing_strategy(); strategy.northStar   // "weekly active health profiles"strategy.audiences   // ICP ids, full objects via read_icpstrategy.channels    // where the conviction currently sitsstrategy.kpis        // columns in Fueld's own database
The surface
  • read_marketing_strategyThe standing strategy as JSON: north star, competitors, audiences and ICPs, channel mix, KPIs.
  • patch_marketing_strategyPropose a change to the standing strategy. Holds for your acknowledgement before it takes effect.
  • list_icpsEvery ICP the strategy targets.
  • read_icpOne ICP in full: who they are, what they care about, where they read.
  • approve_creation_strategySign off the per-campaign tier, objective to design, before a word of copy exists.
read_marketing_strategy.jsonjson
{  "northStar": "weekly active health profiles",  "competitors": ["the spreadsheet", "doing nothing"],  "audiences": ["icp_quantified_self", "icp_founder_smes"],  "channels": {    "email": "primary",    "social": "growing",    "pages": "launches"  },  "kpis": [    { "column": "users.activated_at", "target": "+15%" }  ]}

Two tiers, kept deliberately apart.

Business strategy is standing: the north star, the competitors, the audiences and ICPs, the channel mix, the KPIs that matter. It changes rarely and deliberately, and read_marketing_strategy and patch_marketing_strategy are its two verbs.

Campaign strategy is per campaign: this objective, this audience, this message, these channels, this design direction, settled before a word of copy exists. approve_creation_strategy is where it gets signed off. The product keeps the tiers separate because they change at different speeds and answer to different judgements, and the API keeps them separate for the same reason.

patch.jsonjson
{  "status": "proposed",  "changes": {    "channels": { "email": "raise conviction" },    "audiences": { "icp_quantified_self": "lead" }  },  "evidence": "the-directory beat its email target by 12%",  "awaiting": "your acknowledgement"} // nothing downstream is derived from this// until a human says so

An agent proposes. A human acknowledges.

patch_marketing_strategy does not quietly rewrite the company's direction. A patch arrives as a proposal with its evidence attached, and it holds until a human acknowledges it. It is the same shape as propose_template_change on the email surface: agents draft, people decide.

This is a design, not a limitation. The strategy object sits upstream of everything, because the next campaign is derived from it, so a bad write here compounds. Making the write cheap and the acknowledgement human is what lets you give agents real reach without handing over the steering wheel.

IN-APP · HAND OVERThe objective and its bound KPI, readable by a founder who will never call an endpoint.
AnalyzeFueld
OverviewEmailSocialPageMessageCampaign

OBJECTIVE · THIS CAMPAIGN

users.activated_atwithin 7 days of sign-up

412of 500 target

Measured in your own database. Missed by 18%, so the next campaign is already drafted against what moved.

The hinge of the loop.

Here is why strategy is an object rather than a page of prose. The loop measures a campaign against the KPI it was born with, a column in your own database. The result patches this object. The next campaign is derived from the patched object. That chain is the whole product, and this is the link where learning becomes state.

It also has an audience that will never call an endpoint. A founder reads the strategy in the app, sees what the last campaign moved against its bound KPI and what the next one intends, and acknowledges the patch from there. You gave them a view, not a JSON viewer.

When this happens
  • WhenYou set one objective, once

    ThenThe loop creates, launches, measures, learns and goes again, holding at your checkpoints

    • spawn_creation
    • decide_approval
  • WhenA weekly cron fires

    ThenLast week's numbers read, the strategy patched from what worked

    • get_social_post_analytics
    • patch_marketing_strategy

Learning becomes state.