← Артыкулы Harupa
2026-08-23RU EN UA BY PL

CRM на Markdown, частка 2: 27 гадзін, 23 каміты і каталог правалаў

У першай частцы я паказаў, як паставіць CRM на markdown-файлах за вечар. Тут — як яна будавалася насамрэч: з лічбамі, храналогіяй і, галоўнае, праваламі. Правалы — не дадатак да гісторыі, а яе шкілет: амаль кожная частка сістэмы з'явілася як адказ на канкрэтную аварыю, і без гэтых аварый уладкаванне незразумелае.

Кантэкст: я рабіў аўтрыч для свайго відэагенератара — шукаў першых карыстальнікаў і размовы з імі. Дапамагаў Claude Code. Усё, што ніжэй, здарылася за 27 каляндарных гадзін 22–23 жніўня 2026 года: 23 каміты, 16 картак кантактаў, 12 дакументаў, 307 радкоў кода. І кожны факт тут пацвярджаецца файлам, камітам або даслоўнай цытатай — правіла «нічога не дадумваць» распаўсюджваецца і на артыкулы пра сістэму.

Навошта — і чаму пры трох кантактах

Сістэму я завёў, калі кантактаў было тры. Не трыццаць — тры. Фармулёўка з каміта, якім усё пачалося: «цяпер тры жывыя кантакты ў трох розных месцах (перапіска ў тэлезе, профіль у LinkedIn, галасавое), і ніводнага месца, дзе відаць, чый ход і што абяцана».

Агаворка адразу: гэта мой адзіны выпадак, а не заканамернасць. Але ў яго ёсць логіка. Хаос не надыходзіць пры сотні кантактаў — ён надыходзіць пры чацвёртым, проста заўважыце вы яго пазней, калі аднаўляць перапіску будзе ўжо няма чым.

Другая прычына глыбейшая. У мяне залічваюцца два зыходы: кліент або інсайт. Размова, з якой я даведаўся, што болю няма, — не правал, а вынік. Таму ў картцы ёсць раздзел «чаго мы не чакалі» і няма поля «сума здзелкі». Мэта вызначае схему даных, а не наадварот — у CRM для продажаў і даследчай CRM розныя палі пры аднолькавым шкілеце.

І трэцяе, пра ролі. Машына збірае, рыхтуе тэксты і памятае ўсё. Чалавек вырашае і адпраўляе. Гэтая мяжа праведзена жорстка і, як высветліцца ніжэй, нездарма.

Уладкаванне: дошка не вялася рукамі ніводнага дня

Картка, дошка і скрыпт нарадзіліся адным камітам. Гэта важней, чым здаецца: рашэнне «крыніца праўды — frontmatter карткі, табліца — вытворная» было прынята да таго, як з'явіўся першы радок табліцы. Дошку не давялося «пераводзіць на генерацыю» — яна не вялася рукамі наогул ніколі.

Тры рашэнні ва ўладкаванні, якія я лічу пераноснымі куды заўгодна.

Два парогі пратэрміноўкі, а не адзін. Свой ход гарыць праз два дні, чужы — праз пяць. Абгрунтаванне этычнае, а не тэхнічнае: свой доўг гарыць хутчэй за чужы — чалавек не абавязаны нам адказваць, а мы абавязаны. Адна калонка «дзён з апошняга дотыку» зліла б гэтыя дзве метрыкі і схавала б уласную непрацу за чужым маўчаннем.

Тры станы гіпотэзы, а не два. Скрыпт друкуе «НЕ ПЫТАЛІСЯ» словам, а не нулём. «Не пацвердзілася» і «не пыталіся» — розныя дыягназы. Праверылася на жывых даных амаль адразу: адна гіпотэза дала 0 пацверджанняў з 3 — і гэта аказаўся промах таргетынгу, у выбарцы проста не было ніводнага чалавека патрэбнага тыпу. Нуль, надрукаваны як нуль, прачытаўся б як абвяржэнне.

Дзве пароды гіпотэз — два розныя палі. Гіпотэза пра прадукт («у іх цана непрадказальная») агрэгуецца па ўсіх картках. Гіпотэза пра чалавека («думаю, вырашае не ён») не агрэгуецца ніколі і жыве ўнутры карткі. Розныя палі робяць падмену аднаго другім фізічна немагчымай. Чаму гэта самы каштоўны прыём усёй канструкцыі — крыху ніжэй, у правалах інтэрпрэтацыі: дысцыпліна тут не спрацавала нават у таго, хто правіла напісаў.

Мяжа «што генеруецца, а што пішацца рукамі» праходзіць па сэнсе: дату прагону піша скрыпт, рашэнне прагону — чалавек, радком аргумента. Механічнае — машыне, сэнсавае — чалавеку.

Правалы. Парода першая: даныя

Сістэма запомніла няпраўду або згубіла праўду.

Чужая фраза стала голасам уладальніка — у трох файлах. Рэпліка суразмоўніцы трапіла ў профіль майго голасу як мая. Умова, якая гэта дазволіла: даслоўнага лога перапіскі не існавала, картка была сабрана пераказам. Пераказ губляе аўтара — рэплікі без яўнага «хто сказаў» зліпаюцца ў адзін голас, і зліпанне ўсплывае праз тыдні, калі крыніцу ўжо не аднавіць. Закрыта правілам «даслоўна, а не пераказам» і ⚠-урэзкай у сапсаваных файлах — не выдаленнем: моўчкі сцерці памылку значыць сцерці і ўрок.

Агент прыдумаў офер — і запісаў яго як мой. У полі «што мы прапануем людзям» з'явіліся «замеры па відэа-мадэлях» — тое, чаго я ніколі нікому не прапаноўваў. Агент гэта выдумаў. Закрыта табліцай «што я магу даць — маімі словамі» з калонкай «каму казаў»: прапанова без крыніцы — гэта вітрына жаданага, а не факт.

Кантакт без адраса згублены назаўсёды. Спасылку на профіль не знялі ў той жа заход, а стужка, якая чалавека паказала, не ўзнаўляецца: той жа запыт праз дзесяць хвілін вярнуў іншых людзей. Дзве кропкавыя спробы знайсці — міма. «Дапішу потым» у сістэме, якая напаўняецца з недэтэрмінаванай стужкі, азначае «згублю».

Парода другая: працэс

Правіла было — і не спрацавала.

Гатовы тэкст паехаў пад пост чужога чалавека. Самы дарагі промах: каментарый, падрыхтаваны для самага каштоўнага ўваходу ў варонцы, быў апублікаваны пад постам іншага чалавека — прычым пазначанага «НЕ пісаць». Механізм сумленны, і ён не пра няўважлівасць: у картцы ляжала спасылка на профіль, а каментарый пішацца пад пост. Гэта розныя адрасы, і розніца бачная толькі ў момант адпраўкі. Адсюль вартаўнік: калі наступны крок — адпраўка, а дакладнага адраса няма, прагон падае, а на дошцы гарыць «АДРАСА НЯМА».

Першы варыянт гэтага вартаўніка хлусіў. Ён лавіў па корані «адказ» і спрацоўваў на картцы «чакаем адказу на два пытанні» — а гэта чаканне, адрас там не патрэбны. Выснова, якая паехала проста ў каментарый кода: ілжывае спрацоўванне небяспечнейшае за пропуск — папярэджанне, якое хлусіць, вучацца ігнараваць.

Мае папраўкі не запісваліся нікуды. Рашэнні па прадукце пісаліся ў адзін файл, профіль голасу — у другі, факты — у карткі. А папраўкі «як са мной размаўляць» не пісаліся нікуды і заставаліся ў чаце — і адны і тыя ж памылкі паўтараліся. Выявілася прамым пытаннем: «як ты фіксуеш мае фідбэкі, ты іх улічваеш?» Адказ быў «ніяк», і ў тую ж гадзіну з'явіўся журнал паправак. Калі ў катэгорыі ведаў няма файла, веды жывуць у перапісцы і паміраюць са зменай сесіі — або супрацоўніка.

Стан працэсу не жыў нідзе. Стан кожнага кантакту захоўваўся, а стан самога цыкла — не. Пытанне «заўтра адкрыю новую сесію — ці зразумее яна, што тыдзень яшчэ не прайшоў?» мела адказ «ніяк». Так з'явіўся журнал прагонаў: у працэсу стан такі ж, як у запісу, і ён патрабуе ўласнай табліцы.

Правіла адмяніла тэкст, а тэкст застаўся. Нарыхтоўка паведамлення, забракаваная новымі правіламі, тры дні праляжала ў картцы як рабочая, і поле «наступны крок» працягвала казаць «адправіць». Знайшлося толькі суцэльнай інвентарызацыяй. Правіла, якое адмяняе артэфакт, абавязана адмяняць і сам артэфакт — інакш забарона і аб'ект забароны мірна жывуць у адным файле.

Парода трэцяя: інтэрпрэтацыя

З правільных даных — няправільная выснова. Самая дарагая парода.

Маўчанне карыстальніка растлумачана прадуктам. Чалавек пераязджаў. Па следзе ў продзе — заплаціў, трымае баланс, шэсць спісанняў за дзве хвіліны, потым цішыня — я вывеў: матывацыя ёсць, грошы ёсць, доступ ёсць, значыць, спыняе прадукт. Выснова была названая самым чыстым выпадкам у выбарцы. Тлумачэнне аказалася бытавым: пераезд. Адменена праз дзве хвіліны пасля рэплікі ўладальніка ведаў — гэта значыць мяне самога, які даведаўся пра пераезд з жыцця, а не з даных.

Механізм тут варта раскрыць да канца. У маім жа файле з інсайтамі прама напісана: паводзіны з проду тлумачаць «што», а не «чаму». Я парушыў уласнае правіла ў той жа дзень, калі яго запісаў. Паводзінавы след без кантэксту чалавека хлусіць упэўнена і пераканаўча — і менавіта таму падзел «гіпотэза пра чалавека» і «гіпотэза пра прадукт» зроблены структурным, рознымі палямі, а не дысцыплінарным. Дысцыпліна не ўтрымала нават аўтара правіла.

Выснова перапісаная моўчкі — двойчы за дзень. Моўчкі папраўленая выснова праз месяц выглядае так, быццам яе ніколі і не пераглядалі, і цана памылкі губляецца разам з урокам. Цяпер сутыкненне фіксуецца як запіс: што сцвярджалася, што прыйшло насуперак, што менавіта спрэчку вырашыла.

Апытальнік збіраў пацверджанне нас саміх. Першая версія анкеты — шкалы ад 1 да 5 па нашым жа спісе боляў. Чалавек выбера з нашага спіса, мы атрымаем пацверджанне сябе і назавём гэта даследаваннем. Злоўлена да рассылкі — а рассылаць збіраліся па чужой сетцы, гэта значыць цаной памылкі была чужая рэпутацыя. Спіс варыянтаў адказу — гэта вашы гіпотэзы; агрэгат па іх вымярае вас, а не рынак.

Боль 9 з 9 ледзь не стаў оферам. Дзевяць з дзевяці пацвердзілі праблему — а трое з дзевяці ўжо вырашылі яе бясплатна лакальным інструментам і рапартавалі пра поспех, а не пра боль. Лічыльнік пацверджанняў без разметкі «у каго ўжо вырашана» прадае чужы поспех як ваш попыт.

Чатыры адмены ўласных рашэнняў

Гэтага ў артыкулах пра «як я пабудаваў X» звычайна няма, а для чытача яно каштоўнейшае за ўдачы.

Што адмяніліПраз колькіЧым абвергнута
Выснову «яго спыняе прадукт»2 хвіліныфакт з жыцця чалавека: пераезд
«У спрэчках прыярытэт за ўладальнікам»45 хвілінсам уладальнік: «мая мэта — эфектыўнасць, а не спроба мне дагадзіць»
Адмову ад асобнага скіла на пошук7 гадзінкрытэрый быў няправільны: скілы дзеляцца не па частаце, а па пытанні, якое задае чалавек
Праўку пошукавага радкаадзін прагонвымярэнне: было 1 з 3, стала 0 з 3

Апошні радок — асобны ўрок. Чыніў я не той дэфект, і праўка зрабіла горш. Высветлілася гэта толькі таму, што промах быў запісаны: без запісу я чыніў бы тое ж самае яшчэ раз. Запіс адмоўнага выніку — і ёсць механізм паляпшэння; праўка без вымеранага «да» неадрозная ад рытуалу.

Сюды ж арыфметыка, якая забараняе A/B на маіх аб'ёмах: формула n = 16σ²/δ² пры базе водгуку 20% і жаданым прыросце ў 10 працэнтных пунктаў патрабуе 256 кантактаў на варыянт. На сарака — шасцідзесяці ловіцца толькі двухразовы эфект. Важная агаворка: уся гэтая колькасная база — з чужых каналаў, B2B-пошты і амерыканскіх халодных званкоў; я пераношу механізмы, не лічбы. Замест A/B — раўнды па пяць размоў на адной фармулёўцы з парогам рашэння, абвешчаным загадзя.

Правіла без вартаўніка не выжывае

Галоўная выснова ўсёй гісторыі, і яна заробленая, а не прыдуманая.

Кожны раз, калі правіла было запісана прозай, яго парушалі. Уключаючы выпадкі, калі парушаў той самы чалавек, які яго напісаў, — у тым жа файле, двума абзацамі ніжэй. Выжылі толькі правілы, пад якія напісаны скрыпт, што раняе прагон. Пяць з васьмі вартаўнікоў — прамы адказ на аварыю, якая ўжо здарылася; ніводзін не напісаны «на будучыню, раптам спатрэбіцца».

Вартаўнік пры гэтым правяраецца мутацыяй: ламаеш картку знарок — прагон абавязаны пачырванець роўна на ёй; вяртаеш — пазелянець. Зялёны тэст, які нельга зрабіць чырвоным, — дэкарацыя. Сумленная лічба з арыгінала: мутацыяй я праверыў тры вартаўнікі з васьмі, астатнія жылі на слова. У апублікаванай версіі md-crm гэты доўг закрыты — усе вартаўнікі накрытыя 24 аўтатэстамі, і сам набор тэстаў правераны мутацыяй: адключаеш вартаўніка — чырванеюць роўна яго тэсты.

І фінальны штрых, які пацвердзіў правіла на самім інструменце. Адзіны баг, які моўчкі псаваў даныя, жыў у адзіным месцы скрыпта, не накрытым тэстам: магічны зрух «+24» пры рэальнай даўжыні раздзяляльніка 22 сімвалы. Першы прагон ішоў па іншай галіне кода і выглядаў спраўным, а кожны наступны ўразаўся на два сімвалы ўглыб папярэдняга радка журнала. Восем ітэрацый скрыпт абрастаў праверкамі картак — і ніводнай праверкі самога сябе.

Што з гэтага налады, а што шкілет

Шкілет: адзін файл на чалавека, стан у frontmatter, дошка вытворная, вартаўнікі раняюць прагон, журнал даслоўны, стан цыкла асобна ад стану кантактаў. Гэта пераносіцца куды заўгодна — уключаючы найм: ATS адрозніваецца ад CRM слоўнікам стадый, не архітэктурай.

Налады: парогі 2 і 5 дзён, кантрольныя пункты 5/12/25 размоў, коды гіпотэз. Мае значэнні — арыенціры з пазначанымі крыніцамі, не канстанты; кожны падбярэ свае.

Паставіць усё гэта сабе — дзве каманды, інструкцыя ў першай частцы. Каталог правалаў у абязлічаным выглядзе едзе разам са скілам — файлам references/failures.md: мне здаецца правільным, каб інструмент вазіў з сабой гісторыю ўласных аварый.