--- name: ucnl-market-memory description: Protocol for using ucnlmarket/ucnl-market-memory (Gitea repo at h3fq32.golive.ru) as Claude's long-term memory for marketing and sales projects of Laboratory of Underwater Communication and Navigation (UCN / UnaVLab). Trigger when the conversation is about UCN commercial matters — clients, distributors, leads, RFQs, quotes (КП), export deals, exhibitions/trade shows (INNOPROM, Oceanology, etc.), product marketing for uWave / Zima2 / uSpeak / USBL / Piket / Scout, pricing and discount schemes, market analysis (India, Saudi Arabia, Europe, ME), competitor positioning (HiPAP, Sonardyne, EvoLogics, iXblue), trademark/brand work tied to commercial use (iSPEAK, uSpeak), distribution channels, or any sales/marketing insight about UCN products. Also trigger on mentions of ucnlmarket org, ucnl-market-memory repo, or team members Dmitry Zaitsev (d.zaitsev) / Victoria Vinogradova (v.vinogradova) in commercial context. Do NOT trigger for: technical/engineering work on UCN products (firmware, acoustics, R&D), personal projects, infrastructure, 1C consulting for non-UCN clients, or casual chat — those go through obsidian-memory skill or require no memory lookup. --- # ucnl-market-memory Протокол работы с `ucnlmarket/ucnl-market-memory` как долговременной памятью для всего что касается **маркетинга и продаж UCN / UnaVLab**. Репо — обычный git в Gitea, хранит markdown-заметки с YAML-frontmatter. Claude читает и пишет через Gitea REST API. Два человека — Дмитрий Зайцев (`d.zaitsev`) и Виктория Виноградова (`v.vinogradova`) — также работают с репо напрямую через web UI и git. ## Разграничение доменов — критично У пользователя **два репо памяти** с жёстким разделением: | Домен | Репо | Скилл | |---|---|---| | Маркетинг и продажи UCN (клиенты, дистрибьюторы, выставки, КП, экспорт, product marketing uWave/Zima2/uSpeak/USBL) | `ucnlmarket/ucnl-market-memory` | **этот скилл** | | Личные проекты Артура, инфраструктура, embedded, 1С-консалтинг, R&D по UCN-продуктам, прочее | `creator/obsidian-vault` | `obsidian-memory` | **Правило жёсткое:** материалы из одного домена НЕ попадают в репо другого. Если тема пограничная (1С-внедрение в UCN как клиенте, где есть и коммерческий, и технический аспект) — спросить пользователя, не додумывать. **Примеры границы:** | Запрос | Куда | |---|---| | «Напиши письмо Mavi Marine по поводу сроков поставки» | sales → этот скилл | | «Прошивка uWave — как обновить через STM32CubeProg» | R&D → `obsidian-memory` | | «Подготовь слайд для INNOPROM KSA 2026» | маркетинг → этот скилл | | «Расчёт TDOA для uWave USBL» | R&D/алгоритмы → `obsidian-memory` | | «ТЗ на 1С-внедрение для Teplovin» | 1С-консалтинг не-UCN → `obsidian-memory` | | «Скидка дистрибьютору X на линейку Y» | sales → этот скилл (вероятно `sensitive: true`) | ## Where things live - **Gitea:** `https://git.h3fq32.golive.ru` - **Repo:** `ucnlmarket/ucnl-market-memory` - **Branch:** `main` - **Visibility:** private (видят только члены org `ucnlmarket`) - **Access:** `bash_tool` + `curl` с `Authorization: token $GITEA_TOKEN` Токен — тот же что для `obsidian-memory` (он от пользователя `creator` со scope `write:repository`, доступа к этому приватному репо хватает, т.к. `creator` — owner организации). ## Repo layout ``` memory/ ├── accounts/ клиенты, дистрибьюторы, лиды — .md ├── products/ продуктовые линейки (uwave, zima2, uspeak, usbl, …) ├── campaigns/ маркетинговые активности, выставки ├── markets/ региональные рынки (india, saudi-arabia, europe) ├── facts.md стабильные факты (append-only секциями) ├── preferences.md стиль КП, tone of voice, терминология └── pricing.md прайсы, скидки, Incoterms (sensitive: true) insights/ YYYY-MM-DD-.md — датированные наблюдения conversations/ YYYY-MM-DD-.md — выжимки сессий inbox/ черновики и спорные записи на ревью ``` **Принцип `accounts` vs `markets`:** - `accounts/` — конкретная компания (есть имя, ИНН/ID, контакты, история). - `markets/` — регион/страна/сегмент (India, Saudi Arabia, offshore-Europe) — нормы, законы, пошлины, конкуренты, предпочитаемые каналы. **Принцип `campaigns` vs `insights`:** - `campaigns/` — запланированная/идущая активность с целями и ресурсами. - `insights/` — разовое наблюдение (услышали на выставке; конкурент выпустил Y; клиент отказался по причине Z). ## Frontmatter ```yaml --- type: account | product | campaign | market | insight | conversation | fact | preference slug: # совпадает с именем файла без .md account: # опц., ссылка на accounts/.md product: # опц., ссылка на products/.md market: # опц., ссылка на markets/.md campaign: # опц., ссылка на campaigns/.md tags: [, ] # свободная форма, kebab-case author: claude | d.zaitsev | v.vinogradova | creator created: YYYY-MM-DD updated: YYYY-MM-DD relevance: 0.0-1.0 # важность для ранжирования confidence: low | medium | high stage: lead | qualified | proposal | won | lost | closed # для accounts, опц. private: false # true → не цитировать, не упоминать sensitive: false # true → не во внешние API, не в экспорты sources: - conversation: 2026-04-20- - email: - url: https://… --- ``` **`private: true`** — читать для контекста можно, в ответах не цитировать, не упоминать о наличии. **`sensitive: true`** — сильнее: не передавать содержимое во внешние API (web_search, AI-ассистенты сторонних вендоров), не включать в экспорты, не показывать людям без явной проверки. Применяется к коммерческой конфиденциальной информации (скидки, маржа, закрытые условия). ## Protocol ### 1. В начале разговора по маркетингу/продажам UCN 1. **Content-поиск** по репо: ``` GET /api/v1/repos/ucnlmarket/ucnl-market-memory/search?q=&type=code ``` 2. **Листинг релевантной папки** (accounts/products/campaigns/markets) по имени упомянутой сущности. 3. **Читаем top 3–5** самых релевантных. Приоритет: явный match по slug, свежесть `updated`, высокий `relevance`. Исключить `private: true` из ответов. 4. **Использовать контекст** естественно, без мета-комментариев «я нашёл заметку…». ### 2. Когда НЕ искать - Одноразовые справочные вопросы без контекста клиента/продукта. - Технические/R&D вопросы по UCN-продуктам — это `obsidian-memory`. - Разговоры где пользователь сам дал весь нужный контекст в сообщении. ### 3. В процессе - При упоминании сущностей, имеющих свою заметку — `[[wiki-links]]` в новых заметках (пригодится для Obsidian-навигации). - Противоречия «память ↔ текущее сообщение» — честно флагить, не тихо исправлять. - Обращать внимание на автора последней записи: `d.zaitsev` и `v.vinogradova` — живые коллеги, у них свой фронт работ; Claude не переписывает их заметки молча, лучше дополнить отдельной записью со ссылкой. ### 4. В конце разговора — что и куда сохранять | Что появилось | Куда | |---|---| | Значимое про конкретного клиента | `memory/accounts/.md` (update) или `insights/YYYY-MM-DD-.md` | | Новая позиция в продуктовой линейке | `memory/products/.md` | | Запуск кампании / выставка | `memory/campaigns/.md` | | Изменения на региональном рынке | `memory/markets/.md` | | Изменение в прайсе | `memory/pricing.md` (sensitive!) | | Предпочтение команды | `memory/preferences.md` | | Стабильный факт общего характера | `memory/facts.md` (append в секцию) | | Выжимка беседы | `conversations/YYYY-MM-DD-.md` | | Сомневаюсь куда | `inbox/` + явная пометка пользователю | **Не писать ради галочки.** Лучше 0 файлов, чем пять пустословных. Критерий: «если через полгода Claude или Дмитрий/Виктория прочитают эту заметку — даст ли она что-то?». ## Gitea REST API — шпаргалка ```bash GITEA=https://git.h3fq32.golive.ru REPO=ucnlmarket/ucnl-market-memory TOKEN=$GITEA_TOKEN # ── READ ──────────────────────────────────────────────────────────── # Файл (raw) curl -sS -H "Authorization: token $TOKEN" \ "$GITEA/api/v1/repos/$REPO/raw/memory/accounts/mavi-marine.md" # Листинг папки curl -sS -H "Authorization: token $TOKEN" \ "$GITEA/api/v1/repos/$REPO/contents/memory/accounts?ref=main" # Поиск curl -sS -H "Authorization: token $TOKEN" \ "$GITEA/api/v1/repos/$REPO/search?q=mumbai+usbl&type=code" # Tree (целиком) curl -sS -H "Authorization: token $TOKEN" \ "$GITEA/api/v1/repos/$REPO/git/trees/main?recursive=true" # ── WRITE ─────────────────────────────────────────────────────────── # Create (POST). Поле "content" (не content_base64!) content_b64=$(base64 -w0 /tmp/note.md) curl -sS -X POST -H "Authorization: token $TOKEN" \ -H "Content-Type: application/json" \ "$GITEA/api/v1/repos/$REPO/contents/memory/accounts/new.md" \ -d "{\"message\":\"claude: save — new lead\",\"content\":\"$content_b64\",\"branch\":\"main\"}" # Update (PUT, нужен sha) sha=$(curl -sS -H "Authorization: token $TOKEN" \ "$GITEA/api/v1/repos/$REPO/contents/memory/facts.md?ref=main" \ | python3 -c "import sys,json; print(json.load(sys.stdin)['sha'])") content_b64=$(base64 -w0 /tmp/facts-new.md) curl -sS -X PUT -H "Authorization: token $TOKEN" \ -H "Content-Type: application/json" \ "$GITEA/api/v1/repos/$REPO/contents/memory/facts.md" \ -d "{\"message\":\"claude: update facts\",\"content\":\"$content_b64\",\"sha\":\"$sha\",\"branch\":\"main\"}" # Batch curl -sS -X POST -H "Authorization: token $TOKEN" \ -H "Content-Type: application/json" \ "$GITEA/api/v1/repos/$REPO/contents" \ -d '{ "branch": "main", "message": "claude: session — mavi RFQ update", "files": [ {"operation":"create","path":"conversations/2026-04-20-mavi-rfq.md","content":""}, {"operation":"update","path":"memory/accounts/mavi-marine.md","content":"","sha":""} ] }' ``` ## Gotchas (общие с obsidian-memory, напомним) 1. **`content`, не `content_base64`.** Иначе файл нулевого размера. 2. **URL-encode путей** с пробелами/кириллицей. 3. **`PUT` требует `sha`** текущей версии файла. 4. **`sensitive: true` — не подсвечивать во внешних поисках.** Если Claude собирается делать web_search на основе данных из sensitive- заметки (например, искать что-то по номенклатуре цены) — формулировать запросы так, чтобы не утекали конкретные цифры и условия. ## Commit message format Префикс `claude:` для коммитов Claude: - `claude: save <тема>` — новая заметка - `claude: update <путь> — <что>` — правка - `claude: merge <откуда> → <куда>` — переорганизация Позволяет Дмитрию и Виктории фильтровать изменения от Claude (`git log --grep "^claude:"`). ## Naming - Всё ASCII-kebab-case. Русские имена → транслит или англ.: `мави-марин` → `mavi-marine`. - `YYYY-MM-DD-.md` для датированных (insights/, conversations/). - slug в `accounts/` = официальное short name компании, однозначно. - Slug продукта = продуктовый код UCN: `uwave`, `zima2`, `uspeak`, не `usbl-system-v2`. ## Boundaries - **Не писать в `obsidian-vault` из этого контекста.** Если тема явно про R&D/embedded/инфраструктуру — сказать пользователю и переключиться (или спросить). - **Не удалять чужие заметки.** Если есть сомнение в актуальности — `private: true` или обсудить. - **Не обходить `sensitive: true`.** Не цитировать наружу, не включать в материалы для третьих сторон. - **Конфликты между заметками `d.zaitsev` и `v.vinogradova`** — флагить пользователю, не разруливать самостоятельно. ## Контакты команды - **Дмитрий Зайцев** (`d.zaitsev`, d.zaitsev@unavlab.com) — член команды `members`, write-доступ. - **Виктория Виноградова** (`v.vinogradova`, v.vinogradova@unavlab.com) — член команды `members`, write-доступ. - **Артур (`creator`)** — owner организации `ucnlmarket`, admin.