karass.dev●status: building itself·phase 1 · foundation·watch it build →

  ##  ##    ####    #####     ####    ######  ######
  ##  ##   ##  ##   ##  ##   ##  ##  ##      ##
  ## ##    ##  ##   ##  ##   ##  ##  ##      ##
  ####     ######   #####    ######   ####    ####
  ## ##    ##  ##   ## ##    ##  ##      ##      ##
  ##  ##   ##  ##   ##  ##   ##  ##      ##      ##
  ##  ##   ##  ##   ##  ##   ##  ##  ######  ######

karass is building itself

a self-driving product: it senses its own defects, picks the next block from the queue, builds it, and a verifier — never the builder — decides whether the block stands. this page is the construction site. what you see below is the actual work queue of the organism assembling itself, block by block.

customer #0 is karass. customer #2 is checkmyapp.dev — a sibling organism that gives karass its sense of touch. if it can build itself, it can build for you.

## the crane — what's building now

a tower crane over the structure it's assembling, live from Linear and GitHub. it carries the block it claimed, hangs it above the tower while checks run, and lowers it into place once a verifier — never the crane — says it stands.

[building] KARASS-358 — Generate and commit migrations/037_backfill_dismissed_ledger.sql (finding_dismissed backfill, pinned sha) · the crane claimed this block and is building it

→ raw queue cards
[claimed]Generate and commit migrations/037_backfill_dismissed_ledger.sql (finding_dismissed backfill, pinned sha)KARASS-358
● queued→◉ claimed→○ pr open→○ ci running→○ merged→○ verified

the crane claimed this block and is building it

next in line
[ ][root-cause] crane/merge-gate.mjs:868KARASS-370
[ ][mutation] File voice/rollback tickets into the Karass backlog project so the foreman can see themKARASS-369
[ ]Build workspaces cannot read the repo's history: --depth 50 + scrubbed credential blocks any block that needs git historyKARASS-331
[ ]Derive a weak policy at `ticket_selection` from repeated negative outcomes — and let a clean window clear itKARASS-319

## roadmap

live from Linear
epic KARASS-91 · EPIC A — Foundation: GitHub remote, CI, deploy pipeline
[x]Push karass-landing to GitHub, install karass-dev App, protect mainKARASS-97
[x]CI on PR: typecheck + lint + build (GitHub Actions)KARASS-98
[x]Auto-deploy: merge to main → Cloud Build → Cloud RunKARASS-99
[ ]Agent merge policy: who merges what, when, and how it's enforcedKARASS-100
epic KARASS-92 · EPIC B — Mycelium: unified event log, mandatory logging, read API
[x]Event log schema v1 (migration 016): append-only, refs, meta-levelsKARASS-102
[~]Writers: Claude Code hooks, CI/deploy, Linear webhook, TG — log-first everywhereKARASS-103
[~]Event-log read interface: MCP server (get_events, search, context, agent_state)KARASS-104
[~]Organism self-health: liveness timestamps per subsystem + /api/health/organismKARASS-105
epic KARASS-93 · EPIC C — Build loop: dispatcher that builds Karass itself
[x]Builder VM in karass-platform: isolated, Claude Code + hooks, provisioned via resource ledgerKARASS-106
[x]Dispatcher constitution for Karass: pickup contract, workspace lifecycle, serializationKARASS-107
[x]First autonomous cycle: one real KARASS ticket end-to-end to prod — the "1" milestoneKARASS-108
[ ]Decision→Outcome→Policy wiring: every dispatcher choice is a named decision pointKARASS-109
[ ]Safety rails: budget caps, concurrency 1, stall watchdog, owner abort switchKARASS-110
[~]Foreman: the crane manages its own queue (stop bootstrap labeling waves)KARASS-126
[ ]Robust epic-exclusion in claim: don't treat parentless tickets as epicsKARASS-129
[ ]The crane ships like yeet — review, fix, merge, watchKARASS-130
[~]Yeet delivery 1/3 — safe PR-walk + fail-closed owner-gateKARASS-136
[~]Yeet delivery 2/3 — merge gate (both reviewers, P1-aware, retry Done)KARASS-137
[~]Yeet delivery 3/3 — fix-session sub-flow (validate exit, cap rounds)KARASS-138
epic KARASS-94 · EPIC D — Signals & verification: Karass senses itself
[ ]Monitor watches Karass itself: own Sentry project + self-tenantKARASS-111
[~]Post-deploy verify + auto-revert live for Karass deploysKARASS-113
[~]Owner channel: TG digest (log-first) + inbound owner messages → events/ticketsKARASS-114
[~]Known-good anchor: eye-verified versions + catastrophic rollback organKARASS-125
[~]Fix verify: drop the fragile GitHub CI-lookup — a serving revision already passed CIKARASS-127
[~]Fix verify: Monitor-quiet = no regression, not zero errorsKARASS-131
[~]Notion self-healing: health limb + dead-token escalation + degraded fallbackKARASS-132
epic KARASS-95 · EPIC E — Construction site UI on karass.dev
[~]Live organism feed: event-log stream page on karass.devKARASS-115
[~]Work queue + attempt timeline: what the organism is building nowKARASS-116
[~]Trust & budget controls: pause/abort, caps, gated-approvals queueKARASS-117
[~]Construction site becomes the default view for tenant "karass"KARASS-118
[~]ASCII construction animation: the crane, alive on the front pageKARASS-124
[~]Roadmap live from Linear — stop hand-maintaining the front-page snapshotKARASS-128
epic KARASS-96 · EPIC F — Infra roadmap & economics (0→1 now, 1+ sketch)
[ ]Infra doc 0→1: LLM tiering under real constraints, enforced in configKARASS-119
[ ]Legacy infra decision: repurpose or sleep the idle $45–65/mo (needs owner OK)KARASS-120
[ ]1+ infra research: Managed Agents, hosted MCP servers, multi-tenant isolationKARASS-121
[ ]Housekeeping: triage stale KARASS-78..90 against the revival roadmapKARASS-123
epic KARASS-101 · Preview deploy per PR + post-deploy screenshot for visual verify
[x]Deploy tagged Cloud Run revision (no traffic) per PRKARASS-232
[ ]Post/update PR comment with preview URL and screenshotsKARASS-234
epic KARASS-133 · EPIC G — Self-build family (крон-компоненты)
[x]Meta-observer (пастух): отдельный крон, смотрит на всю петлюKARASS-134
[~]Planner/decomposer: цель → правильные тикетыKARASS-135
epic KARASS-139 · Организм — кроны: наблюдаемость, здоровье, самонаправление
[x]Дашборд организма: остались здоровье, фронтир способностей и распределение раундовKARASS-140
[x]Каждый крон бьёт лимбKARASS-141
[~]Переделать TG-дайджестKARASS-142
[~]Провижнер: systemd-таймеры + дрейфKARASS-143
[~][KEYSTONE] Gap-engine / decider кронKARASS-144
[~]Notion-документация Karass — top notchKARASS-145
[~]Сироты видимы организму: эпик = «есть дети», а не «нет родителя»KARASS-151
[~]Verify: лог-чек якоря меряет регрессию, а не наличие ERROR-строкKARASS-152
[~]Fix-session обслуживает и owner-gate PR: починка ревью ≠ мёржKARASS-153
[~]CodeRabbit — единственный ревьюер контура; Codex выведенKARASS-154
[x]Fix-session синкает ветку с main: конфликт = первый шаг починкиKARASS-155
[~]Fix-cap меряет сходимость находок, а не число раундовKARASS-156
[~]Karass выбирает себе ревьюера сам: ресерч, решение, сообщение владельцуKARASS-161
[~]Ревью по готовности: гейт живёт в окне ревьюера, а не считает молчание отказомKARASS-175
[~]Приёмка: блок доказывает, что сделал то, что просил тикетKARASS-180
[x]Ошибочно поданный гейт отзывается механизмом, а не человеком с доступом к базеKARASS-181
[x]Karass открывается внешнему прохожему: CheckMyApp ходит по karass.dev как пользовательKARASS-182
[~]Кран не берёт блок, чьё внешнее условие не выполненоKARASS-188
[~]Karass сам решает, как развязать собственную пропускную способностьKARASS-190
[~]Пароль песочной учётки выдаётся через Secret Manager, а не строкой в логахKARASS-191
[ ]Страница готовности написана для машины, а не для человекаKARASS-199
[~]Молчащий ревьюер должен кричать: конвейер, который строит, но не мёржитKARASS-200
[~]Karass выводит собственную стейт-машину из своего журналаKARASS-201
[~]Найти оставшиеся тупики и превратить их в поводыKARASS-203
epic KARASS-159 · Хронист: страница дня на karass.dev + суточный крон
[~]Chronicler: day_page table + /api/internal/chronicler/day routeKARASS-169
[~]Chronicler MCP: day_events + publish_day toolsKARASS-170
[x]crane/chronicler.mjs runnerKARASS-171
[~]/app/den page — server-rendered day viewKARASS-172
[~]Chronicler systemd timer + organism_liveness limbKARASS-173
[~]Ежедневное сообщение владельцу: четыре вещи, которые он хочет знатьKARASS-174
epic KARASS-160 · Готовность: три вопроса владельца, ответ каждый день + страница и баннер
[~]Readiness storage: date-keyed verdict + prose + frontier snapshotKARASS-163
[~]Readiness MCP server: capability_report, organism_health, recent_outcomes, publish_readinessKARASS-164
[~]Daily readiness runner (claude -p session)KARASS-165
[~]Schedule the readiness runner + liveness limbKARASS-166
[~]Readiness page (Russian, day-page visual language)KARASS-167
epic KARASS-162 · Инструментальщик: Karass ревизует свои инструменты и строит себе новые
[~]tool_friction: evidence query for tool friction over the myceliumKARASS-176
[~]propose_tool_ticket: file tool-change tickets with a server-side hands-safety gateKARASS-177
[~]Toolsmith runner: weekly systemd timer wiring tool_friction into propose_tool_ticketKARASS-178
epic KARASS-168 · Readiness banner on the day page (KARASS-159)
[~]Fetch latest verdict word and remaining-item count for day page bannerKARASS-197
[x]Render readiness banner on day page with link to readiness pageKARASS-198
epic KARASS-183 · Три дыры, найденные вмешательствами пастуха 26–29.08
[~]Атомарный сброс тикета при возврате в очередьKARASS-184
[x]Провижнер systemd-юнитов доезжает до VM и запускается после самообновления кранаKARASS-185
[x]Вооружение manual-таймеров через проверку креденшла после самообновленияKARASS-186
[x]Порог тревоги живости выводится из каденции опроса, а не назначается числомKARASS-187
epic KARASS-189 · Раунды правок: с 4.3 на PR до двух — самый крупный резерв скорости и цены
[x]Разбор причин раундов правок: числовая раскладка 4.3 раунда/PRKARASS-192
[~]Мицелий помнит находки каждого раунда, а не только закапченныхKARASS-196
epic KARASS-193 · Перед капом: организм проверяет, лежит ли причина вне диффа
[~]Add pre-cap expanded-scope diagnostic round producing a verdictKARASS-228
[~]Surface the explicit question when capping on needs_decisionKARASS-230
[ ]Add regression fixtures for the three historical stall casesKARASS-231
epic KARASS-202 · Решение помнит свой исход: 115 решений за месяц, ни одного с последствием
[x]Связать decision_point «выбор блока decider'ом» с исходом постройки (построен/сошёлся)KARASS-220
[x]Связать decision_point «выбор ревьюера» с исходом (число ревью, упор в лимит)KARASS-221
[x]Связать decision_point «решение о параллельности» с исходом изменения каденцииKARASS-222
[~]Связать decision_point «выбор блока для постройки» с событием `acceptance_checked` как его исходомKARASS-223
[ ]Запрос: к чему приводит класс решений (по связанным исходам)KARASS-224
epic KARASS-216 · [EPIC] Gap-движок должен диффить vision, а не собственную карту способностей
[x][EPIC] V6 нарушен: петля трижды за день заблокировалась на владельце внутри себяKARASS-217
[x][EPIC] V4 не реализован: ограничители — константы, не функция доказанного восстановленияKARASS-218
epic KARASS-219 · Связать decision_point «допуск тикета в очередь» с исходом (мёрж/провал/кап)
[ ]Событие-исход «мёрж» должно ссылаться через refs на decision_point допускаKARASS-253
[ ]Событие-исход «провал» должно ссылаться через refs на decision_point допускаKARASS-254
[ ]Событие-исход «кап» должно ссылаться через refs на decision_point допускаKARASS-255
epic KARASS-229 · Route outside_diff verdicts to a linked root-cause ticket instead of a cap
[~]Create root-cause ticket generator from outside_diff verdictsKARASS-239
epic KARASS-233 · Headless screenshot of changed pages against preview URL
[ ]Wire screenshot capture into CI pipeline as an artifact-producing stepKARASS-251
epic KARASS-240 · Route outside_diff verdicts to the new root-cause ticket instead of capping the PR
[x]Make an outside_diff diagnostic verdict carry structured file / line / descriptionKARASS-275
[x]Internal route: file a root-cause ticket and link it as a dependency of the originating ticketKARASS-276
[x]Route an outside_diff verdict to its root-cause ticket instead of capping the PRKARASS-277
epic KARASS-247 · .crane bookkeeping in the PR diff is the reviewer's most repeated P1 — it burned three blocks
[x]Carry the acceptance manifest without it appearing in the reviewed feature diffKARASS-260
epic KARASS-249 · Map PR diff to changed UI pages/routes
[x]Emit changed page routes from a PR file diff (App Router path convention)KARASS-273
[~]Attribute changed shared component files to the pages that import themKARASS-274
epic KARASS-250 · Headless browser screenshot capture utility
[ ]Script/CLI entry point for screenshot captureKARASS-262
epic KARASS-252 · Прокинуть id decision_point-события допуска до порождённого блока
[~]Expose the queue_admission decision id on the claimed ticketKARASS-271
[x]Carry the admission decision id onto the spawned block so merge/fail/cap can read itKARASS-272
epic KARASS-256 · [gap:v7_self_hosted_from_terraform] V7 — self-hosted: the builder the organism runs on is provisioned from Terraform, not by hand
[ ]Emit builder_provisioned event on successful Terraform applyKARASS-264
[ ]Bring the live builder under Terraform management and retire the hand-provisioned setupKARASS-265
epic KARASS-259 · Stop git-tracking .crane/DISMISSED.md; move dismissal ledger to the mycelium
[x]Record each fix round's dismissals as mycelium events (write path only)KARASS-268
[ ]Stop git-tracking .crane/DISMISSED.md so it never appears in a block's diffKARASS-270
epic KARASS-261 · Core screenshot capture function (Playwright)
[~]Add Playwright as a dependency without breaking the production image buildKARASS-282
[x]Screenshot capture module: base URL + route paths + output dir → one deterministic file per routeKARASS-283
epic KARASS-263 · Author Terraform module for builder droplet infrastructure
[~]Gate infra/builder on `terraform fmt -check` + `terraform validate` in CIKARASS-280
[x]Declare the builder's network surface explicitly in infra/builderKARASS-281
epic KARASS-269 · Backfill the 265 existing DISMISSED.md entries into the mycelium as finding_dismissed events
[x]Backfill generator: resolve every .crane/DISMISSED.md entry to the commit that introduced itKARASS-322
epic KARASS-292 · [gap:learn] outcomes bias future choices (decision → outcome → policy)
[~]Score the claim: one typed `decision_outcome` per `ticket_selection` decision, linked by refsKARASS-317
[~]Score the foreman's `queue_admission` the same way, chained off the claim's own outcomeKARASS-318
[ ]Derive a weak policy at `ticket_selection` from repeated negative outcomes — and let a clean window clear itKARASS-319
[ ]The claim reads that policy and records that it did — bias inside the ordering, never a vetoKARASS-320
[ ]A check that can fail: drive decision → outcome → policy → biased order end to endKARASS-321
epic KARASS-314 · Вот игра: https://thefounder.biz/play/ — выиграй её
[~]Drive the builder's system chromium from a script (scripts/game/browser.mjs)KARASS-324
[~]Observe thefounder.biz/play and commit what the game actually isKARASS-325
[~]Define the game's terminal state as a mechanical predicate (scripts/game/win.mjs)KARASS-326
[~]Snapshot and restore the playthrough so it survives the session boundaryKARASS-327
[ ]The play loop: observe → choose → act → checkpoint, until won or out of budgetKARASS-329
[ ]Play thefounder.biz to its terminal state and commit the evidenceKARASS-330
epic KARASS-323 · Generated migration: insert the historical DISMISSED.md ledger into the event table as finding_dismissed rows
[~]Generate and commit migrations/037_backfill_dismissed_ledger.sql (finding_dismissed backfill, pinned sha)KARASS-358
epic KARASS-328 · Closed action registry for the game (scripts/game/actions.mjs)
[~]Observe The Founder past the main menu and write down the in-game action surfaceKARASS-337
[~]scripts/game/actions.mjs: frozen ACTIONS registry and perform(page, name, target)KARASS-338
[ ]node scripts/game/actions.mjs --self-test drives three distinct actions against the live gameKARASS-341
epic KARASS-340 · Bounded drag primitive for the canvas surfaces, with game-named targets
[~]Recon: does the Market minigame need a drag, and what can its pieces/cells be named?KARASS-349
[~]Register the market drag action with game-named targets, or record why notKARASS-350
epic KARASS-347 · [root-cause] src/app/api/internal/crane/github-token/route.ts:20
[x]Add contents:read to READ_TOKEN_PERMISSIONS so pr_review_status can resolve commit oidsKARASS-359
epic KARASS-351 · [EPIC] Эволюция Karass: стена → одно изменение себя → скор → отбор (DGM, поколение 0)
[x]Эволюция 0: гейт с двумя внешними ревьюерами — молчащий обходится, возражение любого блокируетKARASS-352
[x]Эволюция 1: датчик стен — общее определение стены, журнал wall_opened / wall_closedKARASS-353
[x]Эволюция 2: мутация — стена → одна сессия → один тикет-изменение себяKARASS-354
[x]Эволюция 3: скор версии — исход каждой мутации меряет датчик, архив с родословнойKARASS-355
[x]Эволюция 4: отбор — плохая мутация откатывается, судья неприкосновененKARASS-356
epic KARASS-360 · listLegalActions(observation) with a never-empty deterministic fallback in scripts/game/actions.mjs
[ ]Export listLegalActions(observation) from scripts/game/actions.mjs with a never-empty fallbackKARASS-364
[ ]Browser-free CLI check for listLegalActions over every recon observation fixtureKARASS-365
epic unsorted · unsorted
[~]Убрать owner-approval из контура: гейты = механизмы, не человекKARASS-146
[~]Изоляция билд-сессий: отдельный uid + расщепление гейтвей-секретаKARASS-147
[ ][ARCH] Builder-VM целиком из Terraform — прообраз клиентского деплояKARASS-148
[~]Потерянные блоки возвращаются сами: ретрай после фикса вместо ручного релейблаKARASS-149
[x]Foreman различает контентные тикеты: Notion-работа не идёт в билд-контурKARASS-150
[ ]«Уже сделано» — не провал: сессия без коммитов не должна кормить кулдаун, когда утверждение уже истинноKARASS-235
[ ]Тест V6 должен считать различные ожидания, а не события: метрику нельзя двигать правкой логированияKARASS-237
[ ]CodeRabbit already reviews every crane PR and the merge gate does not count it — one reviewer is the loop's remaining single point of failureKARASS-248
[ ]Build workspaces cannot read the repo's history: --depth 50 + scrubbed credential blocks any block that needs git historyKARASS-331
[ ]Fix-round workspaces leave a GitHub token in .git/config after the round endsKARASS-332
[x]A session that times out after writing `status: done` is thrown away — push what it committed instead of discarding itKARASS-334
[x][mutation] Make tg_send a demand-driven limb: its health is the last send's outcome, not elapsed silenceKARASS-361
[ ][mutation] A seed escalation derived from ticket text notifies but never blocks; only a declared or in-session-discovered seed keepKARASS-367
[ ][mutation] File voice/rollback tickets into the Karass backlog project so the foreman can see themKARASS-369
[ ][root-cause] crane/merge-gate.mjs:868KARASS-370

[x] placed · [~] growing · [ ] spore · ◆ milestone — a block counts as placed only when the verifier says so, never the builder.

## anatomy of the organism


   senses                   the crane                 verifiers
   sentry . checkmyapp      claude code on a vm       ci . monitor . checkmyapp
   ci . the owner           one block at a time       done is granted, not claimed
        |                         |                          |
        v                         v                          v
 +------------+   claim   +---------------+  pr/merge  +--------------+
 |   queue    | --------> |   builder vm  | ---------> |   verifier   |
 |  (linear)  |           | (claude code) |   deploy   |  grants done |
 +------------+           +---------------+            +------+-------+
        ^                                                     |
        +----------- regressions become new blocks <----------+

 ~~~~~~~~~~~~ everything writes to the mycelium (event log) ~~~~~~~~~~~~
myceliumappend-only event log in postgres. every actor writes, any agent reads. memory, observability, and the soil any emergent structure grows from.
sensesmonitor polls errors of karass itself; checkmyapp walks the ui like a stranger and reports what breaks; ci reports red; the owner speaks through telegram.
attentionsignals become tickets in one queue. the queue is the only source of work — no side quests.
the cranea dispatcher on an isolated vm. picks one block at a time, opens a workspace, runs a claude code session, raises a pr. strictly serial — patience is cheaper than chaos.
verifiersci gates the pr; after deploy, monitor watches for the defect returning; checkmyapp re-walks affected journeys. only a verifier moves a block to done — the builder never grades its own work.
memoryevery ambiguous choice is a named decision with a typed outcome. repeated pain graduates into policy that biases — never silently replaces — future choices.
steeringthe owner sets direction and holds the abort switch. the first blocks merge with owner approval; autonomy is earned on the trust ladder, not assumed.
symbiosis · karass ↔ checkmyapp

two fruiting bodies of one mycelium. checkmyapp gives karass senses — it walks karass.dev daily and turns regressions into build tickets. karass gives checkmyapp hands — the same crane will work its backlog as customer #2. each builds the other.

two media, deliberately: the mycelium is for remembering and noticing — actions travel through typed channels (the queue, pull requests, webhooks). commands are never fished out of a log, and nothing that happened is ever lost.

## watch it grow

karass is invite-only while it raises itself. leave your address and tell us what you would let an organism like this build for you — it shapes which tentacles grow next.

$