350 lines
15 KiB
HTML
350 lines
15 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
|
|
<title>How a 4-Person Studio Runs on AI Agents — Tinqs Blog</title>
|
|
<meta name="description" content="We gave AI agents persistent identities, skill playbooks, and access to our entire knowledge base. Here's how four people ship like forty.">
|
|
<meta name="robots" content="index, follow">
|
|
<link rel="canonical" href="https://www.tinqs.com/blog/agentic-workflow">
|
|
|
|
<meta property="og:type" content="article">
|
|
<meta property="og:url" content="https://www.tinqs.com/blog/agentic-workflow">
|
|
<meta property="og:title" content="How a 4-Person Studio Runs on AI Agents">
|
|
<meta property="og:description" content="Soul files, skill playbooks, and markdown as the universal API for AI agents in game dev.">
|
|
<meta property="og:image" content="https://www.tinqs.com/blog/img/agentic-workflow-architecture.png">
|
|
|
|
<meta name="twitter:card" content="summary_large_image">
|
|
<meta name="twitter:title" content="How a 4-Person Studio Runs on AI Agents">
|
|
<meta name="twitter:description" content="Soul files, skill playbooks, and markdown as the universal API for AI agents in game dev.">
|
|
<meta name="twitter:image" content="https://www.tinqs.com/blog/img/agentic-workflow-architecture.png">
|
|
|
|
<script type="application/ld+json">
|
|
{
|
|
"@context": "https://schema.org",
|
|
"@type": "BlogPosting",
|
|
"headline": "How a 4-Person Studio Runs on AI Agents",
|
|
"datePublished": "2026-03-06",
|
|
"author": {
|
|
"@type": "Person",
|
|
"name": "Ozan Bozkurt"
|
|
},
|
|
"publisher": {
|
|
"@type": "Organization",
|
|
"name": "Tinqs Limited",
|
|
"url": "https://www.tinqs.com"
|
|
},
|
|
"description": "We gave AI agents persistent identities, skill playbooks, and access to our entire knowledge base. Here's how four people ship like forty."
|
|
}
|
|
</script>
|
|
|
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
<link href="https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
|
|
|
|
<style>
|
|
/* ── Tinqs Studio brand — post styles ── */
|
|
|
|
:root {
|
|
/* Studio near-black base */
|
|
--c-bg: #0B0C0E;
|
|
--c-bg-raised: #15171A;
|
|
/* Foreground */
|
|
--c-fg: #ECEEF1;
|
|
--c-muted: #8A95A3;
|
|
/* Family accents */
|
|
--c-lime: #B6FF3C;
|
|
--c-violet: #7C5CFF;
|
|
/* Borders */
|
|
--c-border: rgba(255,255,255,.07);
|
|
--c-border-strong: rgba(255,255,255,.12);
|
|
}
|
|
|
|
*, *::before, *::after { box-sizing: border-box; }
|
|
|
|
html { background: var(--c-bg); }
|
|
|
|
body {
|
|
margin: 0;
|
|
padding: 0;
|
|
background: var(--c-bg);
|
|
color: var(--c-fg);
|
|
font-family: 'Inter', system-ui, -apple-system, sans-serif;
|
|
font-size: 16px;
|
|
line-height: 1.6;
|
|
-webkit-font-smoothing: antialiased;
|
|
}
|
|
|
|
/* ── Post container ── */
|
|
.post {
|
|
background: var(--c-bg);
|
|
max-width: 720px;
|
|
margin: 0 auto;
|
|
padding: 48px 24px 60px;
|
|
}
|
|
|
|
/* ── Back link ── */
|
|
.post__back {
|
|
color: var(--c-muted);
|
|
text-decoration: none;
|
|
font-size: 0.875rem;
|
|
display: inline-block;
|
|
margin-bottom: 24px;
|
|
transition: color 0.15s;
|
|
}
|
|
.post__back:hover { color: var(--c-lime); }
|
|
|
|
/* ── Gradient title — lime → violet ── */
|
|
.post__title {
|
|
font-family: 'Space Grotesk', system-ui, -apple-system, sans-serif;
|
|
background: linear-gradient(90deg, var(--c-lime), var(--c-violet));
|
|
-webkit-background-clip: text;
|
|
background-clip: text;
|
|
color: transparent;
|
|
font-weight: 700;
|
|
font-size: 2.2rem;
|
|
line-height: 1.2;
|
|
margin: 0 0 16px;
|
|
}
|
|
|
|
/* ── Date pill ── */
|
|
.post__date {
|
|
display: inline-block;
|
|
font-family: 'JetBrains Mono', ui-monospace, 'SF Mono', Consolas, monospace;
|
|
font-size: 0.72rem;
|
|
letter-spacing: 0.18em;
|
|
text-transform: uppercase;
|
|
color: var(--c-muted);
|
|
border: 1px solid var(--c-border);
|
|
border-radius: 999px;
|
|
padding: 4px 14px;
|
|
margin-bottom: 16px;
|
|
}
|
|
|
|
/* ── Lead ── */
|
|
.post__lead {
|
|
color: var(--c-muted);
|
|
font-size: 1.08rem;
|
|
line-height: 1.7;
|
|
}
|
|
|
|
/* ── Body ── */
|
|
.post__body { font-size: 1rem; line-height: 1.7; }
|
|
|
|
.post__body p { margin: 14px 0; }
|
|
|
|
.post__body h2 {
|
|
font-family: 'Space Grotesk', system-ui, -apple-system, sans-serif;
|
|
font-weight: 600;
|
|
font-size: 1.6rem;
|
|
margin: 54px 0 6px;
|
|
padding-left: 16px;
|
|
border-left: 4px solid var(--c-lime);
|
|
line-height: 1.3;
|
|
}
|
|
|
|
.post__body h3 {
|
|
font-family: 'Space Grotesk', system-ui, -apple-system, sans-serif;
|
|
font-weight: 500;
|
|
color: var(--c-violet);
|
|
font-size: 1.15rem;
|
|
margin: 30px 0 4px;
|
|
}
|
|
|
|
.post__body h4, .post__body h5, .post__body h6 {
|
|
margin: 20px 0 4px;
|
|
}
|
|
|
|
/* ── Inline code ── */
|
|
.post__body code {
|
|
font-family: 'JetBrains Mono', ui-monospace, 'SF Mono', Consolas, monospace;
|
|
font-size: 0.84em;
|
|
background: var(--c-bg-raised);
|
|
color: var(--c-lime);
|
|
padding: 2px 6px;
|
|
border-radius: 4px;
|
|
border: 1px solid var(--c-border);
|
|
}
|
|
|
|
/* ── Code blocks ── */
|
|
.post__body pre {
|
|
background: var(--c-bg);
|
|
border: 1px solid var(--c-border);
|
|
border-radius: 8px;
|
|
padding: 16px 18px;
|
|
overflow-x: auto;
|
|
margin: 14px 0;
|
|
font-family: 'JetBrains Mono', ui-monospace, 'SF Mono', Consolas, monospace;
|
|
font-size: 0.83rem;
|
|
line-height: 1.55;
|
|
color: var(--c-fg);
|
|
}
|
|
|
|
.post__body pre code {
|
|
background: transparent;
|
|
padding: 0;
|
|
border: none;
|
|
font-size: inherit;
|
|
color: inherit;
|
|
border-radius: 0;
|
|
}
|
|
|
|
/* ── Blockquote ── */
|
|
.post__body blockquote {
|
|
background: rgba(124, 92, 255, 0.06);
|
|
border: 1px solid rgba(124, 92, 255, 0.15);
|
|
border-left: 4px solid var(--c-violet);
|
|
border-radius: 0 8px 8px 0;
|
|
padding: 16px 18px;
|
|
margin: 18px 0;
|
|
color: var(--c-fg);
|
|
font-size: 0.94rem;
|
|
}
|
|
|
|
/* ── Links ── */
|
|
.post__body a { color: var(--c-lime); text-decoration: underline; text-underline-offset: 3px; }
|
|
.post__body a:hover { color: var(--c-violet); }
|
|
|
|
/* ── Strong ── */
|
|
.post__body strong { color: var(--c-lime); font-weight: 600; }
|
|
|
|
/* ── HR ── */
|
|
.post__body hr {
|
|
border: none;
|
|
border-top: 1px solid var(--c-border);
|
|
margin: 32px 0;
|
|
}
|
|
|
|
/* ── Figures ── */
|
|
.post__body figure { margin: 20px 0; }
|
|
.post__body figure img {
|
|
max-width: 100%;
|
|
border-radius: 12px;
|
|
border: 1px solid var(--c-border);
|
|
}
|
|
|
|
.post__body figcaption {
|
|
color: var(--c-muted);
|
|
font-size: 0.85rem;
|
|
margin-top: 6px;
|
|
}
|
|
|
|
/* ── Lists ── */
|
|
.post__body ul, .post__body ol { padding-left: 1.5em; margin: 10px 0; }
|
|
.post__body li { margin: 4px 0; }
|
|
|
|
/* ── Author ── */
|
|
.post__author {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 14px;
|
|
margin-top: 48px;
|
|
padding-top: 24px;
|
|
border-top: 1px solid var(--c-border);
|
|
}
|
|
|
|
.post__author-avatar {
|
|
width: 48px;
|
|
height: 48px;
|
|
border-radius: 50%;
|
|
background: var(--c-violet);
|
|
color: #fff;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
font-weight: 700;
|
|
font-size: 0.85rem;
|
|
flex-shrink: 0;
|
|
}
|
|
|
|
.post__author-info {
|
|
font-size: 0.85rem;
|
|
color: var(--c-muted);
|
|
line-height: 1.4;
|
|
}
|
|
|
|
.post__author-name {
|
|
color: var(--c-fg);
|
|
font-weight: 600;
|
|
}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
|
|
<!-- POST -->
|
|
<article class="post">
|
|
<a href="/blog/" class="post__back">← All Posts</a>
|
|
<span class="post__date">6 March 2026</span>
|
|
<h1 class="post__title">How a 4-Person Studio Runs on AI Agents</h1>
|
|
<p class="post__lead">Last week one of our agents caught a stale bug at 3am — a vegetation culling issue that had been open for six days. It nudged the team chat, drafted a fix summary, and by morning the issue was resolved. Nobody lost sleep. Nobody context-switched. The agent just handled it.</p>
|
|
|
|
<div class="post__body">
|
|
<p>This is what happens when you stop treating AI as a chatbot and start treating it as a team member with a persistent identity, a memory, and a set of skills it can actually execute.</p>
|
|
<h2>The problem with "just use ChatGPT"</h2>
|
|
<p>Every small studio hits the same wall: four people, forty roles. Nobody has time to keep documentation current. Bugs pile up. The backlog rots. Someone asks "what did we decide about the inventory system?" and three different answers come back.</p>
|
|
<p>The usual fix is more tools — Notion, Trello, Linear, Slack integrations. But tools are passive. They sit there waiting for humans to update them. In a team where the lead developer is also the CTO, that human is already stretched thin.</p>
|
|
<p>We tried something different. Instead of adding more tools for humans to maintain, we gave AI agents persistent identities, connected them to our entire knowledge base, and let them do the maintenance.</p>
|
|
<h2>Soul files: giving agents a personality that sticks</h2>
|
|
<p>The core idea is embarrassingly simple. Every agent gets a <strong>soul file</strong> — a markdown document that defines who it is, what it values, and how it should behave:</p>
|
|
<ul>
|
|
<li><strong>Values</strong> — "never break the build," "always verify before acting," "prefer existing patterns over novelty"</li>
|
|
<li><strong>Knowledge scope</strong> — what repos exist, who's on the team, what the game is about</li>
|
|
<li><strong>Behavioural rules</strong> — when to act autonomously, when to ask, what requires explicit human approval</li>
|
|
</ul>
|
|
<p>This isn't theatre. It's the difference between an agent that asks "what project is this?" every session and one that says "I see the vegetation grid was updated yesterday — want me to check the cache eviction?"</p>
|
|
<p>The soul file loads in 100ms when the agent starts. No cold starts. No re-explaining.</p>
|
|
<h2>Memory: markdown in git, not a vector database</h2>
|
|
<p>Agent memory lives as plain markdown files in our docs repo. No vector databases, no proprietary stores, no SaaS dashboards. The agent writes to its memory file during work, commits it, and reads it on the next session.</p>
|
|
<p>This is deliberately low-tech. Markdown in git gives you version history, diffs, branching, and human readability for free. When memory goes wrong — and it will — you <code>git log</code> to see what changed and <code>git revert</code> to fix it. Try debugging a corrupted vector embedding at 11pm.</p>
|
|
<h2>Skills: teachable playbooks, not prompt engineering</h2>
|
|
<p>Agents don't just have instructions. They have <strong>skills</strong> — markdown playbooks that teach specific workflows. When someone says "generate concept art for a character," the agent reads <code>skills/image-generation.md</code> and follows the procedure. No prompt engineering per session. No "let me try a different prompt."</p>
|
|
<p>We've open-sourced several skills:</p>
|
|
<ul>
|
|
<li><a href="../skills/image-generation.md" style="color: var(--c-lime);">Image Generation with fal.ai</a> — 4-layer prompt pattern that actually produces usable game art</li>
|
|
<li><a href="../skills/concept-art-pipeline.md" style="color: var(--c-lime);">Concept Art Pipeline</a> — full 2D concept → 3D model workflow</li>
|
|
<li><a href="../skills/tripo-browser-workflow.md" style="color: var(--c-lime);">3D Model Generation</a> — Tripo Studio text-to-3D</li>
|
|
<li><a href="../skills/sora2-video.md" style="color: var(--c-lime);">Video Generation</a> — trailer clips with Sora 2</li>
|
|
</ul>
|
|
<p>Each skill took about 30 minutes to write. After six months, our agents have 15+ skills covering art generation, competitive research, video production, and project management. Skills compound — every playbook you write makes every future session more capable.</p>
|
|
<h2>What the agents actually do, every day</h2>
|
|
<p><strong>During the day</strong> (interactive, inside the IDE):</p>
|
|
<ul>
|
|
<li>Triages and grooms the issue backlog</li>
|
|
<li>Keeps documentation in sync with what's actually in the game</li>
|
|
<li>Processes tester bug reports and creates structured issues</li>
|
|
<li>Generates concept art, trailer frames, UI icons on demand</li>
|
|
<li>Conducts competitive research — Steam pages, player reviews, pricing</li>
|
|
</ul>
|
|
<p>The team talks to the agent through voice. The IDE microphone transcribes, and the agent interprets intent from messy voice-to-text. "There's a tree floating two meters above the terrain on the west beach" becomes a filed issue with a screenshot, a vision-model description, and coordinates.</p>
|
|
<p><strong>At night</strong> (background daemon, $15/day):</p>
|
|
<ul>
|
|
<li>Polls team chat every 15 minutes, responds to commands</li>
|
|
<li>When a tester reports a bug in chat, creates a structured issue automatically</li>
|
|
<li>Flags stale issues that haven't been touched</li>
|
|
<li>Posts a morning digest of what happened overnight</li>
|
|
<li>Creates its own skill files when it discovers better approaches</li>
|
|
</ul>
|
|
<h2>What we learned</h2>
|
|
<p><strong>Plain text is the universal API.</strong> Every tool, every agent, every human can read a markdown file. We store everything — design docs, meeting notes, agent memory, team contacts — as <code>.md</code> in one repo. It sounds too simple, but it eliminates an entire class of integration problems.</p>
|
|
<p><strong>Cheap models for routine, expensive models for thinking.</strong> Most of what an agent does is pattern matching — "does this look like a bug report?" You don't need DeepSeek Pro for that. Save the premium tokens for decisions that actually require reasoning. Our background daemon costs $15/day with a three-tier model strategy.</p>
|
|
<p><strong>Voice changes everything.</strong> When you can describe a bug while looking at the screen, and the agent transcribes, interprets, and files it — that collapses the distance between noticing a problem and tracking it. Keyboard-free bug reporting is a superpower.</p>
|
|
<p><strong>Skills compound exponentially.</strong> One skill saves 15 minutes per session. Fifteen skills save hours per day across the whole team. The investment curve is absurdly favourable — 30 minutes of writing per skill, compounding returns forever.</p>
|
|
<p>We're four people. With agents doing the mechanical work, we operate like forty. Not because the AI is magic — because we gave it identity, memory, and the right playbooks, and then got out of its way.</p>
|
|
<hr>
|
|
<p><em>We're building <a href="https://arikigame.com" style="color: var(--c-lime);">Ariki</a>, a survival colony sim, using the same agent workflow described here. Everything runs on <a href="https://tinqs.com" style="color: var(--c-lime);">Tinqs Studio</a> — a game dev platform with built-in AI agents, git hosting, and creative pipelines.</em></p>
|
|
|
|
</div>
|
|
|
|
<div class="post__author">
|
|
<div class="post__author-avatar">OB</div>
|
|
<div class="post__author-info">
|
|
<span class="post__author-name">Ozan Bozkurt</span><br>
|
|
CTO & Developer, Tinqs
|
|
</div>
|
|
</div>
|
|
</article>
|
|
|
|
</body>
|
|
</html>
|