Достижения и командные челленджи
Достижения и командные челленджи — это поверхность прогресса в Mockarty, включаемая по желанию. Она отвечает на два вопроса: «сколько я здесь сделал» и «что я попробовал впервые» — а для команды: «сколько нас до этого дошло». Это фундамент: движок измерения и его правила, а не система очков или рейтингов.
Только по желанию. О вас ничего не измеряется, пока вы это не включите, а выключение это прекращает. См. Включение и выключение.
Что измеряется, а что — нет
Прогресс читается из работы, которую платформа уже записала. Второго учёта нет: достижение никогда не считает то, чего не подтвердил прогон, мок или перехваченный запрос.
Все входы, которые может читать достижение, перечислены в одном месте, и список закрыт. Две категории входов отклоняются намеренно, и отказ называет правило:
| Отклонённый вход | Почему |
|---|---|
| Всё, что вы оплачиваете — места, подписка, оплачиваемые минуты раннера, израсходованные ИИ-операции, купленные кредиты | Прогресс нельзя купить. Достижение, растущее от покупки, измеряло бы ваш счёт, а не вашу работу |
| Находки security и fuzz | Находка — это дефект тестируемого продукта, а не достижение человека. Награда за находки оплачивает оставленные открытыми дефекты — и тем больше, чем они серьёзнее |
| Регистрация, вход, принятие приглашения | Это не работа и это тривиально повторяемо. Классический способ сделать счёт бессмысленным |
Для достижения категории «обучение» правило строже: его можно получить только за то, что вы сделали — за завершённый прогон, — но не за то, чем вы владеете. Владеть сотней моков — это накопление; впервые запустить контрактный тест — это обучение.
Достижение, называющее несуществующий вход, тоже отклоняется. Ни в одном из случаев оно не выдаётся молча ни за что, и ни в одном из случаев оно не выдаётся молча всем.
Как считается прогресс
Числа защищают два свойства, и оба видны снаружи:
- Разная работа, а не попытки. Один завершённый прогон — это один прогон, сколько бы раз платформу о нём ни спросили. Повторные запросы одного и того же не могут поднять число.
- Измерено — или не измерено. Но не выдуманный ноль. Если вход прочитать нельзя, поверхность это и говорит, а не показывает
0 из 10. Ноль — это измерение, и Mockarty его не выдумывает.
Достижения и командные челленджи
Достижение — личная запись: список входов, «сколько достаточно» для каждого и, необязательно, скользящее окно («за последние 30 дней»). Своего окна у него нет.
Командный челлендж — то же измерение, но с началом, концом и жизненным циклом (черновик, активен, завершён). Его счёт считает только включившихся: коллега, не включивший отслеживание, не попадает ни в числитель, ни в знаменатель. Счёт всегда идёт рядом с числом включившихся, чтобы «3» нельзя было прочитать как «все».
Оба вида делят одно пространство имён имён, поэтому одно и то же имя никогда не означает две разные цели.
Определение неизменяемо
Достижение или челлендж нельзя отредактировать. Это намеренно: правка на месте задним числом изменила бы то, что люди уже заработали против него.
Чтобы изменить цель, отозвите её и создайте новую. Отзыв освобождает имя, а уже полученные награды сохраняются — это факты о прошлом, и удаление переписало бы его.
Включение и выключение
Отслеживание прогресса выключено, пока вы его не включите, и оно всегда про вас: чужую запись нельзя ни прочитать, ни закрыть — даже владельцу пространства.
- Включение запускает (или возобновляет) ваше отслеживание. Оно идемпотентно — повторный запрос ничего не меняет.
- Выключение его прекращает и скрывает ваш прогресс от вас. Уже полученные награды сохраняются, а не удаляются.
- Повторное включение возобновляет вместе с уже сделанной работой, потому что прогресс читается из записи, а не хранится.
Пока вы не включились, чтение прогресса отвечает «не включено», а не строкой нулей — так «я не включал» и «я включил, но пока ничего не произошло» никогда не выглядят одинаково.
Работа с API
Все маршруты привязаны к пространству имён и требуют токен с доступом к нему. Замените $MOCKARTY_API_TOKEN и sandbox на свои.
Посмотреть, что можно измерять
curl http://localhost:5770/api/v1/namespaces/sandbox/gamification/catalogue \
-H "Authorization: Bearer $MOCKARTY_API_TOKEN"
Ответ перечисляет каждый вход с allowed: true (с классом доказательства, способом подсчёта и наличием окна) и каждый отклонённый вход с правилом, которое его отклоняет. Прочитайте это прежде, чем что-то определять — это полный словарь.
Определить достижение
Определять, что измеряет пространство, — действие уровня владельца: участник не должен решать, по чему измеряют его коллег.
curl -X POST http://localhost:5770/api/v1/namespaces/sandbox/gamification/definitions \
-H "Authorization: Bearer $MOCKARTY_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"key": "first-test-plan-week",
"title": "Три прогона тест-плана за неделю",
"description": "Засчитываются три завершённых прогона тест-плана за последние семь дней.",
"category": "progress",
"kind": "achievement",
"idempotency_key": "define-first-test-plan-week",
"terms": [
{"source": "run.test_plan.settled", "threshold": 3, "window_days": 7}
]
}'
idempotency_key делает вызов безопасным к повтору: тот же ключ от того же человека даёт то же определение, а не дубликат. key, уже занятый живым определением, отклоняется — сперва отзовите старое.
Отказы конкретны, и это самая полезная часть:
| Статус | Значение |
|---|---|
400 invalid_definition |
Определение некорректно или называет неизвестный платформе вход |
422 source_forbidden |
Терм читает то, что отклоняют правила — сообщение называет класс и причину |
409 definition_key_taken |
key уже называет живое определение в этом пространстве |
Список и отзыв определений
curl http://localhost:5770/api/v1/namespaces/sandbox/gamification/definitions \
-H "Authorization: Bearer $MOCKARTY_API_TOKEN"
curl -X DELETE http://localhost:5770/api/v1/namespaces/sandbox/gamification/definitions/first-test-plan-week \
-H "Authorization: Bearer $MOCKARTY_API_TOKEN"
Включить, прочитать прогресс, выключить
curl -X POST http://localhost:5770/api/v1/namespaces/sandbox/gamification/enrolment \
-H "Authorization: Bearer $MOCKARTY_API_TOKEN"
curl http://localhost:5770/api/v1/namespaces/sandbox/gamification/progress \
-H "Authorization: Bearer $MOCKARTY_API_TOKEN"
curl -X DELETE http://localhost:5770/api/v1/namespaces/sandbox/gamification/enrolment \
-H "Authorization: Bearer $MOCKARTY_API_TOKEN"
progress возвращает, включено ли у вас отслеживание, насколько близко каждое достижение, что вы заработали и командные челленджи пространства. Каждый терм несёт собственное показание и признак «измерено», поэтому частично читаемое достижение сообщается честно, а не округляется до числа.
Закрыть награду
curl -X POST http://localhost:5770/api/v1/namespaces/sandbox/gamification/awards/first-test-plan-week \
-H "Authorization: Bearer $MOCKARTY_API_TOKEN"
Отправлять нечего: сервер сам перечитывает запись и решает. Вы не можете наградить себя за то, чего не сделали.
| Статус | Значение |
|---|---|
201 |
Награда записана |
200 |
Она у вас уже была — та же награда, повтор |
409 not_enrolled |
Сначала включите отслеживание прогресса |
409 not_earned |
Пока не завершено; ничего не начислено |
503 gamification_unavailable |
Доказательство прочитать не удалось, поэтому решение не принято |
Повторное закрытие безопасно, и в этом суть: второй вызов возвращает ту же награду, поэтому никакое число запросов не меняет заработанное.
Командные челленджи
curl http://localhost:5770/api/v1/namespaces/sandbox/gamification/challenges \
-H "Authorization: Bearer $MOCKARTY_API_TOKEN"
Каждый челлендж сообщает earned_members (включившиеся, получившие его внутри окна) вместе с enrolled_members (сколько людей включились вообще).
Кому что можно
| Действие | Кто |
|---|---|
| Читать словарь входов, свой прогресс, командные челленджи | Любой участник пространства |
| Включить, выключить отслеживание, закрыть свои награды | Любой участник пространства — и только для себя |
| Определить или отозвать достижение либо челлендж | Владелец пространства |
Определение и отзыв пишутся в журнал аудита, включая то, какие входы читает определение. Награды — нет: это ваша собственная запись, а не изменение полномочий над кем-то другим.