Repository navigation
05 Experience.ru
Хранилище существует потому, что «обращайся к своему опыту» не выполняет никто. Это стоит модели обхода каталога и догадки. «Запусти одну команду, которая вернёт три лучших кандидата с их применимостью» стоит одной команды. Поэтому набор поставляет команду.
python tools/experience.py search "ещё одно поле в отчёте"memory/
index.json пересобирается из записей; руками не правится
tasks/ записи задач: что просили, что пробовали, что сделали, что проверили
recipes/ рецепты решений, а не расшифровки
artifacts/ файлы, конфиги, скрипты, промпты, чек-листы, которые стоит адаптировать
failures/ что не сработало, корневая причина, работающая альтернатива
Запись — обычный Markdown: заголовок из двенадцати ключей, затем тело. Ничего не нужно ставить и мигрировать, читается в диффе.
id: add-column-to-endpoint
type: recipe # task | recipe | artifact | failure
title: Add a nullable column to a reporting endpoint
status: validated # draft | validated | deprecated
confidence: high # low | medium | high
applicability: PHP endpoint on MySQL where the column is additive and no client parses SELECT *
tags: [php, mysql, migration]
created_at: 2026-10-24
updated_at: 2026-10-24
last_verified_at: 2026-10-24
source: user task
related: []Тело рецепта несёт пять разделов, и check отклоняет запись, если какого-то нет:
## Problem ## When to use ## Procedure ## Validation ## Rollback
## Rollback обязателен намеренно: рецепт без пути отмены — это ловушка с хорошим названием.
| Команда | Что делает |
|---|---|
experience.py init |
создаёт четыре каталога и пустой индекс |
experience.py add <файл> |
проверяет запись и раскладывает её по типу |
experience.py search "<слова>" |
ранжированные кандидаты с причиной каждой позиции |
experience.py show <id> |
полная запись |
experience.py check |
схема, секреты, машинные пути, дубликаты, устаревание |
experience.py stats |
счётчики по типам и статусам |
experience.py deprecate <id> --by <id> |
снимает запись с учёта, не удаляя её |
experience.py selftest |
тринадцать фикстур: отказы действительно отказывают |
Коды возврата: 0 чисто, 1 находки уровня ошибки, 2 ошибка вызова.
Замерено на песочнице с одной записью, поиск словами самой задачи:
query: report needs one more field · 1 candidate(s)
[ 25] recipe add-column-to-endpoint validated overlap 5, validated, high confidence, verified 1d ago
Add a nullable column to a reporting endpoint — memory/recipes/add-column-to-endpoint.md
В этой строке видны четыре решения: оценка позиции, тип, статус и — почему: пересечение терминов, проверенность, уверенность, свежесть. Результат без причины нельзя проверить аудитом, поэтому инструмент её печатает всегда.
Замерено через selftest — это настоящие отказы, а не документация:
| Ситуация | Что говорит инструмент |
|---|---|
| литерал доступа в теле записи | exp.secret … redact to a <placeholder> |
рецепт без ## Rollback
|
exp.recipe-sections … a recipe needs ## Rollback |
| абсолютный машинный путь | exp.abs-path … use <path> |
| две записи с одним id | exp.duplicate-id |
снятая с учёта запись без superseded_by
|
предупреждение, а не молчание |
| пустое хранилище |
exp.empty — искать нечего, поэтому это не успех |
Запись — гипотеза. Каждый вопрос должен пройти, иначе запись адаптируют (назвав адаптацию) либо отклоняют.
| # | Вопрос | Провал, когда |
|---|---|---|
| 1 | та же цель? | запись решала соседнюю задачу |
| 2 | то же окружение? | версии, пути, права или зависимости отличаются |
| 3 | допущения ещё держатся? | схема, API или контракт изменились |
| 4 | его проверка покрывает мой критерий приёмки? | оно доказало «страница отрисовывается», а нужно «выгрузка побайтово та же» |
| 5 | правила безопасности всё ещё позволяют? | прошлый подход хранил доступ в файле конфигурации |
| 6 | запись ещё актуальна? |
last_verified_at старый, и проверку никто не повторял |
Невысказанная адаптация неотличима от слепого копирования — отсюда требование назвать её в ответе
(раздел ## Reused experience).
- Записывайте то, что многоразово, очищено и достаточно общо, чтобы пригодиться в другом месте.
- Никогда не записывайте разовый контекст, приватные деловые данные или непроверенное.
- Обновляйте существующую запись вместо создания почти-дубликата.
- Связывайте запись задачи с рецептами, артефактами и записями неудач, которые она породила.
- Помечайте устаревшее через
superseded_by; история аудита не удаляется. - Ставьте
last_verified_atтолько после настоящей повторной проверки — никогда после простого чтения записи.
Записи — это содержимое, а содержимое утекает. Используйте заглушки: <API_KEY>, <HOST>, <USER>,
<PATH>, <CUSTOMER>, <DB>. Запись, которая касается приватного контекста, объявляет свою
чувствительность (public, internal, restricted), и restricted не сохраняется вовсе. В публичные
репозитории попадают только очищенные примеры.
| Ловушка | Симптом | Действие |
|---|---|---|
| записывать каждую задачу | хранилище заполняется шумом, поиск ничего не находит, агент перестаёт искать | записывать только многоразовое, общее, проверенное |
| считать запись истиной | старый рецепт применён в изменившемся окружении | пройти шесть вопросов и назвать адаптацию |
| два хранилища | один агент ведёт личные заметки рядом с общим | одно хранилище, одна схема, одна команда |
правка index.json руками |
поиск и stats расходятся с файлами |
дать add/check пересобрать индекс |
устаревший last_verified_at
|
ранжирование поднимает запись, которую год никто не проверял | обновлять только повторным прогоном её ## Validation
|
check на репозитории как есть |
он же помечает собственный README.ru.md в хранилище как запись без заголовка: проверка исключает только README.md
|
известный дефект проверки; укажите --root на своё окружение, где лежат только настоящие записи |
Дальше: Проверки — ворота, режимы отказа и ловушки в одном месте.
репозиторий · релизы · MIT