STIT·AI-driven engineering systemEN/RU

We taught AIour engineeringdiscipline

Velocity went up several-fold.
Quality, for the first time, stopped depending on the individual engineer

analytics·architecture·backend·infrastructure
02/16problem

Without a process, AI doesn't accelerate It amplifies what's already broken

Before AI, a weak process simply shipped legacy slowly. With AI, the same thing, ten times faster. Time to release, reliability, understanding of your own system: none of it rests on tools. It rests on repeatability

→ this is not the law of the industry. It's the absence of a repeatable process
3 axes where every project breaks
time6 months

From kick-off to stable production: TLS, secrets, monitoring, backups, auth, dashboards. Built from scratch every time, by every new team

people1 engineer

Holds the whole system in their head. They leave, the product stalls. Documentation ages faster than it's written

AI illusion10× code

But no one checks whether it follows the team's architecture and security model. Generation speed is not delivery speed

03/16how it works

AI works the way our best engineers work — because that's how we taught it

Over years of practice, we crystallized our own way of building production software: architectural principles, code review rituals, incident playbooks, ways to separate stable from draft. We don't keep it in our heads. We digitized it. AI inherits that layer

01experience → rule

Every engineering decision we make is recorded as a rule in the repository, not in someone's memory, and not in a Notion page no one opens

02rule → check

Every rule gets a machine-enforced check: hooks, gates, agent role limits. Decisions become a system that runs itself, with no reminders required

03check → AI

AI operates on top of this layer. It inherits process the way a new hire inherits a team's culture. But without onboarding, without forgetting, without drift

↳ for partners — we digitize their engineering culture the same way
04/16ecosystem

4 pillars One factory

Each block owns its zone. The contracts between them are explicit. Any part can be shown to an auditor, forked for a client, or handed to a new team, with no context loss

stit/infra
Platform

Our corporate platform. Unified SSO, secrets, image registry, end-to-end observability. Every client project plugs in: no separate setup

edge · SSO · vault · registry · observability · multi-tenant
project-infra-template
Project infrastructure

Standard infrastructure pack per client: containers, configuration, backups, monitoring, recovery. Spins up with a single command

docker-compose · ansible · daily backup · DR runbook
go-backend-template
Backend factory

Backend scaffold with architectural artefacts built for code generation. Security, observability, audit — embedded. AI assembles the domain from the approved document

DDD artefacts · doc → code mapping · built-in audit and metrics
golibinfra
Engineering kits

Production-ready backend components: transactional outbox, audit log, idempotency, brute-force protection, metrics, cache, JWT. The base layer the domain is built on

outbox · audit · idempotency · brute-force guard · metrics · JWT
platformproject infrabackend factoryengineering kits
in progress: design system · frontend template with the same artefact contour

2 deployment modes

We pick the architecture to fit the task. The templates, the artefacts, the quality controls are all the same

01
single server
Single-node on a VPS

Docker Compose, one machine. Fast launch, low operating cost, simple DR. Fits MVPs, mid-load systems, isolated corporate environments

Docker·Compose·Ansible·Traefik
02
distributed system
Kubernetes cluster

Horizontal scale, multi-region, high load. Event buses, OLAP analytics, long-running process orchestration. For heavily loaded and distributed products

Kubernetes·Helm·Argo CD·Kafka·ScyllaDB·ClickHouse·gRPC·Temporal
05/16what's in the box · day one

From day one — what teams usually build by month 6

Security, observability, recovery — baked into the template. Not built from scratch on every project. Designed once, documented, proven in production operation

TLS, brute-force protection, WAF at the edge+2 weeks
Secrets vault: no keys in the repository+2 weeks
End-to-end observability: metrics, logs, traces+1 month
Alerts on technical and business anomalies, delivered to a mobile app+2 weeks
Ready-made Grafana dashboards+3 months
Auth: JWT, Argon2id, brute-force protection+2 months
Token reuse detection+2 weeks
Audit log that's append-only by construction+2 weeks
Transactional outbox for events+1 month
Daily backups + quarterly recovery drills+1 month
SSO for admin interfaces+2 weeks
Pre-built HTTP middleware: rate limit, CSP, idempotency+2 weeks
Tenant isolation built into the infrastructure+1 month

→ total saved·~6 months·of calendar time

06/16domain analytics

First we break the business into atoms Then we write code

Before writing any code, we break down the partner's strategy and business processes using four proven methodologies. Each one shows the domain from a different angle: hypotheses, user experience, MVP slice, event model. The output is a set of artefacts from which the application follows as a consequence, not as guesswork

01
Hypothesis tree
what it gives

A tree from business metric down to specific feature. Every branch is a testable hypothesis about user behaviour

what it closes

"we're building this feature because they asked for it": no link to strategy or metric

02
Customer-journey map
what it gives

The full user journey through company processes, overlaid with backstage systems and pain points

what it closes

tunnel vision on one feature without seeing what breaks around it

03
Story-map
what it gives

A two-dimensional map: user journey × implementation depth. The MVP and the iterations after it are sliced out of this map

what it closes

"we need everything at once, perfect": no slice that can be shipped first

04
Event Storming
Alberto Brandolini
what it gives

Collaborative modelling with the partner's team: domain events, commands, aggregates, policies. Maps directly into our docs/domains/ templates

what it closes

the gap between "how the business thinks" and "how it's described in the code": shared vocabulary from the first meeting

↳ analytics artefacts become the input to our markdown template. What happens next: in the very next section
07/16contour: artefact → code

One artefact — 6 layers of code

Analytics artefacts move into a single markdown format. From the approved document, AI assembles every implementation layer, the same way on every project. Until the document is approved, generation does not run: status: draft — stop

docs/domains/user/user.aggregate.md
OK
validate-domain-doc.sh
/add-domain skill
OK
depguard · CI-gate
Before generation, the system automatically verifies that the document is approved, that the cross-references between artefacts are intact, and that the required sections are filled in. If not — generation halts until the document is fixed. Compliance lives in the system, not in the developer's discipline
the mapping of sections → Go constructs is fixed in a single document · MAPPING.md
08/165 levels of control

From advice to hard blocks

Five layers of reliability: from "remember and apply" to "this command will not physically execute." Each next layer eliminates a class of errors the previous one couldn't catch

01
advice
risk
"forgot the rule"
Repo-wide rules are loaded into every task automatically. Nothing to remember: they're already in context
02
context
risk
"didn't know this area has its own rules"
When working on a specific area — infrastructure, security, domain — the area-specific rules attach themselves
03
procedure
risk
"skipped a required step"
A new domain starts with a check of the approved document. The steps are fixed: the order can't be bypassed
04
role
risk
"went outside their authority"
The reviewer agent has read-only tools. It physically cannot edit code, even if it wanted to
05
block
risk
"deliberately went around"
A deploy without passing tests, an unpinned container version, a secret in a commit — none of them go through. Stopped at the tool layer
"Instructions are advice. Blocks are a guarantee of execution"
— Anthropic's standard, encoded into our workflow
09/16security · 8 layers

8 layers — each closes its own class of attack

Not "later, when we get to it." Each layer is a known attack vector with a built-in response in the template. All of it is already running on the first deploy

01
Host
attack
vulnerabilities in system packages, illegitimate root process
defence

Automatic security updates, precise time for logs, kernel limits. Baseline host hardening — out of the box

02
Access
attack
SSH password brute force
defence

Key-based login only. After 5 failed attempts — one-hour ban. Passwords aren't disabled until keys are configured. No one gets locked out

03
Perimeter
attack
bot traffic, vulnerability scanners, HTTP interception
defence

WAF with curated rule sets. Mandatory HTTPS, modern TLS, pre-configured HSTS. Noisy traffic is dropped at the edge

04
Containers
attack
image substitution in the registry, sandbox escape
defence

Image versions pinned by hash. Updates only by deliberate action. Read-only filesystems where possible. Databases unreachable from the public network

05
HTTP layer
attack
request flooding, replayed payment submissions
defence

Rate limits, body size caps, security headers, idempotent retries. Every request is tied to a trace: the full path is visible

06
Auth
attack
token algorithm substitution, refresh-token theft
defence

Strict algorithm verification on every entry. Strong password hashing. Refresh reuse → instant session kill and an audit event

07
Secrets
attack
key leak via repository or command history
defence

Centralized vault. Access scoped by project and environment. A foreign project gets a policy-level refusal, not a discipline-level one

08
Audit
attack
wiping tracks after a breach
defence

Append-only log: nothing can be deleted or altered. Correlated with traces and request IDs

10/16observability · from the first deploy

Observability — a finished dashboard, not a separate project

Metrics, logs, and traces are collected automatically, the moment the modules are wired in. Business indicators live on the same panels as infrastructure ones. No separate weeks of observability work

grafana.stit.tech / dashboards / Apps · Service Overview
HTTP RPS
http_requests_total
+12%
178req/s
HTTP p95 latency
http_server_duration_seconds
88ms
DB pool · active
db_pool_connections{state=active}
16/ 30
Outbox lag
outbox_lag_seconds{subject=*}
0.60s
biz_user_registered_total
business · bizmetric convention
+8%
21/min
auth_refresh_reused_total
security · audit event
0event
alerts
For every kind of incident — technical and business anomalies

Not just CPU and disk. Conversion drops, error spikes, business indicators drifting off baseline — configured to your metrics and thresholds. Every alert ships with context: what happened, in which service, on which request

delivery channel
A mobile app for the client's team

Not Slack, not email. Alerts arrive as push notifications on the phone, instantly, with the incident's details. Access is granted to those who actually need it: engineers, operations, business stakeholders. Part of our infrastructure offering

↳ the dashboard above is mocked for the deck. On a real project the metrics are live from the first minute of deploy, with no application-code changes
11/16tenant isolation

Isolation by cryptography, not by discipline

Each tenant runs in its own logical contour. To impersonate another tenant's identifier, three independent checks would have to be broken simultaneously. This is not a requirement on developers — it's a property of the platform

project AOTLP + BearerTraefikedgetenant-authGo · 95 LOCotel-collectorrouting connectorVictoriaMetricsaccountIDLokiX-Scope-OrgIDTempoX-Scope-OrgID
01
Routing
attempt
request arrives without a tenant token
what happens
At the perimeter, every packet gets a tenant token. Without one, or with a foreign one, the request is turned around before the application layer
02
Sink
attempt
request body claims a different tenant ID
what happens
On the way into storage, the token-vs-claimed-tenant match is re-verified. Substitution in the request body is ignored
03
Storage
attempt
query: "give me tenant X's data"
what happens
Data is partitioned at the database layer itself. Reading another tenant's data is physically impossible. No query would grant access, even in theory
12/16what a CTO will notice

12 decisions — each closes its own class of bugs

Not marketing — every decision actually exists in the code, verifiable in a minute: open the repo, find the line. Architecture, documentation, templates, quality, release, AI. No vague promises

01architecture
DDD + hexagonal — identical on every project

The inner domain knows nothing about Postgres, HTTP, or queues: only interfaces. Swapping the storage layer means two folders. This isn't "later, on big projects", it's the default on day one

bug class that's been closed
a decision inside one module leaks across the whole system
02architecture
One domain document → 6 code files

The mapping from markdown sections to Go constructs is fixed in a single document. Property → getter; emitted event → publish to outbox in the same transaction. Teams build code by identical rules

bug class that's been closed
two engineers interpret the same requirement differently
03architecture
Documentation leads code, not lags — that's what keeps AI on a leash

Any change starts with an update to the markdown document: business logic, API, infrastructure service. status:draft blocks the build, a missing section blocks the skill. AI physically cannot step outside the description. The document is its contract. A year after release, the documentation still reflects the current state

bug class that's been closed
documentation has fallen behind: no one remembers how this works
04architecture
17 kit packages as explicit contracts

audit · outbox · brute-force · http · auth · observability — each kit brings its own migration schema, its own metrics, its own fx-module. These aren't "utilities," they're infrastructure contracts with boundaries

bug class that's been closed
every service writes audit, metrics, outbox its own way
05templates
7 domain template types with required sections

aggregate · entity · event · use-case · policy · value-object · context-readme. Each has strict frontmatter, required sections, and validated cross-document referential integrity

bug class that's been closed
an invariant, an event list, or an access rule got forgotten
06templates
1 service = 1 compose fragment + a ready k8s manifest

The same service is described in two formats: compose — for the single-VPS start (day one, low cost); Helm chart — for scale, when horizontal fault tolerance is needed. The transition doesn't require rewriting the application

bug class that's been closed
moving to k8s = rewriting the application from scratch
07quality
TDD as the default mode · coverage gate in CI

Every line — business logic, infrastructure wrappers, utilities — is written test-first: contract first, implementation after. A PR without tests, or with a coverage drop, won't pass CI. Integration tests run against real Postgres / NATS / Redis in containers, not against mocks

bug class that's been closed
a regression slipped to prod because "we'll test it later"
08quality
Strict linter stack + depguard blocking boundary violations

golangci-lint in strict mode with 30+ checkers. depguard declaratively forbids imports across domain boundaries: the inner domain can't pull in an infrastructure package, a repository can't call a handler. Architectural layers can't "accidentally" merge. CI won't let it through

bug class that's been closed
architectural layers slowly fuse — a year later, refactoring is impossible
09release
Multi-stage CI/CD: lint → test → security scan → build → deploy

Every stage is a blocking gate. Failed lint: no tests. Failed test: no build. A dependency vulnerability found: no deploy. No stage is "skippable if urgent"

bug class that's been closed
code that hadn't passed checks got merged because "it's urgent"
10release
Full dev / staging / prod cycle · environment isolation

Every environment is a separate compose stack, separate Vault secrets, separate databases, separate domain. Prod is physically unreachable from dev: there's no network path. Test data does not leak into production, directly or indirectly

bug class that's been closed
an engineer accidentally connected to prod in a test command
11release
Production deploy: approval by responsible reviewers + auto-rollback

Rollouts to prod require explicit approval from the designated reviewers in the PR. After deploy, the health check is monitored for N seconds. If it doesn't go green, the previous version is restored automatically, with no human in the loop

bug class that's been closed
a broken release stayed in prod until someone noticed
12AI
12 procedural skills + reviewer subagent with no write tools

/add-domain, /add-endpoint, smartdev: step-by-step procedures with preconditions, not "prompts." The reviewer is given read-only tools. Edit/Write are physically absent from its toolset. The agent isn't a "creator," it's the executor of a reproducible script

bug class that's been closed
AI "creatively" rewrote what it was only supposed to review
13/16answers to the hard questions

The questions they'll ask us first

01objectionAI is unpredictable — something is bound to break+
That's why AI in our setup doesn't act on its own. Five layers of control: rules, context, procedures, restricted roles, blocks. Instructions are advice; blocks are guarantees
02objectionA template is reinventing the wheel — our requirements are unique+
The template only covers infrastructure. And infrastructure requirements are the same for everyone: secrets, audit, metrics, recovery. Your unique business logic stays yours and goes into separate modules
03objectionWon't we end up locked into the STIT ecosystem?+
Every component is industry-standard open source: Postgres, OpenTelemetry, Grafana, Vault, Traefik, and the rest. What's ours is thin adapters and a small isolation service. You can leave us at any time
04objectionWhat happens if STIT disappears?+
We hand over the entire technical contour: repositories, documentation, artefacts. The documentation written for AI reads just as easily for humans. Any team picks up exactly where we left off
05objectionAI might just "make things up"+
Before the build, artefact integrity and required sections are checked automatically. Imports between modules are restricted. Ten static checks run in the build itself. The reviewer role has no right to edit code
06objectionWhere's the proof this actually works?+
Live repositories. A deployed corporate stack that's genuinely operated on. Architectural decisions, with trade-offs, documented. We open it under NDA
14/16live demo

8 episodes of a live walkthrough

The full walkthrough is 30 minutes with a host. Not slides: real commands against live infrastructure. Under NDA we open the corporate stack and the reference projects

01≈2 min
git push → production
what you'll see

Pipeline in Gitea: lint → test → security scan → build → deploy → health check, all green. The version on /health changes in the time it takes to grab a coffee

proves

"Deploy" isn't an event with five people on their phones — it's a button

02≈3 min
Markdown → 6 files of production Go
what you'll see

We open docs/domains/user/aggregate.md, run /add-domain: entity.go, usecase.go, events.go, policy.go, repository.go, handler.go appear. Everything compiles, tests are in place

proves

AI doesn't "suggest." AI executes a fixed procedure against an approved document

03≈2 min
Live PR review via reviewer subagent
what you'll see

We open a PR, delegate to the reviewer agent. It reads the diff, leaves comments. On a "let me just fix that" attempt, the tool refuses: Edit/Write are physically absent from its set

proves

A reviewer can't "fix" instead of "comment." Review stays review

04≈2 min
One HTTP request → full path in Tempo
what you'll see

POST to the API → the trace appears in Tempo. The chain: handler → DB (pgx) → outbox → NATS → consumer → outbound HTTP. One trace_id, no gaps, every step's duration visible

proves

"Where did it fail?" — one click in the dashboard, not half an hour in the logs

05≈2 min
Spoofed tenant_id → rejected at three levels
what you'll see

We change X-Tenant-ID in a curl request → rejected at the perimeter. Change it in the body: rejected at the storage entrance. Query the DB past the sink: no data in the response

proves

"One bug = all tenants leaked" — physically impossible: three checks have to be broken at once

06≈1 min
Refresh token used twice → session killed
what you'll see

We use refresh, get a new pair. We use the same refresh again: the session is killed instantly, audit_log gets a refresh_reused entry, the user is logged out on every device

proves

"Our token was stolen" — detected in seconds, not weeks

07≈1 min
Prod deploy without approval → halted at the gate
what you'll see

We start a production deploy on a PR without sign-off from the designated reviewers, and the pipeline halts at the approval gate, notifications go to the responsible parties. After approval, the rollout proceeds automatically

proves

An "accidental release" to production — impossible, technically and organisationally

08≈5 min
DB dropped → restored from backup
what you'll see

On staging Postgres we DROP DATABASE → run the recovery procedure → restic restores the latest backup → integrity check → /health green. RPO and RTO measured in real time

proves

DR isn't "a piece of paper with words on it" — it's a measurable operation with a known duration

15/16engagement format

We become your engineering contour

Not a one-off project. A long-term partnership in which we take on four zones of responsibility and operate inside the logic of your business

partnership
4 zones
01
Infrastructure
We take on the corporate platform: security, observability, recovery, single sign-on. We operate it ourselves. You don't need to hire DevOps
02
Process digitization
We describe your business processes in a single artefact format. From these, the system is assembled, the team is trained, and quality is controlled
03
Finding automation points
We continuously analyse where automation will move the needle. Not a one-time spec, but ongoing work in ROI terms
04
Software delivery
Backend, design, frontend are all built to our methodology. Quality and velocity stay predictable as the team grows
or
one-off work
Turnkey development
When only the product is needed, without a long-term partnership. We close the task by our methodology, hand over the result, the documentation, and the repositories to the client's team
16/16·let's talk

No funnel
No account managers

A short note about the task, over Telegram. We reply ourselves. If it's within our expertise, we'll set up a meeting. If it isn't, we'll say so honestly

production stack operated by our team
Go·TypeScript·React·Next.js·PostgreSQL·ScyllaDB·ClickHouse·Redis·MinIO·NATS·Kafka·gRPC·Temporal·Docker·Kubernetes·Helm·Argo CD·Ansible·Traefik·Vault·Authentik·Gitea·CrowdSec·OpenTelemetry·Grafana·VictoriaMetrics·Loki·Tempo·Alertmanager·Restic
We take on the operation of the entire technical contour. You don't need to hire a DevOps team. That's part of the partnership
STIT · b2b outsource · since 2022stit.tech