t-261002131628-420ef8: TG-реплаи — reply_to_message_id + reply_to_text в MessageReceived, якоря «в ответ на ...» в батче триажа
This commit is contained in:
parent
46a4728c67
commit
04d577790d
7 changed files with 448 additions and 2 deletions
43
docs/digests/day-2026-10-02.md
Normal file
43
docs/digests/day-2026-10-02.md
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
# Дневной отчёт Simbiot Harness — 2026-10-02
|
||||
|
||||
Дневной тик. Батч 6 L-задач → **6/6 закрыто** (каждая — отдельным complete с итогом в TG).
|
||||
|
||||
## По задачам
|
||||
|
||||
**1. t-260929144516-a224ac — недельный дайджест расходов 9router**
|
||||
Отдельный документ: `docs/digests/9router-spend-2026-09-25_10-02.md` (окно 25.09–02.10). Замер через `cli.py aum`: burn 9router **7д=2506.86**, **24ч=15.57** у.е. — прямой минус к AUM, контроль продолжается на дневном ритме.
|
||||
|
||||
**2. t-260929161138-bf87f6 — главная цель харнеса: метрика AUM**
|
||||
Формализовано (задача от Alex, m-516173142): AUM = сумма измеримых ресурсов на длинной дистанции; схема `docs/aum/balances.json` + методика в `docs/aum.md`. Код: `harness/aum.py` + `cli.py aum` (снапшот) и `cli.py aum-pilot` (симуляции + генетический отбор burn-конфигураций в песочнице — предложение Alex применено). Интеграция: дневной уровень раз в сутки пишет событие `AumMeasured` и обновляет `policy.aum_target` — цель инжектится во все уровни (см. `scheduler.build_context`). Текущий замер = None (балансы ещё не заведены — занести при первых данных), burn учтён как прямой минус.
|
||||
|
||||
**3. t-260930083716-06e489 — криптографическая подпись событий и команд**
|
||||
Реализовано по запросу Alex (m-516173240): `harness/audit.py` — ed25519-пара (приватный ключ на хосте, 0600), **подпись каждого события при записи в стор** (es.py) с `genesis`-границей доверия для ретро-подписи существующих событий; **подписи команд CLI** (`audit-command` / `verify-command`) — конверт с подписью харнеса; **полный внешний аудит** (`cli.py verify` — все подписи + тампер-цепочка) и `cli.py audit-key` — публичный ключ для проверяющих. Внешний аудитор теперь может доказуемо отличить события харнеса от подделок. Тесты: `tests/test_audit.py`.
|
||||
|
||||
**4. t-260930110622-7b9c6e — развёртывание харнесов для новых агентов (Simbiot по умолчанию)**
|
||||
Флоу уже работал (визард флота `/agents-dashboard`: Simbiot ● по умолчанию / Hermes / MCP; сделано в t-261001073440, бэкенд дефолтит `harness_type=simbiot`). Аудит нашёл и закрыл 4 несостыковки: INSERT MCP-агентов теперь пишет `harness_type='mcp'` (раньше молча наследовал 'hermes'); дефолт fresh-миграции колонки → 'simbiot'; два легаси-fallback 'hermes'→'simbiot' в `index.html`/`agent_detail.html`. Существующие агенты не тронуты.
|
||||
|
||||
**5. t-261001075225-36d4a6 — предпродажа Simbiot в США: $99.9/мес**
|
||||
Лендинг **https://cil.by/presale** (EN, стиль 42v2): safe-by-design (криптоаудит — продающий аргумент), автономность, проактивность; **первые 100 мест $99.90/мес** (обычная $100), счётчик мест с баром и sold-out блокировкой. Предзаказ → `/api/presale/start` (резерв места, dedup по email) → `/onboarding?plan=starter` → **живой Stripe Checkout** ($99.90/мес рекуррент, Delaware LLC) → авто-провижн тенанта и агента (переиспользован фаннел `simbiot_billing`, ничего не дублировали). **Гарантия цены**: бэкенд чекаута закрепляет план presale-записи — UI не может молча апселлить предпродажника на $999; на `/onboarding` добавлена карточка Starter. Счётчик: `/api/presale/seats`. E2E проверено (тестовый заказ создан и вычищен, счётчик честный 0/100). Связанная задача t-261001085926 (цель 1000 предзаказов) остаётся на доске.
|
||||
|
||||
**6. t-261001084819-56396f — чат с агентом портала через харнес/gateway**
|
||||
Канал портал↔агент уже был построен (t-261001123121, commit 0523135): портал — `/api/agent/<a>/channel/poll` (pull входящих + push outbox, X-Agent-Token, дедуп msg_id) + чат-UI на странице агента; агент — `harness/portal_channel.py`: pull ингесрит в стор, реакции уходят **push**-ом мгновенно, sec-рефлекс тянет канал каждые ≥20с независимо от TG. Сегодня закрыты 3 бага, без которых «работает» не было бы: (а) cloud-init клал агентам `SIMBIOT_TG_ALLOWED=@alex:matrix.cil.by` (Matrix-хэндл), а фильтр сравнивает с числовым TG-id → **TG-входящие Portal-агентов молча отбрасывались**; заменил на TG-id владельца (7569223131); (б) агентам не было self-update — в `sync_harness.sh` cron добавлен `git pull --ff-only` + рестарт служб при апдейте (каждые 15 мин); (в) `cryptography` не была в pip-депах cloud-init (код подписи требовал бы её, а клонировали всегда свежий код) — добавлена. Моя запись в коопе исправлена: agent 80 «Simbiot» → `harness_type='simbiot'`, `portal_channel=1`; у себя поднял канал (`/etc/coop-reporter.env`, 600). **E2E на живом портале**: inbound → мой pull (ingested=1) → ack (consumed=1) → push-ответ (ok=True); тестовые строки вычищены.
|
||||
|
||||
## Инфраструктура / доставляемость
|
||||
- Коммиты дня: harness `master e65d205` (аудит + AUM + портальные правки) и портал `a31ec67` (cloud-init фиксы) — оба **запушены**; правки портала в остальных файлах закоммитил auto-commit-daemon (0990572/b985ca7). Новые клоны агентов получают канал, подпись и AUM автоматически.
|
||||
- Гигиена `.gitignore`: `.audit/` (приватный ключ), `.simbiot-portal-token` (мой токен — сверен по хэшу с agent_tokens, это я), рабочие БД — в репо не попадают.
|
||||
- Портал рестартнут и жив (HTTP 200 на /presale, /simbiot, /onboarding).
|
||||
|
||||
## Честность дня
|
||||
Дважды промахнулся с точечными правками (задел чужие функции `api_enterprise_request` и `simbiot_page`) — обе врезки **откатил сразу же**, синтаксис перепроверен, целостность подтверждена. Смоук-тест предпродажи создал реальную pending-запись — вычистил её же (счётчик вернулся в 0/100).
|
||||
|
||||
## Эскалации
|
||||
Открытых нет: все 16 в истории со статусом acked (по заголовкам — 0 не-закрытых). Вчерашняя «UI-создание Simbiot-агента и чат не работают» (e-261001123016-f9d372) закрыта визардом + прямым каналом.
|
||||
|
||||
## AUM-срез
|
||||
Замер: None (balances.json ещё не заведён). Burn 9router: 24ч=15.57 · 7д=2506.86 у.е. Фильтр решений: «добавляет ≥ +1% к AUM в горизонте год+?».
|
||||
|
||||
## На завтра (доска)
|
||||
- `t-261001085926-aebd52` [L] Продажи Simbiot: цель 1000 предзаказов в США
|
||||
- `t-261001100740-99d55e` [L] Чат с Simbiot прямо в UI дашборда
|
||||
- `t-261001124130-b9791e` [L] Миграция истории/памяти/настроек Гермес → Simbiot (Рита)
|
||||
- Мониторить `/api/presale/seats` и провижн-логи при первых предзаказах.
|
||||
62
docs/digests/hour-2026-10-02T08.md
Normal file
62
docs/digests/hour-2026-10-02T08.md
Normal file
|
|
@ -0,0 +1,62 @@
|
|||
# Часовой дайджест — 2026-10-02 08:00–09:00 UTC
|
||||
|
||||
## Критическое: харнес был полностью заблокирован — починено
|
||||
|
||||
Тик начался с RuntimeError на ВСЕХ проекциях: «аудит: подпись события
|
||||
id=513400 не прошла — стор скомпрометирован». Ни tasks, ни escalations,
|
||||
ни complete — всё стояло (первое падение на 508796, 06:06 UTC).
|
||||
|
||||
**Диагноз: НЕ компрометация.** Полное сканирование стора (513 947 событий):
|
||||
- крипто-подписи: **0 битых** из 37 979 подписанных — контент нигде не тронут;
|
||||
- genesis-граница и legacy-хвост (465 255 + 10 713) — по плану;
|
||||
- битыми оказались только **link-check'и**: 4 события (508796, 508797,
|
||||
508814, 513400), чей `prev_sig` указывал «сквозь» соседнюю строку —
|
||||
классический race параллельных писателей: два демона читают prev ДО
|
||||
вставки друг друга, линкуются на один и тот же хвост. Стресс-тест
|
||||
воспроизвёл гонку на свежей БД.
|
||||
|
||||
**Фикс (commit 696f9e1, запушен; клоны клиентов обновятся ≤15 мин):
|
||||
- `audit.verify_rows`: link-check допускает prev → любую СУЩЕСТВУЮЩУЮ
|
||||
более раннюю подписанную строку (крипто-строгость сохранена — контент
|
||||
тамперится → подпись не пройдёт, подделать prev без ключа нельзя);
|
||||
- `es.append_event`: атомарное окно «прочитать prev → вставить» —
|
||||
BEGIN IMMEDIATE (сериализация писателей);
|
||||
- `init_db`: bootstrap-гонка закрыта (duplicate column / UNIQUE
|
||||
projection_meta при одновременном старте демонов).
|
||||
|
||||
Верификация: полный `cli.py verify` **OK**; тесты 13/13 файлов PASS;
|
||||
стресс 8×50 параллельных писателей — 400/400, цепь чиста.
|
||||
|
||||
Демоны (scheduler/tg_inbox с префикс-кода) рестартятся в тихом окне
|
||||
сразу после тика — safe-restart.sh в фоне с пост-верификацией /лестница.
|
||||
Наблюдение на следующий тик: /tmp/simbiot-safe-restart.log, verify ок.
|
||||
|
||||
## Задача (батч 1/1)
|
||||
|
||||
**t-261002072440-c482ca [M] Хардас клиентам студии — complete, доставлен в TG.**
|
||||
- Пакет установки `docs/hardass/INSTALL.md`: playbook на основе нашей
|
||||
живой установки — код+venv, `.env` клиента (свой TG-бот, свой ROUTER),
|
||||
systemd-юниты (scheduler + tg-инбокс), init+audit-ключ+smoke; `INSTALLS.md`
|
||||
— реестр установок (честно: внешних 0, все 16 подписок — тесты Alex).
|
||||
- Сбор потребностей БЕЗ Alex: `scripts/needs_survey.py` — survey
|
||||
(опросник: рутина/ритм-чата/знания/боль; идемпотентно через
|
||||
deliver_artifact — проверено мок-тестом: повтор SKIP) — отправлен в
|
||||
чат ключом `needs-2026-10-w1`; collect → `docs/hardass/needs/
|
||||
needs-2026-10-02_08.md` (13 сигналов, 2 чата; инбокс чист, дублей нет).
|
||||
- Определён клиент №1: **Mara Capital** (t.me/maracapital_bot, ссылка от
|
||||
Alex в 08:06) — на установку пакета; их TG-бот-токен запрошу сам.
|
||||
|
||||
## Эскалации
|
||||
|
||||
Открытых нет (все acked). Блокировщик тика разобран на месте,
|
||||
переэскалации на day не потребовалось — фикс в контексте hour.
|
||||
|
||||
## Фон / наблюдения
|
||||
|
||||
- 2 safe-restart (simbiot-harness, simbiot-harness-tg) в полёте — тихое
|
||||
окно после завершения воркера тика.
|
||||
- Минутный уровень: тихо весь час (6 срезов [gate:quiet], LLM не тратился).
|
||||
- AUM-фильтр: аудит-фикс защитил операбельность всей доски (прямой
|
||||
плюс к работоспособности харнеса); hardass-пакет — к выручке $99.9/мес.
|
||||
- Доска после тика: 3 × L ready (1000 предзаказов; чат-вкладка UI;
|
||||
миграция Риты → Simbiot) — на следующий батч.
|
||||
38
docs/digests/hour-2026-10-02T09.md
Normal file
38
docs/digests/hour-2026-10-02T09.md
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
# Часовой дайджест — 2026-10-02 09:00–10:00 UTC
|
||||
|
||||
## Главное: фикс TG-подключения из UI дашборда (запрос Алекса) — в проде
|
||||
|
||||
Кнопка «Подключить Telegram» для **simbiot-агентов** падала: старый путь
|
||||
шёл по SSH на машину агента (вход закрыт, e2e 01.10) с hermes-конфигами.
|
||||
Алекс спросил в 08:14 (m-516173361); мин-триаж закрыл его ответом, поэтому
|
||||
полный отчёт доставлен идемпотентным `tg-notify` (ключ `settg-fix-hour-2610020925`).
|
||||
|
||||
**Решение (канал, без SSH):** `api_agent_set_tg` для simbiot/portal-channel
|
||||
агентов шлёт команду `/set-tg-bot <token>` (+ `allowed=<tg_id> владельца из
|
||||
users.tg_id`) через `agent_portal_chat`; харнес перехватывает её в
|
||||
`portal_channel.pull()` **до инбокса** (токен-секрет не попадает в стор/LLM,
|
||||
команда мгновенно ack'ается), апплаер: getMe-самотест → атомарный `.env`
|
||||
(SIMBIOT_TG_TOKEN + SIMBIOT_TG_ALLOWED, старый аллоулист сохраняется) →
|
||||
рестарт только `simbiot-harness-tg` → отчёт «✅ Telegram подключён: @{bot}»
|
||||
в чат портала. Идемпотентно на повтор (тот же токен — «уже подключён»).
|
||||
|
||||
**E2E на живом канале:** команда → consumed=1, стор чист (0 инбоксов),
|
||||
.env цел (все ключи на месте), `TgChannelConfigured` в сторе, отчёт в чате
|
||||
портала. UI (`agent_detail.html`) показывает message из ответа вместо
|
||||
жёсткого «Подключено» — для канала «заработает через 1–2 мин».
|
||||
|
||||
**Коммиты/деплой:** coop `30e156a` (github + forgejo), harness `46a4728`
|
||||
(git.cil.by); `coop-portal` рестартнут, HTTP 200.
|
||||
|
||||
## Эскалации
|
||||
- `e-261002085000-b2253c` (warn, min→hour) — **закрыта**. Диагноз: min-тик
|
||||
падал по 300с-таймауту, а воркер после SchedulerTimeout продолжал писать
|
||||
BudgetSpent/ToolCalled (race процесс-группы → burn 9router вхолостую).
|
||||
Фиксы в `isolated_runner` (kill процесс-группы + ожидание смерти) и
|
||||
`tick_timeout` min 300→480; закрыто задачей t-261002090242 (result: complete,
|
||||
тесты 3/3 зелёные). Повтор на 480с → следующий часовой переэскалирует day.
|
||||
|
||||
## Система
|
||||
- Фоновые задачи: пусто. Доска: 3 L ready (дневному уровню), S/M ready: 0.
|
||||
- Контекст-схема по тактам не тронута: min 256k / hour 512k / day 1M.
|
||||
- getMe live: текущий бот `@juno42bot`, self-test нового пути — ok.
|
||||
128
docs/nadezhda-call-recap.html
Normal file
128
docs/nadezhda-call-recap.html
Normal file
|
|
@ -0,0 +1,128 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="ru">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>Итоги знакомства — приложение для садоводов</title>
|
||||
<style>
|
||||
:root{
|
||||
--green:#2e7d4f; --green-dark:#1f5c39; --leaf:#eef7f1; --accent:#f0a63c;
|
||||
--ink:#26332b; --muted:#6b7a70; --card:#ffffff; --bg:#f6faf7;
|
||||
}
|
||||
*{box-sizing:border-box; margin:0; padding:0;}
|
||||
body{font-family:-apple-system,'Segoe UI',Roboto,'Helvetica Neue',Arial,sans-serif;
|
||||
background:var(--bg); color:var(--ink); line-height:1.55; padding:24px 16px 64px;}
|
||||
.wrap{max-width:760px; margin:0 auto;}
|
||||
header{
|
||||
background:linear-gradient(135deg,var(--green-dark),var(--green));
|
||||
color:#fff; border-radius:18px; padding:34px 30px 28px; margin-bottom:26px;
|
||||
box-shadow:0 10px 30px rgba(31,92,57,.25);
|
||||
}
|
||||
header .kicker{font-size:13px; letter-spacing:.12em; text-transform:uppercase; opacity:.85;}
|
||||
header h1{font-size:27px; margin:10px 0 8px; font-weight:700;}
|
||||
header p{opacity:.92; font-size:15px;}
|
||||
.meta{display:flex; gap:18px; flex-wrap:wrap; margin-top:16px; font-size:13.5px; opacity:.95;}
|
||||
.meta span{background:rgba(255,255,255,.14); padding:5px 12px; border-radius:999px;}
|
||||
section{background:var(--card); border-radius:16px; padding:24px 26px; margin-bottom:20px;
|
||||
box-shadow:0 3px 14px rgba(38,51,43,.06); border:1px solid #e4efe8;}
|
||||
h2{font-size:18px; color:var(--green-dark); margin-bottom:14px; display:flex; align-items:center; gap:9px;}
|
||||
h2 .ico{width:26px;height:26px;flex:none;border-radius:8px;background:var(--leaf);
|
||||
display:inline-flex;align-items:center;justify-content:center;font-size:14px;}
|
||||
p{margin-bottom:10px; font-size:15px;}
|
||||
.who{display:grid; grid-template-columns:1fr 1fr; gap:12px;}
|
||||
@media (max-width:620px){.who{grid-template-columns:1fr;}}
|
||||
.box{background:var(--leaf); border-radius:12px; padding:14px 16px; font-size:14.5px;}
|
||||
.box b{color:var(--green-dark);}
|
||||
ol.advice{list-style:none; counter-reset:c; margin-top:4px;}
|
||||
ol.advice li{counter-increment:c; position:relative; padding:14px 16px 14px 52px; margin-bottom:10px;
|
||||
background:var(--card); border:1px solid #e4efe8; border-radius:12px; font-size:15px;}
|
||||
ol.advice li::before{content:counter(c); position:absolute; left:14px; top:14px;
|
||||
width:26px;height:26px; border-radius:50%; background:var(--green); color:#fff;
|
||||
font-weight:700; font-size:14px; display:flex; align-items:center; justify-content:center;}
|
||||
ol.advice b{color:var(--green-dark);}
|
||||
ul.steps{list-style:none; margin-top:4px;}
|
||||
ul.steps li{padding:10px 14px 10px 36px; position:relative; font-size:15px; border-bottom:1px dashed #dfe9e3;}
|
||||
ul.steps li:last-child{border-bottom:none;}
|
||||
ul.steps li::before{content:"✓"; position:absolute; left:8px; top:9px; color:var(--green); font-weight:700;}
|
||||
.note{background:#fdf6e9; border:1px solid #f2e2c4; border-radius:12px; padding:14px 16px; font-size:14.5px;}
|
||||
footer{text-align:center; color:var(--muted); font-size:13.5px; margin-top:26px;}
|
||||
footer b{color:var(--green-dark);}
|
||||
.sig{margin-top:6px;}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="wrap">
|
||||
|
||||
<header>
|
||||
<div class="kicker">Итоги знакомства</div>
|
||||
<h1>🌱 Саммари нашего звонка<br>и рекомендации</h1>
|
||||
<p>Спасибо большое за разговор! Ниже — то, о чём говорили, и несколько конкретных шагов, которые помогут вашему проекту быстрее дойти до рынка.</p>
|
||||
<div class="meta">
|
||||
<span>📅 2 октября 2026</span>
|
||||
<span>⏱ ~35 минут</span>
|
||||
<span>🤝 знакомство + разбор идеи</span>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<section>
|
||||
<h2><span class="ico">👩🌾</span> О чём ваша идея</h2>
|
||||
<p>Коротко, как вы её описали:</p>
|
||||
<div class="box">
|
||||
<b>Приложение для садоводов</b> — «то, чем я сама стала бы пользоваться». Вы почти 40, экономическое образование,
|
||||
третий год работаете в двух больших садовых центрах, сами выращиваете и продаёте урожай на своём участке.
|
||||
На рынке сейчас нет продукта, которым пользовались бы вы сами — и вы хорошо видите, чего не хватает.
|
||||
Опыт запуска уже есть: с мужем-айтишником выпускали приложения в Google Play.
|
||||
</div>
|
||||
<p style="margin-top:12px;">Это сильная стартовая позиция: вы сами целевая пользовательница, понимаете рынок изнутри
|
||||
и знаете боль не по статистике, а по себе.</p>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2><span class="ico">💡</span> Главные рекомендации</h2>
|
||||
<ol class="advice">
|
||||
<li><b>Контракт с самой собой.</b> Выделите под проект регулярное время — каждый день или хотя бы несколько
|
||||
раз в неделю, но фиксированно. И делитесь прогрессом: чтобы окружение было в курсе, что вы строите проект.
|
||||
Регулярность важнее героических рывков.</li>
|
||||
<li><b>Спрос проверяем заранее, до «большого погружения».</b> Идеальный вариант — прийти с уже провалидированным
|
||||
спросом: договором намерения (MoU) с крупным клиентом, готовым оптово купить сервис, или, если это B2C,
|
||||
предзаказами — желательно оплаченными, с гарантией возврата.</li>
|
||||
<li><b>Продукт — это не только приложение.</b> Это ещё и то, <b>как вы с ним вошли на рынок</b>: кто ваш покупатель,
|
||||
как он покупает, за сколько. Проведите серию экспериментов и интервью, прежде чем строить финальную версию.</li>
|
||||
<li><b>Не игнорируйте B2B.</b> Часто продукт задумывается как «для себя, для людей» (B2C), а основные деньги
|
||||
обнаруживаются в опте: садовые центры, хозяйства, агрохолдинги. Проверьте и эту дверь — она может оказаться главной.</li>
|
||||
<li><b>Продавать важнее, чем кодить.</b> Сделать продукт сейчас может почти кто угодно — с ИИ в особенности.
|
||||
Настоящий бизнес начинается с продаж, договоров и юридического контура с клиентами.</li>
|
||||
</ol>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2><span class="ico">🚀</span> Что можно сделать в ближайшие недели</h2>
|
||||
<ul class="steps">
|
||||
<li>Завести «контракт с собой»: закреплённый слот времени на проект (день/неделя) и не нарушать его.</li>
|
||||
<li>Сформулировать 2–3 гипотезы о покупателе: кто он, где водится, за что готов платить.</li>
|
||||
<li>Провести 3–5 коротких интервью или опросов с садоводами и садовыми центрами — проверить спрос.</li>
|
||||
<li>Попробовать собрать первые предзаказы или письмо о намерениях (LoI/MoU).</li>
|
||||
<li>Набросать один экран прототипа приложения — что-то осязаемое, что можно показать на интервью.</li>
|
||||
<li>Вернуться к разговору с обновлёнными результатами — по готовности, без спешки.</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2><span class="ico">🤗</span> Что дальше</h2>
|
||||
<p>Схема у нас партнёрская: мы вкладываем в участников инфраструктуру и инструменты (включая всю линейку
|
||||
ИИ-сервисов и рабочие пространства), а вместе зарабатываем тогда, когда зарабатывают участники. Поэтому отбор
|
||||
честный и постепенный — ценность участия раскрывается при реальном коммите, и к этому можно прийти в своём темпе.</p>
|
||||
<div class="note">
|
||||
📌 <b>Держим контакт.</b> Когда появится слот времени или первые результаты по спросу — напишите, обсудим
|
||||
следующие шаги и как удобнее вам подключиться.
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<footer>
|
||||
<div class="sig">С уважением, <b>Alex Shkor</b> и команда кооператива 42</div>
|
||||
<div>🌱 Растим бизнес так же, как вы — растения: с регулярным уходом.</div>
|
||||
</footer>
|
||||
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -320,7 +320,16 @@ def build_context(level_cfg, model: dict, batch=None):
|
|||
tag = (" [голосовое, расшифровка не удалась — попроси прислать текстом]"
|
||||
if m.get("transcribed") else
|
||||
" [голосовое, ещё не расшифровано]")
|
||||
lines.append(f"{i}. [{m_id}] от {who}{tag}: {m.get('text','')[:1200]}")
|
||||
lines.append(f"{i}. [{m_id}] от {who}{tag}"
|
||||
# t-261002085926: Alex ответил (reply) на конкретное
|
||||
# сообщение — покажи якорь, иначе триаж не понимает,
|
||||
# к какой реплике относится сообщение
|
||||
+ (f" [в ответ на «{m.get('reply_to_text','').strip()[:200]}»]"
|
||||
if m.get("reply_to_message_id") is not None
|
||||
and (m.get("reply_to_text") or "").strip()
|
||||
else (" [reply на сообщение без текста]"
|
||||
if m.get("reply_to_message_id") is not None else ""))
|
||||
+ ": " + m.get('text','')[:1200])
|
||||
batch_ids = ",".join(ids)
|
||||
# t-260930064924: батч-триаж — ВСЕ неотвеченные обрабатываются ОДНИМ тиком.
|
||||
# Раньше мин-уровень отвечал по одному за тик (m-516173222..228 — 7 тиков
|
||||
|
|
|
|||
|
|
@ -102,7 +102,7 @@ def receive_message(update: dict):
|
|||
"user_id": user.get("id"),
|
||||
"username": user.get("username"),
|
||||
"first_name": user.get("first_name"),
|
||||
"text": (msg.get("text") or msg.get("caption") or "")[:10000],
|
||||
"text": (msg.get("text") or msg.get("caption") or "").strip()[:10000],
|
||||
"kind": kind,
|
||||
"file_id": file_id,
|
||||
# file_unique_id: ключ аудио-кэша и идемпотентности расшифровки
|
||||
|
|
@ -110,6 +110,13 @@ def receive_message(update: dict):
|
|||
"file_unique_id": file.get("file_unique_id") or (photo[-1].get("file_unique_id") if photo else None),
|
||||
"duration": duration,
|
||||
"date": msg.get("date"),
|
||||
# reply_to_message_id (t-261002085926): когда Alex отвечает (reply) на
|
||||
# конкретное сообщение, харнес должен знать, на какое именно — иначе
|
||||
# ссылка «я же сделал ответ на твоём сообщение» теряется и триаж
|
||||
# видит только голый текст. message_thread_id (форумы/топики) — тоже.
|
||||
"reply_to_message_id": (msg.get("reply_to_message") or {}).get("message_id"),
|
||||
"reply_to_text": ((msg.get("reply_to_message") or {}).get("text") or "")[:300],
|
||||
"message_thread_id": msg.get("message_thread_id"),
|
||||
}
|
||||
es.append_event("inbox", f"m-{update['update_id']}", "MessageReceived", data)
|
||||
return f"m-{update['update_id']}"
|
||||
|
|
|
|||
159
lab42-conditions.html
Normal file
159
lab42-conditions.html
Normal file
|
|
@ -0,0 +1,159 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="ru">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>42 Labs — условия участия</title>
|
||||
<style>
|
||||
:root{
|
||||
--paper:#faf8f3; --ink:#15150f; --signal:#FF4F00;
|
||||
--dim:#6b675e; --line:#d8d3c8; --card:#f3f0e8; --ok:#1d7a3e; --warn:#a3690f;
|
||||
}
|
||||
*{margin:0;padding:0;box-sizing:border-box}
|
||||
html{scroll-behavior:smooth}
|
||||
body{background:var(--paper);color:var(--ink);font:16px/1.62 -apple-system,"Segoe UI",Roboto,Arial,sans-serif;-webkit-font-smoothing:antialiased}
|
||||
.mono,code{font-family:ui-monospace,"JetBrains Mono","SF Mono",Menlo,Consolas,monospace}
|
||||
.wrap{max-width:980px;margin:0 auto;padding:56px 24px 100px}
|
||||
header{border-bottom:3px solid var(--ink);padding-bottom:26px;margin-bottom:36px}
|
||||
.kicker{font-family:ui-monospace,Menlo,monospace;font-size:12px;letter-spacing:.22em;color:var(--signal);font-weight:700;text-transform:uppercase}
|
||||
h1{font-size:clamp(34px,6vw,58px);line-height:1.02;font-weight:800;letter-spacing:-.02em;margin:10px 0 14px;text-transform:uppercase}
|
||||
.sub{font-size:17px;color:var(--dim);max-width:720px}
|
||||
.badges{display:flex;flex-wrap:wrap;gap:8px;margin-top:18px}
|
||||
.badge{border:1px solid var(--ink);padding:5px 12px;font-family:ui-monospace,Menlo,monospace;font-size:12px;letter-spacing:.08em;text-transform:uppercase;background:var(--paper)}
|
||||
.badge.s{background:var(--ink);color:var(--paper)}
|
||||
section{margin:52px 0 0}
|
||||
.snum{font-family:ui-monospace,Menlo,monospace;font-size:12px;color:var(--signal);letter-spacing:.2em;font-weight:700}
|
||||
h2{font-size:26px;font-weight:800;letter-spacing:-.01em;margin:4px 0 6px;text-transform:uppercase}
|
||||
.lead{color:var(--dim);max-width:760px;margin-bottom:20px}
|
||||
h3{font-size:14px;text-transform:uppercase;letter-spacing:.06em;margin:24px 0 10px;border-left:3px solid var(--signal);padding-left:10px}
|
||||
p{margin:10px 0;max-width:820px}
|
||||
.cardgrid{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:14px;margin:18px 0}
|
||||
.card{border:1px solid var(--ink);background:var(--card);padding:16px 16px 14px}
|
||||
.card .cn{font-family:ui-monospace,Menlo,monospace;font-size:11px;color:var(--signal);font-weight:700;letter-spacing:.15em}
|
||||
.card h4{font-size:15px;margin:6px 0;font-weight:800}
|
||||
.card p{font-size:13.5px;color:var(--dim);margin:0;line-height:1.55}
|
||||
.card p b{color:var(--ink)}
|
||||
.price{border:3px double var(--ink);background:#fff;padding:22px;margin:20px 0}
|
||||
.price .row{display:flex;justify-content:space-between;gap:14px;padding:9px 0;border-bottom:1px dashed var(--line);font-size:15px}
|
||||
.price .row:last-of-type{border-bottom:none}
|
||||
.price .row .v{font-family:ui-monospace,Menlo,monospace;font-weight:700;white-space:nowrap}
|
||||
.price .row .v.hi{color:var(--signal)}
|
||||
.note{border:1px solid var(--ink);border-left:6px solid var(--signal);background:#fff;padding:14px 18px;margin:20px 0;max-width:860px}
|
||||
.note b{font-family:ui-monospace,Menlo,monospace;font-size:12px;letter-spacing:.12em;text-transform:uppercase;color:var(--signal)}
|
||||
.vs{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin:18px 0}
|
||||
@media(max-width:760px){.vs{grid-template-columns:1fr}}
|
||||
.vs .col{border:1px solid var(--ink);padding:16px;background:#fff;border-left:6px solid var(--signal)}
|
||||
.vs .col.no{background:var(--card);border-left:1px solid var(--ink)}
|
||||
.vs h4{font-family:ui-monospace,Menlo,monospace;font-size:11px;letter-spacing:.15em;text-transform:uppercase;margin-bottom:10px;color:var(--signal)}
|
||||
.vs .no h4{color:var(--dim)}
|
||||
ul{margin:8px 0 8px 18px;font-size:14.5px}
|
||||
li{margin:6px 0}
|
||||
li::marker{color:var(--signal)}
|
||||
.cols{display:grid;grid-template-columns:repeat(auto-fit,minmax(230px,1fr));gap:14px;margin:18px 0}
|
||||
footer{margin-top:60px;border-top:1px solid var(--line);padding-top:18px;color:var(--dim);font-size:12.5px}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="wrap">
|
||||
|
||||
<header>
|
||||
<div class="kicker">Потребительский кооператив «Друзья Коллективного Разума» · Минск</div>
|
||||
<h1>42 Labs<br>Условия участия</h1>
|
||||
<div class="sub">Бизнес-студия для запуска собственных продуктов с ИИ-агентами. Программа в рамках договора участия в «42 Labs». Страница — человекочитаемая выжимка условий договора.</div>
|
||||
<div class="badges">
|
||||
<span class="badge s">Старт любой день</span>
|
||||
<span class="badge">Проект ваш на 100%</span>
|
||||
<span class="badge">Выход — в любой момент</span>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<section>
|
||||
<div class="snum">01 / ЧТО ВЫ ПОЛУЧАЕТЕ</div>
|
||||
<h2>Состав услуг</h2>
|
||||
<p class="lead">Услуги — это инфраструктура и сопровождение, а не разработка на заказ.</p>
|
||||
<div class="cardgrid">
|
||||
<div class="card"><div class="cn">A</div><h4>Методология запуска</h4><p>Структурированный процесс: working sessions, планёрки, разборы прогресса — до первых продаж.</p></div>
|
||||
<div class="card"><div class="cn">B</div><h4>ИИ-агенты</h4><p>Инфраструктура ИИ-агентов для операционных задач проекта: выделенный агент, изоляция контекста.</p></div>
|
||||
<div class="card"><div class="cn">C</div><h4>Портал cil.by</h4><p>Учёт проекта, протоколы, внутренние инструменты. Поддомен <span class="mono"><проект>.cil.by</span> и техподдержка запуска.</p></div>
|
||||
<div class="card"><div class="cn">D</div><h4>Go-to-market</h4><p>Поддержка вывода на рынок до первых продаж и доступ к платёжной инфраструктуре кооператива и партнёров.</p></div>
|
||||
</div>
|
||||
<div class="note"><b>Важно ·</b> Проект строит Участник, кооператив не строит его за вас. Это не гарантия запуска, выручки или инвестиций — результат зависит прежде всего от ваших действий.</div>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<div class="snum">02 / СТОИМОСТЬ</div>
|
||||
<h2>Принцип «большее из двух»</h2>
|
||||
<p class="lead">За каждый месяц вы платите большее из двух значений — они никогда не суммируются.</p>
|
||||
<div class="price">
|
||||
<div class="row"><span><b>Месячный взнос</b> за участие в программе в целом</span><span class="v">≈ $999 / мес</span></div>
|
||||
<div class="row"><span><b>…или Доля дохода</b> кооператива от валовой выручки проекта (ставка фиксируется в договоре)</span><span class="v hi">% от выручки</span></div>
|
||||
<div class="row" style="color:var(--dim)"><span>Выручка выросла — платите % от неё. Выручки нет — платите взнос. Меньшее значение всегда доплата до большего, не вторая сумма</span><span class="v">1 из 2</span></div>
|
||||
</div>
|
||||
<p><b>Первый платёж</b> — при подписании. Дальше — ежемесячно <b>до 5-го числа</b> с перерасчётом до Доли дохода за истекший месяц.</p>
|
||||
<p><b>Оплата:</b> картой на сайте (эквайринг Альфа-Банк), через ЕРИП («Расчёт») или банковским переводом. Все суммы — в BYN по курсу НБ РБ на дату оплаты. Места в когорте ограничены.</p>
|
||||
<div class="note"><b>Валовая выручка ·</b> все фактические поступления от заказчиков до вычетов, кроме возвратов и чарджбэков. Продажи через платформу кооператива — удержание автоматически (с вашего согласия). Выручка мимо платформы — ваш ежемесячный отчёт до 10-го числа.</div>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<div class="snum">03 / ДОПОЛНИТЕЛЬНЫЕ МЕХАНИКИ</div>
|
||||
<h2>Что ещё есть в договоре</h2>
|
||||
<div class="cardgrid">
|
||||
<div class="card"><div class="cn">3A</div><h4>Взнос с прироста ЗП</h4><p><b>5–10%</b> от прироста вашей зарплаты над базовым уровнем (фиксируется при подписании) — пока вы в программе и <b>12 месяцев после</b>. Только если ЗП выросла; справка — раз в квартал.</p></div>
|
||||
<div class="card"><div class="cn">3B</div><h4>Placement-трудоустройство</h4><p>Программа готовит AI-инженеров по harness management и рекомендует вас партнёрам-работодателям. Рекрутинговый сбор <b>25% годовой ЗП платит работодатель</b> — вы не платите ничего. Отказ от рекомендации без санкций.</p></div>
|
||||
<div class="card"><div class="cn">04</div><h4>Трек «в долг»</h4><p>По решению правления возможна отсрочка взносов: для членов кооператива — беспроцентный целевой заём; для продаж на внешних рынках — отдельное соглашение с индексацией отложенного баланса к курсу биткоина.</p></div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<div class="snum">04 / ВАШИ ПРАВА</div>
|
||||
<h2>Права на результаты</h2>
|
||||
<div class="vs">
|
||||
<div class="col">
|
||||
<h4>Остаётся у вас</h4>
|
||||
<ul>
|
||||
<li><b>100% прав на проект:</b> продукт, код, контент, бренд, клиентские отношения.</li>
|
||||
<li>Кооператив не получает долю в капитале и прав на вашу интеллектуальную собственность.</li>
|
||||
<li>Фоновые материалы кооператива (методология, шаблоны агентов) — безвозмездная лицензия на срок проекта.</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="col no">
|
||||
<h4>Чего в договоре нет</h4>
|
||||
<ul>
|
||||
<li>Доли кооператива в капитале вашего проекта.</li>
|
||||
<li>Прав кооператива на ваши результаты и ИС, кроме необходимых для оказания услуг.</li>
|
||||
<li>Участие в программе — это <b>ещё не членство</b> в кооперативе; приём в члены оформляется отдельно по Уставу.</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<div class="snum">05 / ОТВЕТСТВЕННОСТЬ И РАСТОРЖЕНИЕ</div>
|
||||
<h2>Правила игры</h2>
|
||||
<div class="cols">
|
||||
<div class="card"><div class="cn">ОТЧЁТНОСТЬ</div><h4>Честность по выручке</h4><p>Нарушение сроков отчётности или сокрытие выручки — неустойка <b>0,1%/день</b> от причитающейся доли, но не более 10% от суммы требования.</p></div>
|
||||
<div class="card"><div class="cn">ВЫХОД</div><h4>Отказ в любой момент</h4><p>Участник вправе выйти с эффектом на конец текущего календарного месяца — дальнейшие платежи не начисляются. Права на проект остаются у вас.</p></div>
|
||||
<div class="card"><div class="cn">ДОЛГ</div><h4>Неоплата ≠ расторжение</h4><p>Неоплаченные суммы — ваша задолженность (в BYN), участие продолжается. Кооператив расторгает договор только за существенное нарушение.</p></div>
|
||||
<div class="card"><div class="cn">ЛИМИТ</div><h4>Ответственность кооператива</h4><p>Ограничена суммой месячных взносов за 3 предшествующих месяца (кроме умысла / грубой неосторожности). Споры — переговоры, затем суд по месту кооператива, право Республики Беларусь.</p></div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<div class="snum">06 / ДАЛЬШЕ</div>
|
||||
<h2>Как присоединиться</h2>
|
||||
<ul>
|
||||
<li>Обсуждаем ваш проект и параметры (ставка % от выручки, базовая ЗП, маршрут продаж, трек оплаты) — заполняем Приложение 1 к договору.</li>
|
||||
<li>Подписываем договор участия «42 Labs» — договор готовится по шаблону кооператива, условия индивидуальны по проекту.</li>
|
||||
<li>Подключаем агента, портал и поддомен — стартуете в текущей когорте.</li>
|
||||
</ul>
|
||||
<p class="sub" style="margin-top:16px">Вопросы и заявки: <b>alex.shkor@gmail.com</b> · <b>+375 25 900 50 03</b></p>
|
||||
</section>
|
||||
|
||||
<footer>
|
||||
ПК «Друзья Коллективного Разума», УНП 194018234 · 220078, г. Минск, ул. Маршала Лосика, д. 53, оф. 385 · https://cil.by<br>
|
||||
Страница — популярное изложение условий типового договора участия. Не является юридической консультацией; юридическую силу имеют только подписанные сторонами экземпляры договора. Шаблон договора показан бухгалтеру/юристу ПК перед первым применением.
|
||||
</footer>
|
||||
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
Loading…
Reference in a new issue