Хай усе зробить ваш AI-агент
Якщо ви працюєте з Claude Code, Codex, Cursor чи іншим асистентом — не заповнюйте анкету руками і не носіть JSON у буфері обміну. Киньте йому одне посилання: він сам збере ваш AI-досвід, заповнить профіль, відкриє чорновик сторінки, перевірить його на випадковий витік чужих даних — і повернеться до вас із питанням «публікуємо?».
Публікує тільки з вашого дозволу. Так написано в інструкції, і ви можете прочитати її повністю нижче — ми нічого не ховаємо.
Один рядок — і все
Вставте його у свій Claude Code / Codex / Cursor. Агент прочитає інструкцію і дасть вам посилання: там ви входите через Google і тиснете одну кнопку. Далі він зробить усе решту — аж до питання «публікуємо?».
Зайди на https://aiadvisoryboard.me/catalog/agent/instructions.md , прочитай інструкцію і зроби все, що там написано.
Що робитиме агент
- Прочитає цю сторінку, покаже вам інструкцію і попросить доступ: дасть одне посилання. Ви входите через Google і тиснете «Дозволити» — це єдина ваша дія, бо створювати акаунти і вводити паролі агент не має права. Вводити нічого не треба.
- Збере факти зі своїх контекстів і запитає у вас те, чого знати не може: ставку, країну, англійську, контакти.
- Заллє профіль як чорновик — сторінку поки бачите тільки ви.
- Відкриє чорновик і сам перевірить його на витік чужих даних.
- Покаже результат і запитає дозволу. Опублікує тільки після вашого «так».
- Запропонує раз на місяць дописувати нові проєкти — теж щоразу питаючи дозволу. Нагадування продублюємо в 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