Хай усе зробить ваш AI-агент

Якщо ви працюєте з Claude Code, Codex, Cursor чи іншим асистентом — не заповнюйте анкету руками і не носіть JSON у буфері обміну. Киньте йому одне посилання: він сам збере ваш AI-досвід, заповнить профіль, відкриє чорновик сторінки, перевірить його на випадковий витік чужих даних — і повернеться до вас із питанням «публікуємо?».

Публікує тільки з вашого дозволу. Так написано в інструкції, і ви можете прочитати її повністю нижче — ми нічого не ховаємо.

Один рядок — і все

Вставте його у свій Claude Code / Codex / Cursor. Агент прочитає інструкцію і дасть вам посилання: там ви входите через Google і тиснете одну кнопку. Далі він зробить усе решту — аж до питання «публікуємо?».

Зайди на https://aiadvisoryboard.me/catalog/agent/instructions.md , прочитай інструкцію і зроби все, що там написано.

Що робитиме агент

  1. Прочитає цю сторінку, покаже вам інструкцію і попросить доступ: дасть одне посилання. Ви входите через Google і тиснете «Дозволити» — це єдина ваша дія, бо створювати акаунти і вводити паролі агент не має права. Вводити нічого не треба.
  2. Збере факти зі своїх контекстів і запитає у вас те, чого знати не може: ставку, країну, англійську, контакти.
  3. Заллє профіль як чорновик — сторінку поки бачите тільки ви.
  4. Відкриє чорновик і сам перевірить його на витік чужих даних.
  5. Покаже результат і запитає дозволу. Опублікує тільки після вашого «так».
  6. Запропонує раз на місяць дописувати нові проєкти — теж щоразу питаючи дозволу. Нагадування продублюємо в Telegram-бот.
Контроль лишається у вас. Без вашого «так» нічого не публікується — ні першого разу, ні під час щомісячних оновлень. Ви будь-коли бачите свою сторінку в кабінеті, можете відредагувати чи прибрати будь-що руками, зняти сторінку з публікації однією галочкою або відкликати доступ агента — після цього його ключ перестає працювати.

Хочете віддати ключ одразу?

Необовʼязково — агент попросить доступ сам. Але якщо зручніше дати йому готовий ключ (або треба відкликати старий), увійдіть, і рядок зʼявиться тут.

Увійти через Google →

Повна інструкція для агента

відкрити як чистий markdown →

Нижче — весь текст, який виконуватиме ваш асистент. Прочитайте його самі: там написано, які дані він бере, чого не має права вигадувати, як перевіряє сторінку і що публікувати можна лише з вашого явного дозволу.

# Інструкція для AI-агента: зібрати й опублікувати профіль експерта

Ти — AI-агент (Claude Code, Codex, Cursor або інший), якому людина дала це
посилання. Ти зробиш усю роботу сам: збереш факти, заллєш профіль, подивишся,
як виглядатиме сторінка, перевіриш її на витік чужих даних — і візьмеш у людини
дозвіл на те, що побачать замовники.

⚠️ **Коли саме брати дозвіл — залежить від того, чи сторінка вже в ефірі.** Якщо
профіль ще не опублікований, дозвіл береться в кінці, перед публікацією. Якщо
профіль УЖЕ опублікований — дозвіл береться ПЕРЕД заливкою, бо заливка й є
публікацією. Не будуй план роботи, поки не пройшов **Крок 2** — саме там ця
розвилка вирішується запитом до сервера.

**Ця інструкція повністю відкрита. Покажи її людині, якщо вона ще не читала —
вона має бачити, що саме ти робитимеш від її імені.**

## Крок 0 — отримай доступ САМ (людина нічого не копіює)

⚠️ **Спершу чесно перевір, чи ти взагалі можеш виконувати команди.** Парування
і заливка йдуть через HTTP-запити; якщо ти звичайний чат без терміналу
(ChatGPT, Claude у браузері, Gemini) — ти цього не зробиш, і не треба вдавати.
Твій шлях такий: збери JSON за шаблоном нижче, віддай його людині і **дай їй
рівно одне посилання**:

> Готово. Відкрий https://aiadvisoryboard.me/catalog/paste, встав туди цей JSON — і побачиш свій профіль
> перед публікацією.

**Не лишай людину з JSON без цього посилання.** Саме так ми вже втратили
повністю заповнений профіль: агент віддав JSON у чат, людина пішла шукати в
кабінеті, куди його подіти, не знайшла — і робота на дванадцять кейсів так
нікуди й не доїхала. Один рядок із посиланням коштує нічого, а без нього вся
твоя робота лишається текстом у чаті.

Далі цей крок — для агентів, які МОЖУТЬ виконувати команди.

Тобі потрібен персональний ключ людини — рядок виду `cat_xxxxx_yyyyy`. Якщо
вона вже дала його разом із завданням, пропусти цей крок. Якщо ні —
**не проси її нічого копіювати**, візьми ключ сам, як це роблять `gh auth
login` чи вхід у стрімінг на телевізорі:

```bash
curl -sS -X POST https://aiadvisoryboard.me/catalog/api/agent/pair/start
```

У відповіді буде `verifyUrl` (готове посилання для людини) і `deviceCode` —
**твій секрет, нікому його не показуй і не виводь у чат**.

Дай людині посилання і НЕ проси її нічого вводити, звіряти чи копіювати:

> Відкрий `<verifyUrl>`, увійди через Google і натисни «Дозволити».
> Це одна кнопка, вводити нічого не треба.

Далі опитуй раз на 5 секунд:

```bash
curl -sS "https://aiadvisoryboard.me/catalog/api/agent/pair/poll?device_code=<deviceCode>"
```

- `{"status":"pending"}` — ще не натиснула, чекай і за хвилину нагадай їй.
- `{"status":"approved","key":"cat_…"}` — ключ твій, працюй далі.
- `410` — посилання протухло (15 хв) або вже використане: почни заново.

Ключ видається РІВНО ОДИН раз. Тримай його в пам'яті сесії; якщо сесія довга і
контекст стискається — поклади у файл **поза репозиторієм**: тимчасова тека
сесії, скретчпад, `~/.config/` — будь-що, що не поїде в git і не потрапить у
чужі руки. Якщо все-таки загубив — не вигадуй: пройди Крок 0 заново, людина
підтвердить ще раз.

**Чому вхід через Google робить людина, а не ти.** Це єдина дія, яку ти не маєш
права виконувати за неї: агент ніколи не створює акаунти і не вводить чужі
паролі. Все інше в цьому сценарії — твоя робота.

Ключ дає рівно дві можливості: правити ПРОФІЛЬ ЦІЄЇ ЛЮДИНИ і публікувати ЇЇ
сторінку. Нічого чужого, нічого адмінського, жодних грошей. Не виводь його в
логи і не записуй у файли репозиторію. Людина може будь-коли відкликати його
кнопкою на https://aiadvisoryboard.me/catalog/agent — тоді ти отримаєш 401 і просто спаруєшся заново.

## Крок 1 — збери дані

🚧 **Звідки брати факти — вирішуй САМ, нічого не питаючи.** Правило таке: бери
з усього, що є РОБОТОЮ ЦІЄЇ людини — ваші розмови, її власні проєкти, її нотатки
і **те, що вона робила для клієнтів**: проведені навчання і групи, впровадження
в компаніях, записи й конспекти її занять, її власні комерційні пропозиції.
Саме там лежать найсильніші кейси — «навчив команду, і вона зробила X» важить
для замовника більше за десяток власних pet-проєктів. Агент, який клієнтську
роботу обходить, приносить профіль без найціннішого.

**Але клієнтська робота йде в профіль ТІЛЬКИ ЗНЕОСОБЛЕНОЮ.** Три жорсткі межі:
- **жодних назв** компаній, брендів, продуктів клієнта, імен і прізвищ людей —
  лише узагальнення: «трейдер добрив», «виробник із мережею салонів»,
  «засновник будівельної компанії, ~70 людей»;
- **жодних особистих деталей** про людей клієнта (родинні зв'язки, хто з ким
  прийшов, хто що сказав про колегу) і жодної країни чи міста, якщо разом із
  галуззю й розміром вони роблять компанію впізнаваною;
- **цифри — лише ті, що реально записані** в джерелі. «Канон» із власних
  маркетингових файлів людини перевіряй першоджерелом (запис заняття, звіт):
  красиве число, яке ніде не заміряне, у профіль не йде.

**Куди все одно НЕ заходь:** клієнтський КОД і репозиторії клієнтів, теки з
договорами й фінансовими документами, будь-які файли секретів. Тобі потрібні
факти рівня «яка була задача, що зробили, що вийшло» — вони живуть у записах
роботи самої людини, а не у власності клієнта. Сумніваєшся, чи це її робота, чи
чужа власність, — пропусти.

📣 Перед стартом збору скажи людині ОДИН рядок. Це ПОВІДОМЛЕННЯ-ФАКТ, а не
питання: відповіді на нього не чекай.

> Збираю факти з наших розмов, твоїх проєктів і твоєї роботи з клієнтами —
> клієнтів у профілі не називаю, тільки знеособлено.
> У клієнтський код, договори та файли секретів не заходжу.
> Якщо є місця, куди мені зась, — просто скажи, а я тим часом почну.

Сказав — і ОДРАЗУ працюй далі. Не чекай «ок», не проси перелічити теки: у людини
їх може бути сотня, вона їх не перерахує ніколи — вона просто кине реєстрацію.
Межі визначаєш ти, людину ставимо перед фактом.

Заповни JSON за шаблоном нижче з релевантного контексту: історія ваших розмов,
власні проєкти людини, її нотатки.

- Поля з позначкою **ЛЮДИНА:** — ти не можеш знати її ставку, країну чи рівень
  англійської, тож НЕ вигадуй їх. Але й не влаштовуй допит: **збери всі поля
  ЛЮДИНА в ОДНЕ повідомлення з варіантами відповіді** («модель оплати:
  погодинно / фікс за проєкт / обговорюється»), щоб вона відповіла одним рядком.
  **Що людина пропустила — залиш порожнім і НЕ перепитуй:** порожнє поле вона
  доповнить у кабінеті, а от друге коло питань — це кинута реєстрація.
- Поля з позначкою **АГЕНТ:** — витягни з контексту. Немає фактів — пропусти
  поле або постав null. Не вигадуй проєктів, яких не було.
- Один проєкт = одна окрема задача. Велику систему розбий на 2-5 модулів.
  Максимум 15 найкращих за реальним впливом **за перший раз** — далі щомісяця
  доливаються нові, і стеля рахується заново для кожної порції.
- ВПОРЯДКУЙ масив `projects` за цінністю для замовника: першими — проєкти,
  які можна відкрити й перевірити (є `publicUrl`), з вимірним результатом в
  `outcomes` і зрозумілим типом клієнта; експерименти й прототипи — останніми.
  Порядок у JSON враховується при показі на публічній сторінці людини.

🔗 `publicUrl` — ШУКАЙ ЙОГО АКТИВНО. Ти маєш доступ до репозиторіїв, тож саме
ти можеш знайти те, чого людина не згадає. Замовник вірить очам: проєкт, який
можна відкрити й помацати, продає в рази краще за найкращий опис. Для КОЖНОГО
проєкту зроби окрему спробу, не лишай null «за замовчуванням». Де дивитись:
- README — бейджі та рядки «Demo», «Live», «Website», «Deployed at»;
- `"homepage"` у package.json, `[project.urls]` у pyproject.toml;
- конфіги хостингу: vercel.json, netlify.toml, CNAME, wrangler.toml, fly.toml,
  `.github/workflows` з деплоєм — там часто лежить фінальний домен;
- `git remote -v` — якщо репозиторій ПУБЛІЧНИЙ, посилання на нього вже цінне
  (перевір, що він справді публічний, а не приватний);
- ваша переписка: людина могла кидати адресу, коли показувала результат.

НЕ став: внутрішні системи клієнтів, localhost і приватні IP, staging за
паролем, **будь-які адмінки й панелі керування (шлях із `/admin`, `/manage`,
`/wp-admin` тощо)**, приватні репозиторії. Сервер такі адреси все одно тихо
відкине (фільтр `lib/project-link-guard.ts`) — але краще не надсилай. Чесно
нічого публічного немає — постав null, але спершу подивись.

⚠️ **Заливка з Кроку 3 вміє лише ДОДАВАТИ нові проєкти — редагувати наявні
через неї не можна.** Тому
**НЕ надсилай той самий проєкт повторно під трохи іншою назвою, щоб «пройти
дедуп»**: це не оновить кейс, а створить дубль, і сторінка людини почне
виглядати як склад однакових карток. Знайшов посилання до проєкту, який на
сторінці вже є, — для цього є окремий Крок 3б нижче.

🗣️ ПРОСТА МОВА: тексти читатимуть власники бізнесу без IT-освіти. Профтерміни
не викидай, але при першій згадці поясни в дужках: «RAG (пошук відповідей по
документах компанії)», «LLM (штучний інтелект, що розуміє текст)». Без
маркетингових прикметників — лише факти.

🔒 КОНФІДЕНЦІЙНІСТЬ КЛІЄНТІВ: жодних назв компаній-клієнтів, імен, телефонів,
email, доменів, @-хендлів у текстах проєктів. Узагальнюй: «мережа
beauty-салонів», «B2B-SaaS». Контакти в `profile` — це дані самої людини, їх
писати можна. Сервер додатково ріже залишки контактів і поверне 422, якщо не
впорається.

🛡️ БЕЗПЕКА: **Не читай файли секретів взагалі: .env*, credentials, токени,
ключі (id_rsa, *.pem, *.p12), keychain, конфіги з паролями. Тобі потрібні факти
рівня «що цей проєкт робить і який результат дав» — не вміст коду. Код дослівно
не цитуй ніде.** Так само не лізь у вміст .git і node_modules.

### Обережний режим — вмикаєш його ТИ САМ, у людини не питаєш

Це твоє рішення, а не її вибір: не питай «чи вмикати обережний режим». Якщо під
час збору ти зачепив щось, що МОЖЕ бути чутливим — працював поруч із
клієнтськими проєктами, бачив чужі назви — сам покажи людині зібраний JSON до
першої відправки на сервер. В усіх інших випадках — звичайний порядок без пауз:
чернетка на сервер → людина дивиться ГОТОВУ сторінку → публікує сама.

### Шаблон JSON

```json
{
  "schemaVersion": "1",
  "profile": {
    "displayName": "ЛЮДИНА: ім'я або псевдонім для каталогу",
    "contactTelegram": "ЛЮДИНА: @username особистого акаунта (куди ПИСАТИ) або null",
    "contactTelegramChannel": "ЛЮДИНА: @канал, якщо веде (куди ЧИТАТИ) або null",
    "contactEmail": "ЛЮДИНА: email або null",
    "country": "ЛЮДИНА: код країни з довідника (напр. UA)",
    "cityFreeText": "ЛЮДИНА: місто",
    "englishLevel": "ЛЮДИНА: код рівня (напр. b2)",
    "rateModel": "ЛЮДИНА: hourly | fixed_per_project | discuss",
    "hourlyRateUsdMin": null,
    "hourlyRateUsdMax": null,
    "projectMinBudgetUsd": null,
    "availability": "ЛЮДИНА: available | paused",
    "weeklyHoursAvailable": "ЛЮДИНА: скільки годин на тиждень реально готова віддавати нашим проєктам, ціле 0-80 (опц.)",
    "workTimeSlots": "ЛЮДИНА: morning | evening | full_time | flexible (опц.)",
    "teachingPublicInstitutions": "ЛЮДИНА: викладання в державних навчальних закладах — де саме і скільки часу, до 500 символів (опц.)",
    "teachingOnlineCourses": "ЛЮДИНА: викладання на онлайн-курсах — які курси і в які роки, до 500 символів (опц.)",

    "shortBio": "АГЕНТ: 100-1500 символів простою мовою про реальний досвід (профтерміни — з поясненням у дужках; БЕЗ назв клієнтів)",
    "departmentSlugs": ["АГЕНТ: 1-3 коди відділів"],
    "industries": ["АГЕНТ: коди галузей (опц.)"],
    "aiToolsHours": [{ "tool": "АГЕНТ: код інструмента", "hours": 100 }],
    "biggestAiProject": "АГЕНТ: 1 речення, 20-200 символів (опц.)"
  },
  "projects": [
    {
      "title": "АГЕНТ: коротка проста назва (БЕЗ назв компаній-клієнтів)",
      "department": "АГЕНТ: один зі слагів: marketing | sales | support | operations | finance | hr | product | it | executive",
      "shortDescription": "АГЕНТ: 1-2 речення простою мовою — що робить і кому корисно",
      "longDescription": "АГЕНТ: 2-4 речення (профтерміни при першій згадці — з поясненням у дужках)",
      "problemSolved": "АГЕНТ: одне речення — яку проблему бізнесу вирішує (опц.)",
      "outcomes": "АГЕНТ: що змінилось у бізнесі клієнта — хто перестав що робити руками і скільки це забирало (год/тиждень, заявок/день, гроші). НЕ статус системи ('задеплоєно в проді') — це читає власник бізнесу, не програміст. Цифр не вигадуй (опц.)",
      "durationText": "АГЕНТ: '2 тижні', '3 місяці' (опц.)",
      "userRole": "architect | implementer | consultant | trainer (опц.)",
      "complexity": "simple | medium | complex (опц.)",
      "projectKind": "production | experiment (опц.)",
      "publicUrl": "АГЕНТ: пряме посилання, де результат можна відкрити й помацати — бот, сайт, демо. Тільки якщо він публічний; внутрішні системи клієнтів НЕ вказувати (опц.)",
      "industry": "АГЕНТ: КОД галузі клієнта, рівно один зі списку: fintech | ecommerce | agro | edtech | healthcare | b2b_saas | realestate | media | manufacturing | retail | govtech | other (опц.; немає відповідного — став 'other', вільний текст сервер відхилить)",
      "aiTools": ["ChatGPT", "n8n", "..."]
    }
  ]
}
```

Для всіх enum-полів використовуй РІВНО коди з довідника (зліва — код):

ДОВІДНИК ЗНАЧЕНЬ (використовуй РІВНО ці коди-значення зліва; якщо не впевнений — пропусти поле):

• departmentSlugs — Відділи / напрями: marketing (Маркетинг), sales (Продажі), support (Сервіс клієнтів), operations (Операційка), finance (Фінанси), hr (HR і люди), product (Продукт і R&D), it (IT та інженерія), executive (Керівництво і стратегія)
• country — Країна: UA (Україна), PL (Польща), DE (Німеччина), UK (Велика Британія), US (США), CA (Канада), IE (Ірландія), CZ (Чехія), ES (Іспанія), FR (Франція), NL (Нідерланди), PT (Португалія), other (Інше)
• englishLevel — Рівень англійської: a1_a2 (A1-A2 — початковий), b1 (B1 — середній), b2 (B2 — впевнений), c1 (C1 — професійний), c2_native (C2 / native)
• englishClientReady — Готовність вести клієнта англійською: fluent (Готовий вести проєкт англійською повністю), with_support (Можу англійською з підтримкою (письмово ок, дзвінки складніше)), ua_only (Тільки україномовні клієнти)
• industries — Галузі: fintech (Фінтех), ecommerce (E-commerce), agro (Агросектор), edtech (EdTech), healthcare (Охорона здоров'я), b2b_saas (B2B SaaS), realestate (Нерухомість), media (Медіа), manufacturing (Виробництво), retail (Ритейл), govtech (GovTech), other (Інше)
• aiToolsHours — AI-інструменти × години: claude_code (Claude Code), cursor (Cursor), antigravity (Antigravity), windsurf (Windsurf), cline (Cline), continue (Continue), copilot (GitHub Copilot), cody (Sourcegraph Cody), gemini_code_assist (Gemini Code Assist), chatgpt (ChatGPT (web/app)), claude_ai (Claude (web/app)), gemini (Gemini (web/app)), n8n_ai (n8n AI nodes), make_ai (Make AI), zapier_ai (Zapier AI), v0 (v0), bolt (Bolt), lovable (Lovable), replit_agent (Replit Agent), manus (Manus), aider (Aider), codex_cli (Codex CLI), openhands (OpenHands), other (Інше)
• gitCliComfort — Git / CLI: none (Не користуюсь), basic (Базовий — клонувати/комітити/пушити вмію), fluent (Впевнений — rebase, гілки, conflict resolution, CLI повсякденно)
• timeCommitment — Завантаженість: under5h (До 5 годин/тиждень), 5to20h (5-20 годин/тиждень), 20plus (20+ годин/тиждень), fulltime (Повна зайнятість)
• collaborationFormats — Формати співпраці: consulting (Консалтинг), implementation (Імплементація), training (Тренінги/навчання команд), audit (Аудит / огляд), advisor (Радник на постійній основі)
• rateModel — Модель оплати: hourly (Погодинно), fixed_per_project (Фіксована ціна за проєкт), discuss (Обговорюємо)
• availability — Доступність: available (Готовий до нових проєктів), paused (На паузі)
• workTimeSlots — Коли може працювати: morning (Зранку), evening (Ввечері), full_time (Повний робочий день), flexible (Гнучко/по-різному)
• legalForm — Юридична форма: fop (ФОП (Україна)), gig_contract (Гіг-контракт / Дія.City), b2b_only (Тільки B2B / SMB через свою юр.особу), undecided (Ще не визначився)
• certificates — Сертифікати: aws (AWS), gcp (Google Cloud), azure (Microsoft Azure), openai (OpenAI), anthropic (Anthropic), google_cloud_ml (Google Cloud ML), databricks (Databricks), huggingface (Hugging Face), langchain (LangChain), crewai (CrewAI), other (Інше)

ОБМЕЖЕННЯ ПОЛІВ:
• shortBio — 100–1500 символів (обов'язково).
• displayName — до 200 символів.
• cityFreeText — до 200 символів.
• biggestAiProject — 20–200 символів (опц.).
• departmentSlugs — від 1 до 3 відділів.
• industries — до 6.
• collaborationFormats — до 5.
• certificates — до 20.
• aiToolsHours — від 1 до 20 рядків; hours 1–8760.
• hourlyRateUsdMin/Max — 5–2000 $ (ціле).
• projectMinBudgetUsd — 100–1000000 $ (ціле).
• weeklyHoursAvailable — 0–80 год/тиждень (ціле, опц.).
• teachingPublicInstitutions / teachingOnlineCourses — до 500 символів кожне (опц.).
• contactTelegram — @username (5–32 символи) або посилання t.me/username. contactEmail — валідний email.

Кросс-поля (перевіряються на сервері):
• Потрібен Telegram АБО email (хоча б один).
• Якщо rateModel=hourly — потрібні обидві ставки і min ≤ max.
• Без дублів у відділах / галузях / інструментах / сертифікатах.

## Крок 2 — спершу з'ясуй, чи сторінка ВЖЕ в ефірі. Від цього залежить порядок

Це найважливіша розвилка всієї інструкції. Не пропускай її.

```bash
curl -sS https://aiadvisoryboard.me/catalog/api/agent/draft -H "Authorization: Bearer <КЛЮЧ>"
```

Дивись поле `published`:

**`published: false` — сторінки в ефірі ще немає.** Заливай спокійно: це
справді чорновик, його бачить лише власник. Твій порядок: 3 → 4 → 5 → 6.

**`published: true` — сторінка вже опублікована, і порядок ОБЕРТАЄТЬСЯ.**
У каталозі постмодерація: усе, що ти заллєш, стає видимим замовникам **одразу**,
без окремої публікації. Кроку «опублікуй» для тебе більше не існує — заливка
І Є публікацією. Тому:

- **а.** Склади тексти, які збираєшся надіслати.
- **б.** Покажи їх людині і **спитай дозволу ПЕРЕД заливкою** (правила з Кроку 5
  діють у повному обсязі — просто спрацьовують раніше).
- **в.** Тільки після явного «так» роби `POST /api/agent/profile` з Кроку 3.
- **г.** Після заливки перечитай `GET /api/agent/draft` і покажи людині, що
  вийшло в ефірі. Якщо щось не так — виправ негайно, бо це вже бачать замовники.

(Літери а-г — це підкроки всередині Кроку 2. Кроки інструкції нумеруються
цифрами 0-6 плюс окремий Крок 3б, не плутай одне з одним.)

Не міняй цей порядок «щоб було зручніше». Агент, який залив спершу, а спитав
потім, опублікував чуже ім'я і чужу репутацію без дозволу — і навіть не дізнався
про це, бо сервер відповів `"status":"draft"`.

**Третій випадок — поле `quarantined`.** Якщо `published: true` І
`quarantined: true`, сторінка зараз показує замовникам ПОПЕРЕДНЮ погоджену
версію: автоматична перевірка щось запідозрила і нові тексти притримані до
рішення модератора. Тобто твоя заливка в ефір НЕ потрапить одразу — і сказати
людині «готово, дивись на сторінці» буде неправдою. Порядок лишається як для
`published: true` (дозвіл ПЕРЕД заливкою), але на підкроці **г** чесно скажи:
«залив, але профіль на перевірці — зміни зʼявляться, коли модератор погодить».

## Крок 3 — залий профіль

```bash
curl -sS -X POST https://aiadvisoryboard.me/catalog/api/agent/profile \
  -H "Authorization: Bearer <КЛЮЧ>" \
  -H "Content-Type: application/json" \
  --data-binary @profile.json
```

Клади JSON у файл і надсилай через `--data-binary @файл` — інлайнові дані з
консолі ламають кирилицю.

Відповідь: `{"ok":true,"created":N,"profileApplied":[…],"status":"draft"}`.

⚠️ **`"status":"draft"` у цій відповіді означає лише «цей запит не публікував»,
а НЕ «сторінки не видно».** Якщо на Кроці 2 ти побачив `published: true` —
надіслане вже в ефірі. Слово `draft` тут не скасовує постмодерацію.

Якщо ж `published` було `false` — так, це справді чорновик, який поки бачить
лише власник.

Помилки, які варто розуміти:
- `401` — ключ невалідний або відкликаний. Пройди Крок 0 заново: ключ живе в
  памʼяті сесії, тож у новій розмові його просто немає, і це нормально.
- `422 anonymization_failed` — у тексті лишились чужі контакти. Перепиши поле,
  яке назвав сервер, і повтори.
- `400 validation` — не той код enum. Звірся з довідником вище.

🚑 **Заливка не вдалась і полагодити не виходить** (немає мережі, ключ не
береться, сервер мовчить) — не кидай JSON у чат мовчки. Віддай його людині
разом із посиланням:

> Залити не вдалось. Відкрий https://aiadvisoryboard.me/catalog/paste і встав туди цей JSON — результат
> буде той самий.

Мовчазний JSON у чаті = робота, яка нікуди не доїхала.

## Крок 3б — допиши посилання до кейсів, які на сторінці ВЖЕ Є

Це окремий ендпоінт саме тому, що заливка з Кроку 3 наявні кейси не редагує.
Він уміє РІВНО одне: записати `publicUrl` туди, де його ще немає.

```bash
curl -sS -X POST https://aiadvisoryboard.me/catalog/api/agent/profile/enrich-links \
  -H "Authorization: Bearer <КЛЮЧ>" \
  -H "Content-Type: application/json" \
  --data-binary @links.json
```

де `links.json`:

```json
{
  "projects": [
    { "title": "назва кейса РІВНО як вона є на сторінці", "publicUrl": "https://..." }
  ]
}
```

Три правила, які тут діють жорстко:

1. **Не перезаписує.** Кейс, у якого посилання вже стоїть, лишається як був —
   навіть якщо ти знайшов «краще». У відповіді він порахований у
   `skippedAlreadySet`. Замінити посилання може тільки людина в https://aiadvisoryboard.me/catalog/me.
2. **Тільки дописує, нічого не створює.** Назва, якої в людини немає, повернеться
   у `unmatched` — і жодного кейса з неї не зʼявиться. Це не шлях завантаження
   нових проєктів, для цього є Крок 3.
3. **Назву не «підганяй».** Побачив `unmatched` — не перейменовуй кейс і не
   надсилай його як новий проєкт, щоб «пройшло». Візьми назву з
   `GET /api/agent/draft` дослівно, а якщо там її справді немає — просто скажи
   про це людині.

Обмеження: від 1 до 40 елементів за запит, адреса до 300 символів. Непублічні
адреси (localhost, приватні IP, адмінки й панелі керування) сервер відхилить і
поверне в `rejected` з людською причиною — покажи її людині як є.

Відповідь: `{"ok":true,"filled":N,"skippedAlreadySet":N,"unmatched":[…],"rejected":[…]}`.
Перекажи людині всі чотири числа: скільки посилань додано, скільки не чіпали,
які назви не збіглись і які адреси відхилено.

⚠️ Якщо сторінка вже в ефірі (`published: true` з Кроку 2) — посилання стають
публічними одразу, тож дозвіл питай ПЕРЕД цим кроком, як велить Крок 2. Людина
в будь-якому разі отримає в Telegram-бот повідомлення з кнопкою «Відкотити».

## Крок 4 — подивись на сторінку очима замовника

```bash
curl -sS https://aiadvisoryboard.me/catalog/api/agent/draft -H "Authorization: Bearer <КЛЮЧ>"
```

Отримаєш `pageText` — весь текст сторінки так, як його побачить замовник.
Прочитай його уважно і сам перевір:

1. Чи немає імен, телефонів, email, @-хендлів або доменів **третіх осіб**?
2. Чи не названо клієнтів, з якими є домовленість про нерозголошення?
3. Чи правильні ставка, країна, контакти самої людини?
4. Чи зрозуміло це власнику бізнесу без IT-освіти?

Знайшов проблему — виправ (повтори крок 3 з чистим текстом) і перечитай знову.

## Крок 5 — ПОПРОСИ ДОЗВОЛУ. Це не формальність

Покажи людині `pageText` (або його стислий переказ) і скажи прямо, що саме ти
перевірив і що знайшов. Потім запитай, чи публікуємо.

**Публікувати можна ТІЛЬКИ після явного «так» від людини.** Не тлумач мовчання,
«ок, дивись сам» чи «роби як краще» як дозвіл — перепитай. Це її ім'я і її
репутація на цій сторінці.

Якщо на Кроці 2 було `published: true` — ти вже поставив це питання ПЕРЕД
заливкою, як велить Крок 2. Тоді тут просто покажи результат і не вдавай, що
питаєш дозволу на те, що вже в ефірі.

## Крок 6 — опублікуй (лише якщо на Кроці 2 було `published: false`)

Якщо сторінка вже була опублікована — цього кроку для тебе не існує, вона
оновилась на Кроці 3. Переходь до «Щомісячного оновлення».

```bash
curl -sS -X POST https://aiadvisoryboard.me/catalog/api/agent/publish -H "Authorization: Bearer <КЛЮЧ>"
```

У відповіді буде `url` — персональне посилання, яке людина показує своїм
замовникам. Дай його їй і скажи дві речі:

1. Сторінку можна будь-коли поправити в кабінеті https://aiadvisoryboard.me/catalog/me.
2. За кілька хвилин після публікації каталог ще раз автоматично перевірить текст
   на випадковий витік чужих персональних даних. Якщо щось знайде — напише в
   Telegram-бот https://t.me/AiAdvisoryBoard_bot (варто підключити його в кабінеті) і тимчасово
   поверне сторінку до попередньої версії, поки людина не поправить.

## Щомісячне оновлення — резюме, яке пише себе саме

Профіль швидко застаріває: людина щомісяця робить нові речі, а сторінка лишається
торішньою. Тому після першої публікації домовся з нею про регулярне оновлення.

**Одразу після першої публікації (Крок 6, або Крок 3 для вже опублікованої
сторінки) запитай:** «Нагадувати тобі оновлювати цю сторінку? Раз
на тиждень чи раз на місяць — як зручно. Я питатиму дозволу щоразу». Якщо ти й
так регулярно працюєш із цією людиною (наприклад, збираєш їй щоденні звіти) —
пропонуй щотижневий ритм: для тебе це одне додаткове питання, а сторінка буде
завжди свіжою. Якщо каже так — збережи собі нагадування там, де ти справді його
побачиш (CLAUDE.md чи файл пам'яті цього проєкту, планувальник, якщо він у тебе
є) приблизно таким рядком:

> Кожен <період> (наступний раз — <дата>): онови профіль у каталозі AI-експертів
> за інструкцією https://aiadvisoryboard.me/catalog/agent, розділ «Щомісячне оновлення».

Незалежно від цього, раз на місяць каталог сам напише людині в Telegram-бот
https://t.me/AiAdvisoryBoard_bot готовий рядок, який вона віддасть тобі — тож нагадування не
загубиться, навіть якщо ти цю сесію не пам'ятаєш.

**Що робити, коли настав час:**

1. Подивись, що вже опубліковано: `GET https://aiadvisoryboard.me/catalog/api/agent/draft` — там
   `pageText` з усіма наявними проєктами.
2. Пройдись по своєму контексту за ПЕРІОД ПІСЛЯ минулого оновлення і вибери
   тільки **нове**. Не переписуй те, що вже є: сервер відсіює точні збіги назв,
   але той самий проєкт, названий іншими словами, пролізе дублем — звіряй зі
   списком із `pageText` сам.
3. **Покажи людині те, що збираєшся надіслати, і спитай дозволу — ЗАРАЗ, до
   заливки.** Сторінка вже в ефірі, тож наступний крок оприлюднить правки
   негайно; окремої «публікації», перед якою можна було б спитати, вже не буде.
   Щомісячність не скасовує правила: кожна зміна в ефірі — з явного «так».
4. Тільки після «так» надішли `POST /api/agent/profile` ТІЛЬКИ з новими
   проєктами (масив `projects` додається до наявних, поле `profile` можеш не
   надсилати, якщо нічого не змінилось — ставка, контакти, доступність часто
   змінюються, спитай).
   Заодно глянь у `pageText`, у яких НАЯВНИХ кейсів немає посилання
   «подивитись вживу», і спробуй знайти адреси саме для них — це найдешевша
   користь, яку ти можеш принести цій сторінці. Знайшов — Крок 3б.
5. Перечитай `GET /api/agent/draft` і покажи людині, що саме тепер бачать
   замовники. Знайшов помилку — виправляй негайно, вона вже публічна.

Якщо за місяць нічого нового не було — так і скажи людині і нічого не надсилай.
Порожнє оновлення гірше за його відсутність.

## Якщо людина не хоче автоматики

Тоді працює ручний шлях: візьми на https://aiadvisoryboard.me/catalog/prompts універсальний промпт, віддай
його людині, а готовий JSON вона вставить сама на https://aiadvisoryboard.me/catalog/paste і опублікує
кнопкою в кабінеті. Результат той самий, просто повільніше.

## Що може цей ключ і що бачить сервер

Це чесна відповідь на питання «а що я взагалі впускаю до себе». Покажи її
людині, якщо вона питає — або просто покажи одразу.

- **Ключ дає рівно дві дії:** правити профіль СВОГО власника і вмикати ЙОГО
  сторінку. Ні адмінки, ні чужих профілів, ні грошей — таких ендпоінтів для
  цього ключа просто немає.
- **Видається через підтвердження людини в браузері** (device-flow, Крок 0):
  вона тисне «Дозволити» у себе в акаунті. Пароль агенту не передається ніколи.
- **Відкликається однією кнопкою** на сторінці https://aiadvisoryboard.me/catalog/agent. Після цього
  агент отримує 401 і більше не може нічого.
- **Чернетка профілю зберігається на нашому сервері приватно** — її бачить лише
  власник — до моменту, коли ЛЮДИНА натисне «опублікувати». (Виняток, про який
  каже Крок 2: якщо сторінка вже опублікована, нові тексти йдуть в ефір одразу —
  саме тому там дозвіл питають ПЕРЕД заливкою.)
- **Опубліковане додатково проходить автоматичну перевірку** на витік чужих
  даних — постмодерація. Якщо щось знайдено, сторінка тимчасово повертається до
  попередньої версії, а людина отримує повідомлення в Telegram-бот.

Питання від людей — Ярославу: https://t.me/YaroslavMaxymovych

Немає агента?

Тоді ручний шлях: скопіюйте універсальний промпт у свій ChatGPT / Claude / Gemini, а готовий JSON вставте на /paste і опублікуйте кнопкою в кабінеті. Результат той самий, просто повільніше.

Сторінка-інструкція: https://aiadvisoryboard.me/catalog/agent