Skip to content
Marketing
Skill

/save-learning

Shared step of the marketing playbooks (make-static-ads, analyze-performance, email-lifecycle, write-outreach): saves a short brand rule or finding in the human's own words, one idea per rule, retires the playbook's own older rules it replaces, and reads the result back to

BOOST
From plugin
goose-skills
1.3k200 skills
Install
$ npx -y skills add gooseworks-ai/goose-skills --skill save-learning --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.
  • Slash command/save-learning

Context preview

The summary Claude sees to decide when to auto-load this skill.

Shared step of the marketing playbooks (make-static-ads, analyze-performance, email-lifecycle, write-outreach): saves a short brand rule or finding in the human's own words, one idea per rule, retires the playbook's own older rules it replaces, and reads the result back to

SKILL.md

save-learning.SKILL.md
name: save-learning
description: >-
  Shared step of the marketing playbooks (make-static-ads, analyze-performance, email-lifecycle,
  write-outreach): saves a short brand rule or finding in the human's own words, one idea per rule,
  retires the playbook's own older rules it replaces, and reads the result back to confirm. Loaded by
  those playbooks; not for direct use.
version: 0.1.1

save-learning

Learnings are the brand's short rules. Every playbook writes them through this atom and nowhere else. There are two server paths, and this atom picks between them:

  • **Brain path:** when `brain_*` tools are listed (the Brand Brain). Save with `gooseworks:brain_save`, read back with `gooseworks:brain_open` / `gooseworks:brain_search`.
  • **Older path:** otherwise (production today). Save with `gooseworks:brand_update` `patch.facts`, read back with `gooseworks:brand_read`.
  • **Local mode** (no GooseWorks, [the `marketing-guide` skill](../marketing-guide/SKILL.md) §5): append to `gooseworks-local/<brand-slug>/brand-notes.md`, same opening, their words, dated. Read the file first; mark your own superseded line `retired <date>`; read it back.

The playbooks do not change between the paths.

Long evidence, tables and reports belong in a brand document (the `save-to-brain` skill (`../save-to-brain/SKILL.md`)); a learning is the rule or finding itself, in the human's words.

When you may write one

  • Only with the human's own words in `user_statement`: what they typed. An explicit approval such as "yes, save that rule" counts; your draft never goes there. On the older path also send `knowledge_intent: "user_correction"`; on the brain path, source `you`. Without their words, don't write it: put the finding in your document instead.
  • **Brand facts the marketer states** (an offer, a price) follow the guide's rule of that name (§3): save only an unambiguous fact, ask once if their words conflict, and search first (step 1 of either path) so one fact is one save.
  • `must` and `dont` only for rules the human stated or approved. Findings are `insight`; style guidance is `do`.
  • **One exception, brain path only:** a numbers-only **measured readout** of our own work (a budget move's before → after, a test result) may be saved as a fact without the human's words. It comes from the `run-memory` skill (`../run-memory/SKILL.md`) and goes to kind 23, field `experiment_readout.<id>`, with source `our_work`. Only a `worked` or `didn't work` verdict, labelled truth or claimed, and never from a scheduled run. It states numbers and dates, never a rule.
  • **Found, not confirmed** (the marketing-guide §1.4). A save waits for the human's yes in the GooseWorks app even in their own words: never call it confirmed or approved, and never accept a proposal unless the human said so in this conversation. Even then, the app may require them to accept it there; relay the link the refusal gives.

The text

  • **One idea per learning**, plain words, so it can be found, merged and retired on its own.
  • Opening:
  • **The brand's fixed openings:** `Claims sign-off (learn-my-brand, …`, `Claims you may use — …`, `Never say — …`, `Policy: …`, `Banned words — …`, `Not public — …`. Keep these openings exactly: they are a data format every playbook reads. Only the `claims-gate` skill (`../claims-gate/SKILL.md`) §5 writes or retires the marker and `Claims you may use —` facts. No playbook writes or retires the others; a playbook's own policy rule goes under its own `[<source> …]` opening.
  • **shared:** `Standing offer: <offer> until <date | ongoing> [owner, <date>]` only. email-lifecycle writes it and may retire or rewrite it when the owner changes the offer.
  • everyone else: `[<source> YYYY-MM-DD]`, source = `learning` (analyze-performance; add ` A-NN` for an angle) · `market` (research-market) · `angle A-NN` · `listening` (research-market's listening) · `search` (improve-search-visibility) · `lifecycle` (email-lifecycle) · `content` (make-content) · `social` (run-organic-social) · `ads` (make-static-ads) · `outreach` (research-audience) · `outreach-copy` (write-outreach) · `creators` (work-with-creators). One source per playbook, so "retire your own" never reaches another playbook's facts.
  • Example: `[lifecycle 2026-10-16] Never send a promo email the day after a shipping delay email.`
  • A **typed fact** (brain path, step 2) carries the value only, without the opening. Its kind and field say what it is, and `request_key` starts with the playbook slug.

Steps: brain path (`brain_*` tools listed)

1. **Read** the brain's rules and what is working. Use `gooseworks:brain_map` (the core already lists every rule and the never-list) with `kind: 14` for the full rules and `kind: 23` for learnings, or `gooseworks:brain_search` `source_types: ["learning"]` for the topic. Look for a learning that already says the same thing, and check `waiting_for_yes` too: the same rule may already be waiting for the human's yes. Don't save it twice. 2. **Pick the target.**

  • If the rule fits a **registered fact field**, save it as that fact (`brain_save` `fact`: kind + field). Engines read typed fields directly. Fields:
  • 15 "How we work together": `agent_may_do_alone.<item>`, `alert_on.<item>`, `reply_rule.<item>`, `reporting_rhythm`.
  • 18 "How we count results": `winning_number`, `conversion.<item>`, `attribution_window`, `lead_definition`, `naming_convention`.
  • 20 "Our plan": `no_go_list`, `target_cpa`, `target_roas`, `priority_products`, `decision.<item>`, `experiment.<item>`.
  • 23 "What is working": `worn_out_angle.<item>`, `experiment_readout.<item>`, `lesson`.

An unknown field is refused with the allowed list. Pick from that list, or fall back to a learning. Never invent a field. The `operating_plan.*` fields (budget caps, approvers, goals) belong to the playbooks whose spec owns them, not to this atom.

  • Otherwise, save a **learning** (`brain_save` target `learning`, with the kind and the text).
Read more
Ships withgoose-skills

Put your AI agent on the growth team. Research customers and competitors, analyze what is working, create the next campaign, and learn from the result.

Get the whole plugin

Other skills on goose-skills.