- 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
269 lines
16 KiB
Markdown
269 lines
16 KiB
Markdown
---
|
||
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.
|