Files
blog/agentic-workflow.html
T
ozan f01036c646 rewrite: refresh all blog posts for public audience
Merged overlapping posts:
- forking-gitea + fork-dont-build → one post about the fork philosophy
- fal-image-generation + image-generation-fal → one post about AI art pipeline

Rewrote all posts with external/public voice:
- Stronger hooks, concrete examples, punchier language
- agentic-workflow: restructured around soul files + skills + numbers
- agent-harness: clearer framing of 'what an agent harness is'
- cloud-harness: tighter narrative about overnight agents
- godot-optimisation: same depth, sharper opening
- pre-commit-agent: clearer architecture, cost breakdown
- studio-cli: reframed around identity/cold-start problem
- blog-visual-upgrade: tightened the restyle story

10 posts total (9 markdown + 1 hand-authored HTML)
2026-06-03 03:06:41 +01:00

325 lines
17 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>
<!-- PostHog (EU) -->
<script>
!function(t,e){var o,n,p,r;e.__SV||(window.posthog=e,e._i=[],e.init=function(i,s,a){function g(t,e){var o=e.split(".");2==o.length&&(t=t[o[0]],e=o[1]),t[e]=function(){t.push([e].concat(Array.prototype.slice.call(arguments,0)))}}(p=t.createElement("script")).type="text/javascript",p.crossOrigin="anonymous",p.async=!0,p.src=s.api_host.replace(".i.posthog.com","-assets.i.posthog.com")+"/static/array.js",(r=t.getElementsByTagName("script")[0]).parentNode.insertBefore(p,r);var u=e;for(void 0!==a?u=e[a]=[]:a="posthog",u.people=u.people||[],u.toString=function(t){var e="posthog";return"posthog"!==a&&(e+="."+a),t||(e+=" (stub)"),e},u.people.toString=function(){return u.toString(1)+".people (stub)"},o="init capture register register_once register_for_session unregister unregister_for_session getFeatureFlag getFeatureFlagPayload isFeatureEnabled reloadFeatureFlags updateEarlyAccessFeatureEnrollment getEarlyAccessFeatures on onFeatureFlags onSessionId getSurveys getActiveMatchingSurveys renderSurvey canRenderSurvey getNextSurveyStep identify setPersonProperties group resetGroups setPersonPropertiesForFlags resetPersonPropertiesForFlags setGroupPropertiesForFlags resetGroupPropertiesForFlags reset get_distinct_id getGroups get_session_id get_session_replay_url alias set_config startSessionRecording stopSessionRecording sessionRecordingStarted captureException loadToolbar get_property getSessionProperty createPersonProfile opt_in_capturing opt_out_capturing has_opted_in_capturing has_opted_out_capturing clear_opt_in_out_capturing debug".split(" "),n=0;n<o.length;n++)g(u,o[n]);e._i.push([i,s,a])},e.__SV=1)}(document,window.posthog||[]);
posthog.init('phc_teG6p5oxf6poQHPThq5AGKzWQNhw4bHW9arLwWAVXm3f',{api_host:'https://eu.i.posthog.com',ui_host:'https://eu.posthog.com',person_profiles:'identified_only',defaults:'2026-01-30'})
</script>
<link rel="icon" type="image/svg+xml" href="/img/favicon.svg">
<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=IBM+Plex+Sans:ital,wght@0,300;0,400;0,500;0,600;0,700;1,300;1,400;1,500;1,600;1,700&display=swap" rel="stylesheet">
<link rel="stylesheet" href="../style.css">
<style>
/* ── Team guide aesthetic: self-contained overrides ── */
/* ── Gradient title (amber → warm gold, hint of blue) ── */
.post__title {
background: linear-gradient(90deg, #c9935a, #f59e0b 40%, #38bdf8);
-webkit-background-clip: text;
background-clip: text;
color: transparent;
font-weight: 800;
}
/* ── Date pill ── */
.post__date {
display: inline-block;
font-family: ui-monospace, 'SF Mono', 'Cascadia Code', Consolas, monospace;
font-size: 0.72rem;
letter-spacing: 0.22em;
text-transform: uppercase;
color: #38bdf8;
border: 1px solid rgba(147, 140, 129, 0.25);
border-radius: 999px;
padding: 4px 14px;
margin-bottom: 16px;
}
/* ── Lead ── */
.post__lead {
color: #9aa7b4;
font-size: 1.08rem;
line-height: 1.7;
}
/* ── H2: left accent bar ── */
.post__body h2 {
font-size: 1.7rem;
margin: 54px 0 6px;
padding-left: 16px;
border-left: 4px solid #c9935a;
}
/* ── H3: purple secondary accent ── */
.post__body h3 {
color: #a855f7;
font-size: 1.18rem;
margin: 30px 0 4px;
}
/* ── Inline code ── */
.post__body code {
font-family: ui-monospace, 'SF Mono', 'Cascadia Code', Consolas, monospace;
font-size: 0.86em;
background: #1c2230;
color: #9fe6c0;
padding: 2px 6px;
border-radius: 5px;
border: 1px solid #2a3340;
}
/* ── Code blocks (dark panel) ── */
.post__body pre {
background: #0a0e14;
border: 1px solid #2a3340;
border-radius: 10px;
padding: 16px 18px;
overflow-x: auto;
margin: 14px 0;
font-family: ui-monospace, 'SF Mono', 'Cascadia Code', Consolas, monospace;
font-size: 0.85rem;
line-height: 1.55;
color: #e6edf3;
}
/* Reset inline-code double-up inside pre */
.post__body pre code {
background: transparent;
padding: 0;
border: none;
font-size: inherit;
color: inherit;
border-radius: 0;
}
/* ── Blockquote callout (ready for future use; build.js does not emit blockquote yet) ── */
.post__body blockquote {
background: rgba(245, 158, 11, 0.08);
border: 1px solid rgba(245, 158, 11, 0.25);
border-left: 4px solid #f59e0b;
border-radius: 0 12px 12px 0;
padding: 16px 18px;
margin: 18px 0;
color: #f4e3c4;
font-size: 0.94rem;
}
/* ── Links ── */
.post__body a {
color: #38bdf8;
}
.post__body a:hover {
color: #a855f7;
}
/* ── Strong ── */
.post__body strong {
color: #f59e0b;
}
/* ── HR ── */
.post__body hr {
border: none;
border-top: 1px solid #2a3340;
margin: 32px 0;
}
/* ── Figures ── */
.post__body figure img {
border-radius: 12px;
border: 1px solid #2a3340;
}
.post__body figcaption {
color: #9aa7b4;
font-size: 0.85rem;
margin-top: 6px;
}
/* ── List spacing ── */
.post__body li {
margin: 4px 0;
}
</style>
</head>
<body>
<!-- NAV -->
<nav class="nav nav--scrolled" id="nav">
<a href="/" class="nav__logo" aria-label="Tinqs home">
<span class="nav__wordmark">TINQS</span>
</a>
<div class="nav__links">
<a href="/#game" class="nav__link">Games</a>
<a href="/#tech" class="nav__link">Technology</a>
<a href="/#about" class="nav__link">About</a>
<a href="/blog/" class="nav__link" style="color: var(--c-accent-l);">Blog</a>
<a href="/#signup" class="nav__link">Contact</a>
<a href="/press" class="nav__link">Press</a>
</div>
<button class="nav__burger" aria-label="Open menu" id="navBurger">
<span></span><span></span><span></span>
</button>
</nav>
<!-- MOBILE MENU -->
<div class="mobile-menu" id="mobileMenu">
<a href="/#game" class="mobile-menu__link">Games</a>
<a href="/#tech" class="mobile-menu__link">Technology</a>
<a href="/#about" class="mobile-menu__link">About</a>
<a href="/blog/" class="mobile-menu__link">Blog</a>
<a href="/#signup" class="mobile-menu__link">Contact</a>
<a href="/press" class="mobile-menu__link">Press</a>
</div>
<!-- POST -->
<article class="post">
<a href="/blog/" class="post__back">&larr; 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(&ndash;c-accent-l);">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(&ndash;c-accent-l);">Concept Art Pipeline</a> — full 2D concept → 3D model workflow</li>
<li><a href="../skills/tripo-browser-workflow.md" style="color: var(&ndash;c-accent-l);">3D Model Generation</a> — Tripo Studio text-to-3D</li>
<li><a href="../skills/sora2-video.md" style="color: var(&ndash;c-accent-l);">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(&ndash;c-accent-l);">Ariki</a>, a survival colony sim, using the same agent workflow described here. Everything runs on <a href="https://tinqs.com" style="color: var(&ndash;c-accent-l);">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>
<!-- FOOTER -->
<footer class="footer">
<div class="footer__inner">
<span class="footer__wordmark">TINQS</span>
<div class="footer__links">
<a href="/#game">Games</a>
<a href="/#tech">Technology</a>
<a href="/#about">About</a>
<a href="/blog/">Blog</a>
<a href="mailto:hello@tinqs.com">hello@tinqs.com</a>
<a href="/press">Press Kit</a>
</div>
<p class="footer__copy">Tinqs Limited &mdash; London, est. 2020</p>
</div>
</footer>
<script>
const burger = document.getElementById('navBurger');
const mobileMenu = document.getElementById('mobileMenu');
burger.addEventListener('click', () => {
const open = mobileMenu.classList.toggle('mobile-menu--open');
burger.classList.toggle('nav__burger--open', open);
document.body.style.overflow = open ? 'hidden' : '';
});
mobileMenu.querySelectorAll('a').forEach(link => {
link.addEventListener('click', () => {
mobileMenu.classList.remove('mobile-menu--open');
burger.classList.remove('nav__burger--open');
document.body.style.overflow = '';
});
});
</script>
</body>
</html>