---
# Guided mode — the interaction protocol an agent follows BEFORE it produces an
# asset. This file exists because a short, human prompt ("make me a poster")
# leaves most brand parameters unspecified, and an agent that guesses silently
# is exactly how output drifts off-brand.
#
# It is brand data (it names this brand's defaults), so it lives here. The
# framework only projects it: /intake.md, get_intake, the skill, llms-full.txt.
#
# Parameter values below are DEFAULTS, never new brand values: everything
# concrete (colours, type, components, canvases, icon sets) is resolved from
# design.md, layouts.md, icons.json and verbal-identity.md.
version: 1

# guided  = fill defaults, ask only for blocking parameters, then produce + report
# ask-all = ask every parameter first (slower; not the default here)
# off     = produce immediately from defaults, report afterwards
mode: guided

# Never ask more than this many questions in one turn.
maxQuestions: 3

# If the user replies with any of these, stop asking and use the defaults.
goWords: ["go", "choď", "chod", "ok", "poď", "just do it", "urob to"]

protocol:
  - "Identify the output type from the request (see `outputs` below, matching on `match` keywords). If nothing matches, use the closest type and say which one you used."
  - "Fill every parameter of that type from its `default`. Defaults are a starting point, never an invention: resolve each one to a real value from the brand spec (design.md, layouts.md, icons.json, verbal-identity.md)."
  - "Ask for parameters marked `blocking` that the request has not already answered, at most `maxQuestions` of them, in one message. Give each question a suggested answer in brackets, and end with: reply `go` to accept all suggestions."
  - "The parameter list is a floor, not a ceiling. You may add your own question when `ownQuestions` allows it: use your judgement about what this specific request needs, inside the boundary that block sets. It comes out of the same `maxQuestions` budget."
  - "If the user replies with a `goWord`, or already gave the content, produce the asset immediately. Never ask twice about the same thing."
  - "After the asset, append the `brandChoices` block: every parameter you resolved, the value you used, and the one-word alternative. Then offer the `nextStep` of that output type as a single question."
  - "If the user answers with one of those words, redo only what that word changes. Keep everything else identical."
  - "Run the `selfCheck` list before you deliver. Anything on the `locked` list is not a parameter and is never offered as a choice."
  - "Write the questions and the report in the language the user is writing in, whatever the brand's own default language for the copy is."

brandChoices:
  title: "Brand choices"
  hint: "reply with one word to change any of these"
  lockedNote: "Fixed by the brand, not offered as a choice: the accent, the typeface, the logo colours and the UPPERCASE headline rule."
  example: |-
    Brand choices (reply with one word to change any of these):
    • Surface: dark          (want "light"?)
    • Format: 4:5            (want "1:1" or "16:9"?)
    • Icons: none            (want "line icons" or "3d icons"?)
    • Logo: wordmark lockup  (want "symbol"?)
    • Language: Slovak       (want "English"?)
    The accent stays the signature yellow and the headline stays UPPERCASE. Those are fixed.
    Want the Instagram 1080x1350 version of this too?

# The licence to ask something nobody wrote down here, and its boundary.
#
# The parameter list above covers what recurs. It cannot cover what is specific
# to one request: a launch date, whose logo goes beside ours, which of three
# products this is about. Without this block an agent that spots a genuine gap
# has two bad options, guess or interrogate, and the whole point of guided mode
# is that it does neither. `when` is the licence, `never` is the boundary, and
# both are read as judgement prompts, not as a checklist to work through.
ownQuestions:
  allowed: true
  # How many of the maxQuestions budget may be your own. The rest stay for the
  # blocking parameters.
  max: 1
  when:
    - "The request needs a fact only the user has: a date, a number, a price, a client or product name, a market, an audience, an event."
    - "Two readings of the request would produce materially different assets and the brand prefers neither. Ask which, do not average them."
    - "The request implies something the brand genuinely does not cover, and the fallback contract would change the outcome rather than just fill a gap."
    - "Something in the request contradicts the brand and the way out is a real choice: a format the catalogue does not have, a claim the voice rules will not carry, a channel with its own constraints. Name the conflict and ask which way to go. If the conflict is with a `locked` value (a different accent colour, a recoloured logo), do NOT ask: say plainly what the brand does instead, then carry on. Asking would imply it was negotiable."
  never:
    - "Anything on the `locked` list. Those are not choices and asking implies they are."
    - "Anything that already has a `default`. Fill it and report it in the `brandChoices` block; the user changes it in one word if they want to."
    - "A preference you can infer from the request, the brand, or what was already said in this conversation."
    - "Confirmation of something already agreed, or a question you have asked once. Never ask twice."
    - "A question you cannot act on differently depending on the answer. If both answers lead to the same asset, do not ask it."

# Not parameters. Never offer these as a choice, never ask about them.
locked:
  - "The accent colour. It is always the brand primary, on every surface, in every state."
  - "The typeface and the type scale. Both come from the design spec."
  - "The logo. White or black only, never recoloured, never retyped as text."
  - "The UPPERCASE rule for H1/display headlines and section titles (H2)."
  - "The chart palette. Charts never use a library-default rainbow."
  - "Status colours (success/warning/error/info). Functional feedback only, never decoration."

# The last gate before delivering. Cheap to run, catches the usual drift.
selfCheck:
  - "The accent is the brand primary, used for emphasis only, never as a large fill."
  - "The case follows `typeRules.case`."
  - "The logo is white or black, hotlinked from its real asset URL, not redrawn or retyped."
  - "Every text colour came from a role or a `.bl-text-*` class and satisfies `colorRules.text`; on a light surface it came from the `lightSurface` map, not from a dark-tuned token."
  - "Every colour, size, radius and component came from the spec, or from `fallback` where the spec is silent."
  - "Any chart uses the chart palette; any icon comes from the icon library, in the variant that matches the surface."
  - "Copy follows the verbal identity (register, lexicon, mechanics), not generic marketing language, and contains no em dash."
  - "Anything the spec does not define went through the fallback contract."

outputs:
  - id: poster
    name: "Poster / out-of-home"
    match: ["poster", "plagát", "plagat", "billboard", "citylight", "print ad", "flyer"]
    nextStep: "a social version of the same poster on the portrait canvas"
    params:
      - id: headline
        question: "What is the headline?"
        blocking: true
        default: "a short brand line drawn from the verbal identity"
        note: "One line, UPPERCASE, with a single word carrying the accent."
      - id: surface
        question: "Dark or light version?"
        default: "dark"
        options: ["dark", "light"]
      - id: format
        question: "Which format?"
        default: "4:5 portrait"
        options: ["4:5 portrait", "1:1 square", "A3 print", "16:9 landscape"]
        note: "Poster formats are print sizes, not slide canvases: only 4:5 and 1:1 have a measured equivalent in the layout catalog (1080x1350 and 1080x1080). For A3 and 16:9 there is no measured geometry, so derive it from the canvas rules and say so in the brand-choices block."
      - id: icons
        question: "Use an icon or a geometric motif?"
        default: "none"
        options: ["none", "line icons", "3d icons", "geometric motif"]
      - id: image
        question: "Use a photograph?"
        default: "no"
        options: ["no", "yes"]
      - id: logo
        question: "Which logo variant?"
        default: "primary wordmark lockup"
        options: ["primary wordmark lockup", "wordmark", "symbol"]
      - id: language
        question: "Which language?"
        default: "Slovak"
        options: ["Slovak", "English"]

  - id: social
    name: "Social post (visual + caption)"
    match: ["instagram", "social", "post", "facebook", "linkedin post", "carousel", "story"]
    nextStep: "the rest of the carousel using the recipe for this post type"
    params:
      - id: topic
        question: "What is the post about?"
        blocking: true
        default: "the brand's central idea from the verbal identity"
      - id: surface
        question: "Dark or light version?"
        default: "dark"
        options: ["dark", "light"]
      - id: canvas
        question: "Which canvas?"
        default: "1080x1350"
        options: ["1080x1350", "1080x1080"]
        note: "These are the two MEASURED canvases and the exact strings `get_layout { id, ratio }` accepts: pass the value as it stands here. Call them portrait and square when you talk to the user, never when you call the tool. Resolve the geometry from the layout catalog, never by hand."
      - id: layout
        question: "Which layout archetype?"
        default: "cover"
        note: "Pick from the layout catalog; follow that layout's slot schema exactly."
      - id: icons
        question: "Use icons?"
        default: "none"
        options: ["none", "line icons", "3d icons"]
      - id: image
        question: "Use a photograph?"
        default: "no"
        options: ["no", "yes"]
      - id: caption
        question: "Write the caption too?"
        default: "yes"
        options: ["yes", "no"]
      - id: language
        question: "Which language?"
        default: "Slovak"
        options: ["Slovak", "English"]

  - id: deck
    name: "Presentation / deck"
    match: ["deck", "presentation", "prezentácia", "prezentacia", "slides", "slajd", "pitch"]
    nextStep: "a PDF export, or a PPTX you can edit in PowerPoint"
    params:
      - id: topic
        question: "What is the deck about?"
        blocking: true
        default: "the brand's positioning story from the verbal identity"
      - id: slides
        question: "How many slides?"
        default: "10"
      - id: surface
        question: "Dark, light, or a mix?"
        default: "mixed"
        options: ["dark", "light", "mixed"]
        note: "Mixed means dark throughout with one light section in the middle, so the inversion reads as deliberate."
      - id: ratio
        question: "Which aspect ratio?"
        default: "16:9"
        options: ["16:9", "4:3", "1080x1350"]
        note: "16:9 is the presentation catalog (`list_presentation_slides`, `get_presentation_slide`): a 1920x1080 canvas with its own type scale and footer, and a slide type for each job. Plan the deck from it slide by slide. 1080x1350 is the social layout catalog (`get_layout`). 4:3 has NO catalog: build it from the 16:9 canvas rules and say in the brand-choices block that the canvas is derived, not measured."
      - id: sequence
        question: "Which slide types, in which order?"
        default: "picked from the presentation catalog by the content: cover-main, agenda, a divider per chapter, the content slides, cover-closing"
        note: "Never a question to the user: derive it. Pick each slide by its intent, density and limits, obey the deck rules, and list the chosen ids in the report block."
      - id: format
        question: "Which file format?"
        default: "HTML"
        options: ["HTML", "PPTX", "PDF"]
        note: "HTML first: it renders anywhere and both PDF and PPTX can follow from it."
      - id: icons
        question: "Use icons on the pillar slides?"
        default: "line icons"
        options: ["none", "line icons", "3d icons"]
      - id: chart
        question: "Include a data slide?"
        default: "yes"
        options: ["yes", "no"]
      - id: language
        question: "Which language?"
        default: "Slovak"
        options: ["Slovak", "English"]

  - id: table
    name: "Table / data sheet"
    match: ["table", "tabuľka", "tabulka", "spreadsheet", "matrix", "comparison"]
    nextStep: "a chart of the same data"
    params:
      - id: data
        question: "What data goes in it?"
        blocking: true
        default: "a plausible sample set, clearly labelled as sample data"
      - id: size
        question: "How many columns and rows?"
        default: "5 columns, 5 rows"
      - id: surface
        question: "Dark or light version?"
        default: "light"
        options: ["dark", "light"]
      - id: tags
        question: "Use status tags in a column?"
        default: "no"
        options: ["no", "yes"]
        note: "Status colours are functional only. A tag is a state, never decoration."
      - id: language
        question: "Which language?"
        default: "Slovak"
        options: ["Slovak", "English"]

  - id: chart
    name: "Chart / data visualization"
    match: ["chart", "graf", "graph", "plot", "dashboard", "kpi"]
    nextStep: "a second chart type on the same data, or a stat-tile row above it"
    params:
      - id: data
        question: "What data should it show?"
        blocking: true
        default: "a plausible sample series, clearly labelled as sample data"
      - id: type
        question: "Which chart type?"
        default: "bar chart"
        options: ["bar chart", "line chart", "donut", "stacked bar", "stat tiles"]
      - id: surface
        question: "Dark or light version?"
        default: "dark"
        options: ["dark", "light"]
      - id: series
        question: "How many series?"
        default: "1"
        note: "One highlight per chart: the accent marks the series that matters, the rest are neutrals."
      - id: language
        question: "Which language?"
        default: "Slovak"
        options: ["Slovak", "English"]

  - id: copy
    name: "Copy / text"
    match: ["copy", "text", "post text", "email", "ad", "claim", "article", "script"]
    nextStep: "a visual to go with the copy"
    params:
      - id: subject
        question: "What is it about, and who reads it?"
        blocking: true
        default: "the brand's positioning, addressed to a C-level reader"
      - id: register
        question: "Which register?"
        default: "consultative"
        note: "Pick from the registers in the verbal identity, by channel and audience."
      - id: length
        question: "How long?"
        default: "short"
        options: ["short", "medium", "long"]
      - id: cta
        question: "Which call to action?"
        default: "one soft next step"
      - id: language
        question: "Which language?"
        default: "Slovak"
        options: ["Slovak", "English"]

  - id: web
    name: "Web page / UI"
    match: ["landing", "page", "web", "site", "ui", "dashboard ui", "form", "component"]
    nextStep: "the light-surface inversion of the same page"
    params:
      - id: purpose
        question: "What is the page for, and what should it say?"
        blocking: true
        default: "a single-message landing page built on the brand's positioning"
      - id: surface
        question: "Dark or light version?"
        default: "dark"
        options: ["dark", "light"]
      - id: sections
        question: "Which sections?"
        default: "hero, three content sections, footer"
      - id: components
        question: "Take the markup from the component snippets?"
        default: "yes"
        options: ["yes", "no"]
        note: "Link the hotlinkable brand stylesheet and use the component classes; do not restyle by hand."
      - id: language
        question: "Which language?"
        default: "Slovak"
        options: ["Slovak", "English"]
---

## Why guided mode exists

A brand system only holds if the person using it does not have to know it. Most
real prompts are one sentence long ("make me a poster, black version"), and one
sentence cannot carry a surface, a format, a logo variant, an icon set and a
language. Something has to fill the gaps. Left alone, a model fills them with
its own defaults, which is exactly the drift this knowledge base exists to
prevent.

Guided mode makes the gap-filling explicit and reversible. The agent fills every
missing parameter from the defaults above, asks only about what it genuinely
cannot infer (usually the content itself), produces the asset, and then reports
what it chose in one short block, with the one-word way to change each choice.
The user gets a result on the first turn and still keeps control of every
decision that was made for them.

## What is a parameter and what is not

A parameter is a legitimate fork in the road: dark or light, portrait or square,
icons or no icons, Slovak or English. The `locked` list is the other kind: the
accent, the typeface, the logo colours, the UPPERCASE headline rule, the chart
palette. Those are not preferences. Offering them as choices would turn a brand
system back into a mood board, so the protocol never puts them in the report and
never asks about them.

The defaults themselves are conservative on purpose. They point at the safest
on-brand answer, never at a new value: "dark", "4:5", "no icons", "wordmark
lockup" all resolve to something the spec already defines.

## Room for judgement

A fixed list of questions can only cover what recurs. It cannot cover the
launch date, the client whose logo sits beside ours, or which of three products
a post is actually about. So the protocol carries a licence: the agent may ask
one question of its own when the request genuinely needs a fact only the person
asking has, when two readings would produce materially different assets, or
when the request contradicts the brand.

The boundary matters as much as the licence. It may not ask about anything on
the locked list, anything that already has a default, anything it could infer,
or anything whose answer would not change what it makes. The test is simple: if
both answers lead to the same asset, the question is noise. One good question
beats three polite ones, and no question at all beats a guess in a report the
user can read.
