{
 "skill": "product-announcement",
 "title": "Product announcement",
 "version": "1.4",
 "owner": "Sami Torres",
 "updated": "2026-08-03",
 "oneLine": "Turn an approved set of facts into a one-page notice, an email block, or a slide, using an approved template and nothing else.",
 "why": "A skill is a procedure with boundaries, not a prompt. Everything below is written down before the skill runs, which is what makes its output predictable enough to send without a designer looking at it.",
 "parts": [
  {
   "id": "reads",
   "label": "What it reads",
   "note": "Fixed inputs. If one is missing the skill stops rather than inventing a substitute.",
   "items": [
    {"name": "The brief", "detail": "The facts to announce, as fields. Product, change, effective date, price, who to contact."},
    {"name": "The brand tokens", "detail": "brand/color/apex-color-tokens.json. Colors and type come from here, never from the request."},
    {"name": "The template", "detail": "One of the three approved frames named below, read as a file, not remembered."},
    {"name": "The price sheet in force", "detail": "collateral/print/apex-price-sheet-2026-10-01.pdf. Any figure in the output has to match it."},
    {"name": "The asset index", "detail": "The stable url for any image or logo the template asks for. No file is chosen by filename."}
   ]
  },
  {
   "id": "template",
   "label": "The template it must use",
   "note": "Three approved frames. The skill picks between them by the channel named in the brief. It cannot create a fourth.",
   "items": [
    {"name": "One-page notice", "detail": "brand/templates/apex-one-pager.html. Letter, 8.5 by 11 inches, seven slots."},
    {"name": "Email block", "detail": "brand/templates/apex-email-block.html. 600 px wide, table layout, five slots."},
    {"name": "Slide", "detail": "brand/templates/apex-deck.potx, title and statement layout. 1280 by 720, five slots."}
   ]
  },
  {
   "id": "slots",
   "label": "The slots it may fill",
   "note": "Named, typed, and length limited. Anything outside this list is not a slot, and content that does not fit one is not shortened to make it fit.",
   "items": [
    {"name": "label", "detail": "Mono uppercase eyebrow. One of six approved labels.", "limit": "24 characters"},
    {"name": "hed", "detail": "The announcement in one sentence.", "limit": "90 characters"},
    {"name": "dek", "detail": "What changes and when, in one sentence.", "limit": "180 characters"},
    {"name": "body", "detail": "One or two paragraphs of plain prose.", "limit": "2 paragraphs, 480 characters each"},
    {"name": "facts", "detail": "Label and value pairs pulled from the brief and checked against the price sheet.", "limit": "3 to 5 rows"},
    {"name": "cta", "detail": "One action. The email and slide layouts allow one link with it.", "limit": "60 characters"},
    {"name": "contact", "detail": "A named person with a role, an example address, and a phone number.", "limit": "1 person"}
   ]
  },
  {
   "id": "checks",
   "label": "The checks it runs",
   "note": "Run on the output before anything is handed back. A failed check is a stop, not a warning.",
   "items": [
    {"name": "Token check", "detail": "Every color and font in the output resolves to a token. A literal hex that is not in the palette fails."},
    {"name": "Slot check", "detail": "Every filled slot exists in the template and every required slot is filled."},
    {"name": "Length check", "detail": "Each slot is inside its limit. Over-length copy is returned to the writer, not truncated."},
    {"name": "Figure check", "detail": "Every price, date, and turnaround in the output appears in the price sheet in force."},
    {"name": "Asset check", "detail": "Every image and logo is a stable url from the index with status current."},
    {"name": "Accent check", "detail": "One orange accent per page or view. A second one fails."},
    {"name": "House style check", "detail": "No dashes standing in for commas, no exclamation marks, phone numbers in the house format."}
   ]
  },
  {
   "id": "escalates",
   "label": "What it must escalate",
   "note": "Named in advance, so escalation is a step in the procedure rather than a judgment call at the moment of failure.",
   "items": [
    {"name": "Content with no slot", "detail": "A comparison table, a testimonial, a second contact. Goes to Sami Torres with the content attached."},
    {"name": "A genuinely new layout", "detail": "If the request needs a frame none of the three provide, the skill says so and stops. A person designs it, it gets approved, and it becomes template four."},
    {"name": "A figure that does not match", "detail": "A price or date not in the sheet in force goes to Jordan Vale before anything is drafted."},
    {"name": "A claim about a partner", "detail": "Anything naming Northlight Group goes through the co-brand rules and the account manager."},
    {"name": "An asset that is not current", "detail": "If the only matching asset is superseded or archived, the skill asks for a replacement rather than using it."}
   ]
  }
 ]
}
