Files
claude-skills/ucnl-market-memory/SKILL.md
T
creator 8213ff750a claude: sync ucnl-market-memory and obsidian-memory skills
- rewrite ucnl-market-memory/SKILL.md with final layout (accounts/products/campaigns/markets + insights/conversations/inbox), extended frontmatter (sensitive flag), domain routing table with border examples
- refresh obsidian-memory/SKILL.md with the same domain-routing section placed at top, matching examples, and updated description with negative trigger
2026-04-20 14:10:04 +03:00

269 lines
16 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
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/ клиенты, дистрибьюторы, лиды — <slug>.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-<slug>.md — датированные наблюдения
conversations/ YYYY-MM-DD-<slug>.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: <kebab-case-id> # совпадает с именем файла без .md
account: <slug> # опц., ссылка на accounts/<slug>.md
product: <slug> # опц., ссылка на products/<slug>.md
market: <slug> # опц., ссылка на markets/<slug>.md
campaign: <slug> # опц., ссылка на campaigns/<slug>.md
tags: [<tag1>, <tag2>] # свободная форма, 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-<slug>
- email: <msg-id>
- 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=<keyword>&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/<slug>.md` (update) или `insights/YYYY-MM-DD-<slug>.md` |
| Новая позиция в продуктовой линейке | `memory/products/<slug>.md` |
| Запуск кампании / выставка | `memory/campaigns/<slug>.md` |
| Изменения на региональном рынке | `memory/markets/<slug>.md` |
| Изменение в прайсе | `memory/pricing.md` (sensitive!) |
| Предпочтение команды | `memory/preferences.md` |
| Стабильный факт общего характера | `memory/facts.md` (append в секцию) |
| Выжимка беседы | `conversations/YYYY-MM-DD-<slug>.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":"<b64>"},
{"operation":"update","path":"memory/accounts/mavi-marine.md","content":"<b64>","sha":"<prev>"}
]
}'
```
## 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-<slug>.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.