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
This commit is contained in:
+35
-28
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
name: obsidian-memory
|
name: obsidian-memory
|
||||||
description: Protocol for using creator/obsidian-vault (Gitea repo at h3fq32.golive.ru) as Claude's long-term memory for the user's PERSONAL projects (infrastructure, embedded, 1C-consulting, lotus-eletre, uspeak trademark, homework-*, claude-skills, etc.). Trigger when the user references past work ("my X project", "we decided Y", "remember that..."), asks Claude to remember/save/update/forget something, mentions a personal project by name, or whenever a substantive insight, decision, or fact surfaces that's worth preserving between sessions. Also covers answering non-trivial project questions that benefit from previously stored context. Describes vault layout, frontmatter conventions, Gitea REST API mechanics (read/list/search/create/update), naming rules, and write permissions. Do NOT trigger for simple one-off technical questions or casual chat that doesn't involve the user's ongoing projects or personal context. Do NOT trigger for UCN marketing/sales topics — clients, distributors, leads, trade shows (INNOPROM etc.), pricing/КП, product marketing for uWave/Zima2/uSpeak/USBL product lines, export deals, regional markets — those belong to the separate `ucnl-market-memory` skill and its own vault `ucnlmarket/ucnl-market-memory`.
|
description: Protocol for using creator/obsidian-vault (Gitea repo at h3fq32.golive.ru) as Claude's long-term memory for personal and R&D projects of Arthur Abelentsev. Trigger when the user references past work ("my X project", "we decided Y", "remember that..."), asks Claude to remember/save/update/forget something, mentions a project by name (lotus-eletre, uspeak-trademark, homework-*, 1c-<client>, pcb-*, obsidian, claude-skills), or whenever a substantive insight, decision, or fact surfaces that's worth preserving between sessions. Covers personal context, infrastructure (gitea/traefik/mikrotik/xray), embedded firmware, PCB design, 1C consulting for any client, R&D on UCN products (acoustics, firmware, algorithms), legal/trademark work, travel, vehicle/hardware, and general life. Also covers answering non-trivial project questions that benefit from previously stored context. Describes vault layout, frontmatter conventions, Gitea REST API mechanics (read/list/search/create/update), naming rules, and write permissions. Do NOT trigger for: simple one-off technical questions or casual chat that doesn't involve the user's ongoing projects. Do NOT trigger for UCN marketing/sales commercial work (clients, distributors, quotes, exhibitions, pricing, product marketing for uWave/Zima2/uSpeak) — that is handled by a separate ucnl-market-memory skill and a separate repo (ucnlmarket/ucnl-market-memory).
|
||||||
---
|
---
|
||||||
|
|
||||||
# obsidian-memory
|
# obsidian-memory
|
||||||
@@ -9,6 +9,32 @@ description: Protocol for using creator/obsidian-vault (Gitea repo at h3fq32.gol
|
|||||||
Vault — обычный git-репо в Gitea, хранит markdown-заметки с YAML-frontmatter.
|
Vault — обычный git-репо в Gitea, хранит markdown-заметки с YAML-frontmatter.
|
||||||
Claude читает и пишет заметки через Gitea REST API.
|
Claude читает и пишет заметки через Gitea REST API.
|
||||||
|
|
||||||
|
## Разграничение доменов — прочитать первым
|
||||||
|
|
||||||
|
У пользователя **два репо памяти** с жёстким разделением:
|
||||||
|
|
||||||
|
| Домен | Репо | Скилл |
|
||||||
|
|---|---|---|
|
||||||
|
| Личные проекты Артура, инфраструктура, embedded, 1С-консалтинг (любые клиенты), R&D по UCN-продуктам, legal/trademark, быт | `creator/obsidian-vault` | **этот скилл** |
|
||||||
|
| Маркетинг и продажи UCN (клиенты, дистрибьюторы, выставки, КП, экспорт, product marketing uWave/Zima2/uSpeak/USBL) | `ucnlmarket/ucnl-market-memory` | `ucnl-market-memory` |
|
||||||
|
|
||||||
|
**Правило жёсткое:** материалы из одного домена НЕ попадают в репо
|
||||||
|
другого. Если тема пограничная — спросить пользователя, не додумывать.
|
||||||
|
|
||||||
|
**Примеры границы:**
|
||||||
|
|
||||||
|
| Запрос | Куда |
|
||||||
|
|---|---|
|
||||||
|
| «Прошивка uWave — обновить через STM32CubeProg» | R&D → **этот скилл** |
|
||||||
|
| «Письмо Mavi Marine по срокам поставки» | sales UCN → `ucnl-market-memory` |
|
||||||
|
| «Расчёт TDOA для uWave USBL» | R&D/алгоритмы → **этот скилл** |
|
||||||
|
| «Слайд для INNOPROM KSA 2026» | маркетинг UCN → `ucnl-market-memory` |
|
||||||
|
| «ТЗ на 1С для Teplovin» | 1С не-UCN → **этот скилл** |
|
||||||
|
| «Скидка дистрибьютору X» | sales UCN → `ucnl-market-memory` |
|
||||||
|
|
||||||
|
«UCN как клиент внутреннего 1С-проекта» — дефолт этот скилл (технический
|
||||||
|
слой), но с коммерческой частью (бюджет, контракт) — уточнить.
|
||||||
|
|
||||||
## Where things live
|
## Where things live
|
||||||
|
|
||||||
- **Gitea:** `https://git.h3fq32.golive.ru`
|
- **Gitea:** `https://git.h3fq32.golive.ru`
|
||||||
@@ -20,26 +46,6 @@ Claude читает и пишет заметки через Gitea REST API.
|
|||||||
Если ни там, ни там его нет — попросить пользователя один раз в начале,
|
Если ни там, ни там его нет — попросить пользователя один раз в начале,
|
||||||
в последующих вызовах использовать.
|
в последующих вызовах использовать.
|
||||||
|
|
||||||
## Domain routing — жёсткое правило
|
|
||||||
|
|
||||||
Есть **два независимых vault'а**, каждый под свою область:
|
|
||||||
|
|
||||||
| Домен | Vault | Skill |
|
|
||||||
|---|---|---|
|
|
||||||
| Личное: infra, embedded, 1С-консалтинг не-UCN, lotus-eletre, uspeak-trademark, homework-*, claude-skills, быт | `creator/obsidian-vault` | **этот** (`obsidian-memory`) |
|
|
||||||
| Маркетинг и продажи UCN: клиенты, дистрибьюторы, лиды, выставки, КП, экспорт, продуктовый маркетинг uWave/Zima2/uSpeak/USBL | `ucnlmarket/ucnl-market-memory` | `ucnl-market-memory` |
|
|
||||||
|
|
||||||
Содержимое одного домена **не попадает** во второй vault. Пограничные
|
|
||||||
случаи (например, внедрение 1С для самой UCN как клиента) — спрашивать
|
|
||||||
у пользователя явно, не угадывать. По умолчанию: техническая сторона
|
|
||||||
(BSL-код, архитектура, миграция) → obsidian-vault; коммерческая
|
|
||||||
сторона (стоимость контракта, отношения с заказчиком, внутренние
|
|
||||||
условия) → ucnl-market-memory.
|
|
||||||
|
|
||||||
Если пользователь говорит «запомни что uWave продаётся Mavi Marine
|
|
||||||
за X» — это UCN sales, сюда писать нельзя. Если говорит «на моём
|
|
||||||
Bambu Lab ASA печатается при 260°C» — это личное, не в ucnl-market-memory.
|
|
||||||
|
|
||||||
## Vault layout
|
## Vault layout
|
||||||
|
|
||||||
```
|
```
|
||||||
@@ -134,7 +140,9 @@ sources: # опционально: откуда знание
|
|||||||
Если разговор касается проекта/системы/темы, по которым у пользователя
|
Если разговор касается проекта/системы/темы, по которым у пользователя
|
||||||
может быть накопленный контекст:
|
может быть накопленный контекст:
|
||||||
|
|
||||||
1. **Поиск по теме.** Content-поиск по vault через API:
|
1. **Проверить домен.** Если это маркетинг/продажи UCN — СТОП,
|
||||||
|
переключиться на `ucnl-market-memory` skill.
|
||||||
|
2. **Поиск по теме.** Content-поиск по vault через API:
|
||||||
```
|
```
|
||||||
GET /api/v1/repos/creator/obsidian-vault/search?q=<keyword>&type=code
|
GET /api/v1/repos/creator/obsidian-vault/search?q=<keyword>&type=code
|
||||||
```
|
```
|
||||||
@@ -143,10 +151,10 @@ sources: # опционально: откуда знание
|
|||||||
```
|
```
|
||||||
GET /api/v1/repos/creator/obsidian-vault/contents/claude/memory/projects
|
GET /api/v1/repos/creator/obsidian-vault/contents/claude/memory/projects
|
||||||
```
|
```
|
||||||
2. **Читаем top-3..5 самых релевантных.** Приоритет: свежесть (`updated`),
|
3. **Читаем top-3..5 самых релевантных.** Приоритет: свежесть (`updated`),
|
||||||
явный `project` match, высокий `relevance`. Исключить `private: true`
|
явный `project` match, высокий `relevance`. Исключить `private: true`
|
||||||
из ответов (но прочитать можно).
|
из ответов (но прочитать можно).
|
||||||
3. **Использовать контекст** в ответе естественно, без меты про «я
|
4. **Использовать контекст** в ответе естественно, без меты про «я
|
||||||
нашёл заметку...».
|
нашёл заметку...».
|
||||||
|
|
||||||
### 2. Когда НЕ искать
|
### 2. Когда НЕ искать
|
||||||
@@ -156,6 +164,7 @@ sources: # опционально: откуда знание
|
|||||||
- Разговорная болтовня, приветствия
|
- Разговорная болтовня, приветствия
|
||||||
- Одноразовые операции
|
- Одноразовые операции
|
||||||
- Вопросы, где пользователь сам дал весь нужный контекст в сообщении
|
- Вопросы, где пользователь сам дал весь нужный контекст в сообщении
|
||||||
|
- Темы маркетинга/продаж UCN — это не сюда
|
||||||
|
|
||||||
### 3. В процессе разговора
|
### 3. В процессе разговора
|
||||||
|
|
||||||
@@ -301,7 +310,5 @@ curl -sS -X POST -H "Authorization: token $TOKEN" \
|
|||||||
и не упоминать.
|
и не упоминать.
|
||||||
- **Честно флагить противоречия** между тем что в vault и что говорит
|
- **Честно флагить противоречия** между тем что в vault и что говорит
|
||||||
пользователь, не исправляя молча.
|
пользователь, не исправляя молча.
|
||||||
- **Не трогать чужой домен.** UCN sales/marketing → только в
|
- **Не писать в `ucnlmarket/ucnl-market-memory` из этого контекста.**
|
||||||
`ucnlmarket/ucnl-market-memory` через skill `ucnl-market-memory`.
|
Если тема всплыла UCN-sales — переключиться на `ucnl-market-memory` skill.
|
||||||
Никогда не дублировать материалы между vault'ами — это не sync,
|
|
||||||
это один источник истины на домен.
|
|
||||||
|
|||||||
+152
-143
@@ -1,14 +1,42 @@
|
|||||||
---
|
---
|
||||||
name: ucnl-market-memory
|
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 of Лаборатория подводной связи и навигации (UCN / UnaVLab). Trigger when the conversation is about UCN commercial activity — clients, distributors, resellers, leads, trade shows (INNOPROM, Saudi Arabia, India), commercial proposals (КП), pricing and discounts, export deals, product marketing for the product lines uWave / Zima2 / uSpeak / ЮСПИК / USBL / Piket / Otzvuk-NV / Scout, regional markets (India, Saudi Arabia, Middle East, Europe), competitors (Kongsberg HiPAP, Sonardyne, EvoLogics), contracts with Mavi Marine, М.Видео/iSPEAK, trademark coexistence, customs/export licensing. Also trigger when the user mentions UCN-commercial projects by name or asks Claude to "remember", "save", or "recall" anything related to selling UCN products. Describes vault layout, frontmatter conventions, Gitea REST API access, domain-routing rules, and multi-user (Claude + д.зайцев + в.виноградова + creator) collaboration. Do NOT trigger for the user's PERSONAL projects (infrastructure, embedded, 1C-consulting for non-UCN clients, lotus-eletre, personal 3D-printing, etc.) — those belong to the separate `obsidian-memory` skill and its vault `creator/obsidian-vault`. Do NOT trigger for purely technical questions about acoustic-positioning theory unrelated to commercial context.
|
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
|
# ucnl-market-memory
|
||||||
|
|
||||||
Протокол работы с `ucnlmarket/ucnl-market-memory` как долговременной
|
Протокол работы с `ucnlmarket/ucnl-market-memory` как долговременной
|
||||||
памятью по маркетингу и продажам Лаборатории подводной связи и навигации
|
памятью для всего что касается **маркетинга и продаж UCN / UnaVLab**.
|
||||||
(UCN / UnaVLab). Репо — обычный git в Gitea, хранит markdown-заметки
|
|
||||||
с YAML-frontmatter. Claude читает и пишет через Gitea REST API.
|
Репо — обычный 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
|
## Where things live
|
||||||
|
|
||||||
@@ -18,79 +46,56 @@ description: Protocol for using `ucnlmarket/ucnl-market-memory` (Gitea repo at h
|
|||||||
- **Visibility:** private (видят только члены org `ucnlmarket`)
|
- **Visibility:** private (видят только члены org `ucnlmarket`)
|
||||||
- **Access:** `bash_tool` + `curl` с `Authorization: token $GITEA_TOKEN`
|
- **Access:** `bash_tool` + `curl` с `Authorization: token $GITEA_TOKEN`
|
||||||
|
|
||||||
Токен должен быть в окружении (`$GITEA_TOKEN`) или в сессионном
|
Токен — тот же что для `obsidian-memory` (он от пользователя `creator`
|
||||||
контексте. Если нет — один раз попросить у пользователя.
|
со scope `write:repository`, доступа к этому приватному репо хватает,
|
||||||
|
т.к. `creator` — owner организации).
|
||||||
|
|
||||||
## Пользователи репо
|
## Repo layout
|
||||||
|
|
||||||
- **creator** (Артур) — owner org, admin
|
|
||||||
- **d.zaitsev** (Дмитрий Зайцев) — member, write (restricted user)
|
|
||||||
- **v.vinogradova** (Виктория Виноградова) — member, write (restricted user)
|
|
||||||
- **claude** — пишет через токен `creator` или свой сервисный
|
|
||||||
|
|
||||||
**Мульти-пользовательность:** в отличие от `obsidian-vault` (один
|
|
||||||
пользователь), с этим репо могут независимо работать Артур, Дмитрий,
|
|
||||||
Виктория. Поэтому в frontmatter обязательное поле `author` — чтобы
|
|
||||||
понимать кто внёс запись и к кому идти за уточнением.
|
|
||||||
|
|
||||||
## Domain routing — жёсткое правило
|
|
||||||
|
|
||||||
| Домен | Vault | Skill |
|
|
||||||
|---|---|---|
|
|
||||||
| UCN sales/marketing: клиенты, дистрибьюторы, лиды, выставки, КП, экспорт, продуктовый маркетинг | `ucnlmarket/ucnl-market-memory` | **этот** (`ucnl-market-memory`) |
|
|
||||||
| Личное: infra, embedded, 1С-консалтинг не-UCN, lotus-eletre, быт | `creator/obsidian-vault` | `obsidian-memory` |
|
|
||||||
|
|
||||||
Один домен — один источник истины. Не дублировать материалы в оба
|
|
||||||
репо. Пограничные случаи (например, 1С-внедрение для самой UCN) —
|
|
||||||
спрашивать у пользователя, не угадывать.
|
|
||||||
|
|
||||||
## Vault layout
|
|
||||||
|
|
||||||
```
|
```
|
||||||
memory/
|
memory/
|
||||||
├── accounts/ clients/distributors/leads: <slug>.md
|
├── accounts/ клиенты, дистрибьюторы, лиды — <slug>.md
|
||||||
├── products/ product lines: uwave.md, zima2.md, uspeak.md, usbl-piket.md, …
|
├── products/ продуктовые линейки (uwave, zima2, uspeak, usbl, …)
|
||||||
├── campaigns/ campaigns, trade shows: innoprom-ksa-2026.md, …
|
├── campaigns/ маркетинговые активности, выставки
|
||||||
├── markets/ regional markets: india.md, saudi-arabia.md, europe.md, …
|
├── markets/ региональные рынки (india, saudi-arabia, europe)
|
||||||
├── facts.md stable general facts (append-only sections)
|
├── facts.md стабильные факты (append-only секциями)
|
||||||
├── preferences.md team style, tone-of-voice, terminology
|
├── preferences.md стиль КП, tone of voice, терминология
|
||||||
└── pricing.md pricing, discounts (sensitive: true!)
|
└── pricing.md прайсы, скидки, Incoterms (sensitive: true)
|
||||||
|
|
||||||
insights/ dated observations: YYYY-MM-DD-<slug>.md
|
insights/ YYYY-MM-DD-<slug>.md — датированные наблюдения
|
||||||
conversations/ session summaries: YYYY-MM-DD-<slug>.md
|
conversations/ YYYY-MM-DD-<slug>.md — выжимки сессий
|
||||||
inbox/ drafts, disputed entries, for review
|
inbox/ черновики и спорные записи на ревью
|
||||||
```
|
```
|
||||||
|
|
||||||
Структура плоская — нет префикса `claude/` как в obsidian-vault,
|
**Принцип `accounts` vs `markets`:**
|
||||||
потому что **весь репо — Claude-память**. Здесь нет пользовательских
|
- `accounts/` — конкретная компания (есть имя, ИНН/ID, контакты, история).
|
||||||
«сырых» папок типа `00-inbox` или `10-projects`.
|
- `markets/` — регион/страна/сегмент (India, Saudi Arabia, offshore-Europe) —
|
||||||
|
нормы, законы, пошлины, конкуренты, предпочитаемые каналы.
|
||||||
|
|
||||||
### accounts/ vs markets/
|
**Принцип `campaigns` vs `insights`:**
|
||||||
|
- `campaigns/` — запланированная/идущая активность с целями и ресурсами.
|
||||||
- **accounts/** — про конкретную компанию (Mavi Marine, М.Видео, Elcom):
|
- `insights/` — разовое наблюдение (услышали на выставке; конкурент
|
||||||
имя, контакты, история отношений, этапы сделок.
|
выпустил Y; клиент отказался по причине Z).
|
||||||
- **markets/** — про регион/страну/сегмент (India, Saudi Arabia,
|
|
||||||
European offshore): нормы, пошлины, каналы, общие тренды конкуренции.
|
|
||||||
|
|
||||||
## Frontmatter
|
## Frontmatter
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
---
|
---
|
||||||
type: account | product | campaign | market | insight | conversation | fact | preference
|
type: account | product | campaign | market | insight | conversation | fact | preference
|
||||||
slug: <kebab-case-id> # = имя файла без .md
|
slug: <kebab-case-id> # совпадает с именем файла без .md
|
||||||
account: <slug> # опц., ссылка на accounts/<slug>.md
|
account: <slug> # опц., ссылка на accounts/<slug>.md
|
||||||
product: <slug> # опц., ссылка на products/<slug>.md
|
product: <slug> # опц., ссылка на products/<slug>.md
|
||||||
market: <slug> # опц., ссылка на markets/<slug>.md
|
market: <slug> # опц., ссылка на markets/<slug>.md
|
||||||
campaign: <slug> # опц., ссылка на campaigns/<slug>.md
|
campaign: <slug> # опц., ссылка на campaigns/<slug>.md
|
||||||
tags: [<tag1>, <tag2>] # свободная форма, kebab-case
|
tags: [<tag1>, <tag2>] # свободная форма, kebab-case
|
||||||
author: claude | d.zaitsev | v.vinogradova | creator
|
author: claude | d.zaitsev | v.vinogradova | creator
|
||||||
created: YYYY-MM-DD
|
created: YYYY-MM-DD
|
||||||
updated: YYYY-MM-DD
|
updated: YYYY-MM-DD
|
||||||
relevance: 0.0-1.0
|
relevance: 0.0-1.0 # важность для ранжирования
|
||||||
confidence: low | medium | high
|
confidence: low | medium | high
|
||||||
stage: lead | qualified | proposal | won | lost | closed # для accounts, опц.
|
stage: lead | qualified | proposal | won | lost | closed # для accounts, опц.
|
||||||
private: false # true → не цитировать в ответах
|
private: false # true → не цитировать, не упоминать
|
||||||
sensitive: false # true → не передавать во внешние API, не экспортировать
|
sensitive: false # true → не во внешние API, не в экспорты
|
||||||
sources:
|
sources:
|
||||||
- conversation: 2026-04-20-<slug>
|
- conversation: 2026-04-20-<slug>
|
||||||
- email: <msg-id>
|
- email: <msg-id>
|
||||||
@@ -98,68 +103,64 @@ sources:
|
|||||||
---
|
---
|
||||||
```
|
```
|
||||||
|
|
||||||
### `private: true`
|
**`private: true`** — читать для контекста можно, в ответах не цитировать,
|
||||||
|
не упоминать о наличии.
|
||||||
|
|
||||||
Читать для контекста можно — в ответах не цитировать, наличие заметки
|
**`sensitive: true`** — сильнее: не передавать содержимое во внешние API
|
||||||
не упоминать.
|
(web_search, AI-ассистенты сторонних вендоров), не включать в экспорты,
|
||||||
|
не показывать людям без явной проверки. Применяется к коммерческой
|
||||||
### `sensitive: true`
|
конфиденциальной информации (скидки, маржа, закрытые условия).
|
||||||
|
|
||||||
**Сильнее private.** Содержимое таких заметок:
|
|
||||||
- Не передавать во внешние API (web search, AI-ассистенты других вендоров).
|
|
||||||
- Не включать в экспорты и сводки за пределы команды.
|
|
||||||
- Не цитировать в query к web_search — перефразировать без конкретики.
|
|
||||||
- Применяется к: прайсам, схемам скидок, маржи, условиям контрактов,
|
|
||||||
ИНН/паспортным данным контрагентов, внутренним конкурентным
|
|
||||||
наблюдениям, переговорным позициям.
|
|
||||||
|
|
||||||
## Protocol
|
## Protocol
|
||||||
|
|
||||||
### 1. В начале разговора по UCN sales/marketing
|
### 1. В начале разговора по маркетингу/продажам UCN
|
||||||
|
|
||||||
1. **Content-поиск** по vault:
|
1. **Content-поиск** по репо:
|
||||||
```
|
```
|
||||||
GET /api/v1/repos/ucnlmarket/ucnl-market-memory/search?q=<keyword>&type=code
|
GET /api/v1/repos/ucnlmarket/ucnl-market-memory/search?q=<keyword>&type=code
|
||||||
```
|
```
|
||||||
2. **Листинг** релевантной папки (`accounts/`, `products/`, `campaigns/`,
|
2. **Листинг релевантной папки** (accounts/products/campaigns/markets)
|
||||||
`markets/`) по имени упомянутой сущности.
|
по имени упомянутой сущности.
|
||||||
3. **Читаем top 3–5** релевантных заметок. Приоритет: явный slug-match,
|
3. **Читаем top 3–5** самых релевантных. Приоритет: явный match по slug,
|
||||||
свежесть `updated`, высокий `relevance`. Исключить `private: true`
|
свежесть `updated`, высокий `relevance`. Исключить `private: true`
|
||||||
из цитирования.
|
из ответов.
|
||||||
4. **Использовать контекст** естественно, без «я нашёл заметку…».
|
4. **Использовать контекст** естественно, без мета-комментариев
|
||||||
|
«я нашёл заметку…».
|
||||||
|
|
||||||
### 2. Когда НЕ искать
|
### 2. Когда НЕ искать
|
||||||
|
|
||||||
- Общетеоретические вопросы об акустике/позиционировании без привязки
|
- Одноразовые справочные вопросы без контекста клиента/продукта.
|
||||||
к коммерции — это через `obsidian-memory` или из общих знаний.
|
- Технические/R&D вопросы по UCN-продуктам — это `obsidian-memory`.
|
||||||
- Одноразовые справочные вопросы.
|
- Разговоры где пользователь сам дал весь нужный контекст в сообщении.
|
||||||
- Пользователь сам дал весь контекст в сообщении.
|
|
||||||
|
|
||||||
### 3. В процессе разговора
|
### 3. В процессе
|
||||||
|
|
||||||
- `[[wiki-links]]` на существующие заметки при упоминании сущностей.
|
- При упоминании сущностей, имеющих свою заметку — `[[wiki-links]]`
|
||||||
- Противоречия между vault и репликой пользователя — флагить явно,
|
в новых заметках (пригодится для Obsidian-навигации).
|
||||||
не исправлять тихо.
|
- Противоречия «память ↔ текущее сообщение» — честно флагить, не тихо
|
||||||
- Если инфо пришло от `v.vinogradova` (записи с `author: v.vinogradova`),
|
исправлять.
|
||||||
а сейчас диалог с `creator` — можно упомянуть источник при необходимости
|
- Обращать внимание на автора последней записи: `d.zaitsev` и
|
||||||
(«по заметке Виктории от DATE, …»).
|
`v.vinogradova` — живые коллеги, у них свой фронт работ; Claude
|
||||||
|
не переписывает их заметки молча, лучше дополнить отдельной записью
|
||||||
|
со ссылкой.
|
||||||
|
|
||||||
### 4. В конце разговора — что и куда сохранять
|
### 4. В конце разговора — что и куда сохранять
|
||||||
|
|
||||||
| Что | Куда |
|
| Что появилось | Куда |
|
||||||
|---|---|
|
|---|---|
|
||||||
| Наблюдение про конкретного клиента | `memory/accounts/<slug>.md` (обновить) или `insights/YYYY-MM-DD-<slug>.md` (разовое) |
|
| Значимое про конкретного клиента | `memory/accounts/<slug>.md` (update) или `insights/YYYY-MM-DD-<slug>.md` |
|
||||||
| Новая позиция в продуктовой линейке | `memory/products/<slug>.md` |
|
| Новая позиция в продуктовой линейке | `memory/products/<slug>.md` |
|
||||||
| Запуск кампании, участие в выставке | `memory/campaigns/<slug>.md` |
|
| Запуск кампании / выставка | `memory/campaigns/<slug>.md` |
|
||||||
| Сдвиг в региональном рынке | `memory/markets/<slug>.md` |
|
| Изменения на региональном рынке | `memory/markets/<slug>.md` |
|
||||||
| Изменение в прайсе / скидках | `memory/pricing.md` (помнить про `sensitive: true`) |
|
| Изменение в прайсе | `memory/pricing.md` (sensitive!) |
|
||||||
| Новое предпочтение по стилю/терминологии | `memory/preferences.md` |
|
| Предпочтение команды | `memory/preferences.md` |
|
||||||
| Стабильный факт общего характера | `memory/facts.md` (append в секцию) |
|
| Стабильный факт общего характера | `memory/facts.md` (append в секцию) |
|
||||||
| Выжимка сессии | `conversations/YYYY-MM-DD-<slug>.md` |
|
| Выжимка беседы | `conversations/YYYY-MM-DD-<slug>.md` |
|
||||||
| Сомневаюсь куда | `inbox/` + явная пометка пользователю |
|
| Сомневаюсь куда | `inbox/` + явная пометка пользователю |
|
||||||
|
|
||||||
**Критерий записи:** «если через полгода другой Claude прочитает — даст
|
**Не писать ради галочки.** Лучше 0 файлов, чем пять пустословных.
|
||||||
ли это ему что-то полезное?». Если нет — не писать.
|
Критерий: «если через полгода Claude или Дмитрий/Виктория прочитают
|
||||||
|
эту заметку — даст ли она что-то?».
|
||||||
|
|
||||||
## Gitea REST API — шпаргалка
|
## Gitea REST API — шпаргалка
|
||||||
|
|
||||||
@@ -168,92 +169,100 @@ GITEA=https://git.h3fq32.golive.ru
|
|||||||
REPO=ucnlmarket/ucnl-market-memory
|
REPO=ucnlmarket/ucnl-market-memory
|
||||||
TOKEN=$GITEA_TOKEN
|
TOKEN=$GITEA_TOKEN
|
||||||
|
|
||||||
# ── READ ────────────────────────────────────────────────────────────────
|
# ── READ ────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
# Файл (raw)
|
||||||
curl -sS -H "Authorization: token $TOKEN" \
|
curl -sS -H "Authorization: token $TOKEN" \
|
||||||
"$GITEA/api/v1/repos/$REPO/raw/memory/accounts/mavi-marine.md"
|
"$GITEA/api/v1/repos/$REPO/raw/memory/accounts/mavi-marine.md"
|
||||||
|
|
||||||
|
# Листинг папки
|
||||||
curl -sS -H "Authorization: token $TOKEN" \
|
curl -sS -H "Authorization: token $TOKEN" \
|
||||||
"$GITEA/api/v1/repos/$REPO/contents/memory/accounts?ref=main"
|
"$GITEA/api/v1/repos/$REPO/contents/memory/accounts?ref=main"
|
||||||
|
|
||||||
|
# Поиск
|
||||||
curl -sS -H "Authorization: token $TOKEN" \
|
curl -sS -H "Authorization: token $TOKEN" \
|
||||||
"$GITEA/api/v1/repos/$REPO/search?q=mumbai+uwave&type=code"
|
"$GITEA/api/v1/repos/$REPO/search?q=mumbai+usbl&type=code"
|
||||||
|
|
||||||
|
# Tree (целиком)
|
||||||
curl -sS -H "Authorization: token $TOKEN" \
|
curl -sS -H "Authorization: token $TOKEN" \
|
||||||
"$GITEA/api/v1/repos/$REPO/git/trees/main?recursive=true"
|
"$GITEA/api/v1/repos/$REPO/git/trees/main?recursive=true"
|
||||||
|
|
||||||
# ── WRITE (create) ──────────────────────────────────────────────────────
|
# ── WRITE ───────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
# Create (POST). Поле "content" (не content_base64!)
|
||||||
content_b64=$(base64 -w0 /tmp/note.md)
|
content_b64=$(base64 -w0 /tmp/note.md)
|
||||||
curl -sS -X POST -H "Authorization: token $TOKEN" \
|
curl -sS -X POST -H "Authorization: token $TOKEN" \
|
||||||
-H "Content-Type: application/json" \
|
-H "Content-Type: application/json" \
|
||||||
"$GITEA/api/v1/repos/$REPO/contents/memory/accounts/new-lead.md" \
|
"$GITEA/api/v1/repos/$REPO/contents/memory/accounts/new.md" \
|
||||||
-d "{\"message\":\"claude: добавил лид из Мумбая\",\"content\":\"$content_b64\",\"branch\":\"main\"}"
|
-d "{\"message\":\"claude: save — new lead\",\"content\":\"$content_b64\",\"branch\":\"main\"}"
|
||||||
|
|
||||||
# ── WRITE (update) ──────────────────────────────────────────────────────
|
|
||||||
|
|
||||||
|
# Update (PUT, нужен sha)
|
||||||
sha=$(curl -sS -H "Authorization: token $TOKEN" \
|
sha=$(curl -sS -H "Authorization: token $TOKEN" \
|
||||||
"$GITEA/api/v1/repos/$REPO/contents/memory/accounts/mavi-marine.md?ref=main" \
|
"$GITEA/api/v1/repos/$REPO/contents/memory/facts.md?ref=main" \
|
||||||
| python3 -c "import sys,json; print(json.load(sys.stdin)['sha'])")
|
| python3 -c "import sys,json; print(json.load(sys.stdin)['sha'])")
|
||||||
content_b64=$(base64 -w0 /tmp/mavi-new.md)
|
content_b64=$(base64 -w0 /tmp/facts-new.md)
|
||||||
curl -sS -X PUT -H "Authorization: token $TOKEN" \
|
curl -sS -X PUT -H "Authorization: token $TOKEN" \
|
||||||
-H "Content-Type: application/json" \
|
-H "Content-Type: application/json" \
|
||||||
"$GITEA/api/v1/repos/$REPO/contents/memory/accounts/mavi-marine.md" \
|
"$GITEA/api/v1/repos/$REPO/contents/memory/facts.md" \
|
||||||
-d "{\"message\":\"claude: обновил mavi-marine — PO подтверждён\",\"content\":\"$content_b64\",\"sha\":\"$sha\",\"branch\":\"main\"}"
|
-d "{\"message\":\"claude: update facts\",\"content\":\"$content_b64\",\"sha\":\"$sha\",\"branch\":\"main\"}"
|
||||||
|
|
||||||
# ── WRITE (batch) ───────────────────────────────────────────────────────
|
|
||||||
|
|
||||||
|
# Batch
|
||||||
curl -sS -X POST -H "Authorization: token $TOKEN" \
|
curl -sS -X POST -H "Authorization: token $TOKEN" \
|
||||||
-H "Content-Type: application/json" \
|
-H "Content-Type: application/json" \
|
||||||
"$GITEA/api/v1/repos/$REPO/contents" \
|
"$GITEA/api/v1/repos/$REPO/contents" \
|
||||||
-d '{
|
-d '{
|
||||||
"branch": "main",
|
"branch": "main",
|
||||||
"message": "claude: session summary — INNOPROM KSA",
|
"message": "claude: session — mavi RFQ update",
|
||||||
"files": [
|
"files": [
|
||||||
{"operation":"create","path":"conversations/2026-04-20-innoprom-ksa.md","content":"<b64>"},
|
{"operation":"create","path":"conversations/2026-04-20-mavi-rfq.md","content":"<b64>"},
|
||||||
{"operation":"update","path":"memory/campaigns/innoprom-ksa-2026.md","content":"<b64>","sha":"<prev>"}
|
{"operation":"update","path":"memory/accounts/mavi-marine.md","content":"<b64>","sha":"<prev>"}
|
||||||
]
|
]
|
||||||
}'
|
}'
|
||||||
```
|
```
|
||||||
|
|
||||||
## Gotchas
|
## Gotchas (общие с obsidian-memory, напомним)
|
||||||
|
|
||||||
1. **`content`, не `content_base64`.** В `POST /contents` и batch —
|
1. **`content`, не `content_base64`.** Иначе файл нулевого размера.
|
||||||
поле именно `content`. Иначе файл нулевого размера.
|
2. **URL-encode путей** с пробелами/кириллицей.
|
||||||
2. **URL-encode путей.** Кириллица/пробелы → percent-encode.
|
3. **`PUT` требует `sha`** текущей версии файла.
|
||||||
3. **`PUT` требует `sha` текущей версии.** Забыл — 409 Conflict.
|
4. **`sensitive: true` — не подсвечивать во внешних поисках.** Если
|
||||||
4. **Ветка `main` существует с первого коммита** (репо был инициализирован
|
Claude собирается делать web_search на основе данных из sensitive-
|
||||||
с `auto_init: true`).
|
заметки (например, искать что-то по номенклатуре цены) — формулировать
|
||||||
5. **Rate limit.** Batch лучше N одиночных запросов — один коммит
|
запросы так, чтобы не утекали конкретные цифры и условия.
|
||||||
в истории, дешевле по HTTP.
|
|
||||||
6. **`sensitive: true` + web_search.** Не класть конкретику из
|
|
||||||
sensitive-заметки в поисковый запрос. Перефразировать.
|
|
||||||
|
|
||||||
## Commit messages
|
## Commit message format
|
||||||
|
|
||||||
Префикс `claude:` для всех коммитов Claude:
|
Префикс `claude:` для коммитов Claude:
|
||||||
- `claude: save <тема>` — новая заметка
|
- `claude: save <тема>` — новая заметка
|
||||||
- `claude: update <путь> — <что>` — правка
|
- `claude: update <путь> — <что>` — правка
|
||||||
- `claude: merge <откуда> → <куда>` — переорганизация
|
- `claude: merge <откуда> → <куда>` — переорганизация
|
||||||
|
|
||||||
|
Позволяет Дмитрию и Виктории фильтровать изменения от Claude
|
||||||
|
(`git log --grep "^claude:"`).
|
||||||
|
|
||||||
## Naming
|
## Naming
|
||||||
|
|
||||||
- ASCII-kebab-case. Кириллица → транслит или англ.: `мави-марин` → `mavi-marine`.
|
- Всё ASCII-kebab-case. Русские имена → транслит или англ.: `мави-марин` → `mavi-marine`.
|
||||||
- `YYYY-MM-DD-<slug>.md` для `insights/`, `conversations/`.
|
- `YYYY-MM-DD-<slug>.md` для датированных (insights/, conversations/).
|
||||||
- slug в `accounts/` = однозначный short name компании.
|
- slug в `accounts/` = официальное short name компании, однозначно.
|
||||||
- slug в `products/` = внутреннее имя продуктовой линейки (uwave, zima2, uspeak).
|
- Slug продукта = продуктовый код UCN: `uwave`, `zima2`, `uspeak`, не `usbl-system-v2`.
|
||||||
- slug в `markets/` = ISO-сокращение или общепринятое имя (india, ksa, uae, eu).
|
|
||||||
|
|
||||||
## Boundaries
|
## Boundaries
|
||||||
|
|
||||||
- **Не трогать `creator/obsidian-vault`** — это другой домен, другой skill.
|
- **Не писать в `obsidian-vault` из этого контекста.** Если тема явно
|
||||||
- **Не дублировать** материалы между репо. Один источник истины на тему.
|
про R&D/embedded/инфраструктуру — сказать пользователю и переключиться
|
||||||
- **Не цитировать `private: true`** в ответах.
|
(или спросить).
|
||||||
- **Не передавать `sensitive: true`** во внешние API.
|
- **Не удалять чужие заметки.** Если есть сомнение в актуальности —
|
||||||
- **Не удалять файлы без явной команды пользователя.** Устаревшее —
|
`private: true` или обсудить.
|
||||||
`private: true` или перенести в `inbox/` с пометкой.
|
- **Не обходить `sensitive: true`.** Не цитировать наружу, не включать
|
||||||
- **Честно флагить противоречия** между памятью и тем что говорит
|
в материалы для третьих сторон.
|
||||||
пользователь сейчас.
|
- **Конфликты между заметками `d.zaitsev` и `v.vinogradova`** — флагить
|
||||||
- **Respect multi-user:** если запись сделал другой член команды
|
пользователю, не разруливать самостоятельно.
|
||||||
(`author: v.vinogradova`) — не переписывать её силой, можно добавить
|
|
||||||
свою заметку рядом или в `inbox/` с предложением.
|
## Контакты команды
|
||||||
|
|
||||||
|
- **Дмитрий Зайцев** (`d.zaitsev`, d.zaitsev@unavlab.com) — член команды
|
||||||
|
`members`, write-доступ.
|
||||||
|
- **Виктория Виноградова** (`v.vinogradova`, v.vinogradova@unavlab.com) —
|
||||||
|
член команды `members`, write-доступ.
|
||||||
|
- **Артур (`creator`)** — owner организации `ucnlmarket`, admin.
|
||||||
|
|||||||
Reference in New Issue
Block a user