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

16 KiB
Raw Blame History


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

---
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 35 самых релевантных. Приоритет: явный 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 — шпаргалка

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.