{"id":144,"date":"2026-11-06T16:00:00","date_gmt":"2026-11-06T15:00:00","guid":{"rendered":"https:\/\/hoja.in\/blog\/?p=144"},"modified":"2026-10-16T14:00:13","modified_gmt":"2026-10-16T12:00:13","slug":"subagents-for-big-upgrades-scouts-workers-and-a-reviewer","status":"publish","type":"post","link":"https:\/\/hoja.in\/blog\/subagents-for-big-upgrades-scouts-workers-and-a-reviewer\/","title":{"rendered":"Subagents for big upgrades: scouts, workers and a reviewer"},"content":{"rendered":"<p>When I started using Claude Code for TYPO3 upgrades, I did everything in one session. For a small site like my own hoja.in that works. For a large multi-site installation with several sites and many own extensions, it does not. The agent reads TypoScript of site A, then TCA of extension B, then the changelog, then the error log, and after a while the context is full of things which are no longer relevant. It starts to forget the plan, or worse, it remembers half of it.<\/p>\n<p>The way out was not a bigger context. It was splitting the work, the same way a team would do it: people who look around, people who change code, and one person who tries to find what everybody else missed. In Claude Code these are subagents.<\/p>\n<h2>What a subagent is (and is not)<\/h2>\n<p>A subagent is a separate Claude instance with its own context window, its own system prompt and its own set of tools. The main session hands it a task, the subagent works on it, and only the final report comes back. All the files it read and all the dead ends it tried stay in its own context. That is the whole trick: the main session keeps the conclusions, not the noise.<\/p>\n<p>You define them as Markdown files with YAML frontmatter. Project subagents live in <code>.claude\/agents\/<\/code> and are shared with the team through git; personal ones live in <code>~\/.claude\/agents\/<\/code>. Only <code>name<\/code> and <code>description<\/code> are required. The body of the file becomes the subagent&#8217;s system prompt.<\/p>\n<h2>Step 1: read-only scouts<\/h2>\n<p>Before any code changes, I want an inventory of what the next hop breaks. Scouts do this per area: system configuration, site configuration, TypoScript and TSconfig, templates, forms, own extensions. They must not change anything, so they get no edit tools at all:<\/p>\n<pre><code class=\"language-markdown\">---\nname: upgrade-scout\ndescription: Read-only sweep of ONE area of a TYPO3 project for what a given upgrade hop breaks. Give it the area, the hop (e.g. 13 -&gt; 14) and where the changelog is. Returns findings with file:line. Use several in parallel.\ntools: Read, Grep, Glob\nmodel: sonnet\n---\n\nYou inspect one area of a TYPO3 project for a single upgrade hop.\n\nRules:\n- You never edit files and never run commands that write anything.\n- Check every suspicion against the core changelog in vendor\/typo3\/cms-core\/Documentation\/Changelog\/&lt;version&gt;\/.\n  Name the changelog file for each finding. No changelog entry, no finding.\n- Report: file:line, what breaks, changelog reference, suggested fix in one sentence.\n- If the area is clean, say so. Do not invent work.<\/code><\/pre>\n<p>The <code>tools<\/code> field is an allowlist: the scout gets only Read, Grep and Glob. Then I ask the main session something like: &#8220;Send one upgrade-scout each for config\/system, config\/sites, the sitepackage TypoScript, the Fluid templates and the forms, in parallel.&#8221; They run at the same time, each with a fresh context, and I get five short reports instead of one giant session.<\/p>\n<p>The rule &#8220;no changelog entry, no finding&#8221; is important. A language model knows a lot about TYPO3, but it also remembers APIs from v9 next to APIs from v14. Forcing it to cite the real changelog file from <code>vendor\/<\/code> removes most of the guessing.<\/p>\n<h2>Step 2: workers with disjoint file sets<\/h2>\n<p>From the scout reports the main session writes a plan with work packages. The key rule for workers: every package gets its own set of files, and no two packages touch the same file. Otherwise two workers edit the same TCA override in parallel and one silently overwrites the other. Finding such a lost edit later costs more time than the parallelism saves.<\/p>\n<pre><code class=\"language-markdown\">---\nname: upgrade-worker\ndescription: Applies the migration fixes of ONE work package from .project-migration\/plan.md inside its assigned file set, and runs the given verification command before returning.\ntools: Read, Edit, Write, Grep, Glob, Bash\n---\n\nYou get: a list of files you own, the target TYPO3 version, the findings to fix,\nand a verification command.\n\nRules:\n- Edit only files on your list. If a fix needs another file, stop and report it.\n- One finding, one small change. Do not refactor what is not broken.\n- Run the verification command at the end and paste its real output.\n- Never touch the database, composer.json or composer.lock.<\/code><\/pre>\n<p>A worker for &#8220;own extension A, Classes and Configuration&#8221; and a worker for &#8220;sitepackage templates&#8221; can run in parallel. Composer changes, database work and upgrade wizards stay in the main session, one at a time, because they touch everything.<\/p>\n<p>The tool list here is wider, so a guard is useful. For my own migrations I use a PreToolUse hook that blocks commands writing the database when there is no fresh dump in the backups folder. The subagent cannot &#8220;decide&#8221; to skip it, because hooks are enforced by the harness and not by the prompt.<\/p>\n<h2>Step 3: an adversarial reviewer at the end of every hop<\/h2>\n<p>This is the part I would never skip again. After the workers are done and the gate is green (composer validate, cache flush, no pending wizards, smoke test against the baseline), one more subagent reads the whole diff with a single job: find what everybody else missed.<\/p>\n<pre><code class=\"language-markdown\">---\nname: upgrade-reviewer\ndescription: Adversarial reviewer for one finished hop of a TYPO3 upgrade. Reads the hop's diff, the gate output, the ledger and the plan, and hunts for what the gate misses. Read-only. Use at the end of every hop.\ntools: Read, Grep, Glob, Bash\n---\n\nAssume the hop is NOT done. Look for:\n- loosened version constraints or ignored platform requirements\n- wizards marked done without migrated data\n- configuration still pointing to old paths\n- features silently dropped (a plugin, a field, a redirect)\n- a runbook that differs from what was actually run\n\nEvery finding: file:line, why it matters, severity (blocker \/ should fix \/ note).\nYou do not fix anything.<\/code><\/pre>\n<p>It has Bash for <code>git diff<\/code> and <code>git log<\/code>, but its prompt says it fixes nothing, and it reports back to me, not to the workers. Is a prompt enough to stop it from editing? For read-only roles I prefer to leave Edit and Write out of the tool list, as here. Bash can still write files, though, so for the reviewer the prompt and the hook remain the guard. The scout has no Bash at all, and there it is really not a question of good behaviour.<\/p>\n<p>On hoja.in, which is a tiny project, the reviewer still came back with real findings. Two examples from my ledger: the imported pages were owned by the <code>_cli_<\/code> user instead of my admin account, and <code>config\/system\/additional.php<\/code> was missing from git because DDEV was still managing it. Both would have reached production. The tests were green in both cases, because no test looked for them.<\/p>\n<h2>What I learned<\/h2>\n<ul>\n<li>Scouts are cheap and parallel. Give them narrow areas and read-only tools.<\/li>\n<li>Workers need disjoint file sets. Shared files go to the main session.<\/li>\n<li>Database, Composer and wizards stay serial and in the main session, behind a hook.<\/li>\n<li>The reviewer&#8217;s prompt starts from &#8220;assume it is not done&#8221;. A friendly reviewer is useless.<\/li>\n<li>Subagents return reports, not truth. Tests, the smoke comparison and my own review decide what ships.<\/li>\n<\/ul>\n<p>One more honest point: subagents are not free. Each one starts fresh and must read its files again, so for a small upgrade a single session is faster. I start splitting when one session cannot hold the plan and the findings at the same time.<\/p>\n<p>Feedbacks are the champion&#8217;s breakfast. If you have a different split that works for you, drop a comment!<\/p>\n<h2>Further reading<\/h2>\n<ul>\n<li><a href=\"https:\/\/code.claude.com\/docs\/en\/sub-agents\">Claude Code docs: Subagents<\/a><\/li>\n<li><a href=\"https:\/\/code.claude.com\/docs\/en\/hooks-guide\">Claude Code docs: Hooks guide<\/a><\/li>\n<li><a href=\"https:\/\/docs.typo3.org\/m\/typo3\/guide-installation\/main\/en-us\/Major\/Index.html\">TYPO3 Installation Guide: Major upgrades<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>One agent context is not enough for a large TYPO3 multi-site upgrade. How I split the work into read-only scouts, workers with disjoint file sets and an adversarial reviewer.<\/p>\n","protected":false},"author":1,"featured_media":145,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[18],"tags":[34,35,38,5,25],"class_list":["post-144","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ai-engineering","tag-ai-agents","tag-claude-code","tag-code-review","tag-typo3","tag-upgrades"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Claude Code subagents for big TYPO3 upgrades<\/title>\n<meta name=\"description\" content=\"Using Claude Code subagents for TYPO3 upgrades: read-only scouts in parallel, workers with disjoint file sets and a reviewer at every hop.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/hoja.in\/blog\/subagents-for-big-upgrades-scouts-workers-and-a-reviewer\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Claude Code subagents for big TYPO3 upgrades\" \/>\n<meta property=\"og:description\" content=\"Using Claude Code subagents for TYPO3 upgrades: read-only scouts in parallel, workers with disjoint file sets and a reviewer at every hop.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/hoja.in\/blog\/subagents-for-big-upgrades-scouts-workers-and-a-reviewer\/\" \/>\n<meta property=\"og:site_name\" content=\"Hoja Mustaffa Abdul Latheef \u2013 Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-11-06T15:00:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/hoja.in\/blog\/wp-content\/uploads\/2026\/10\/subagents-for-big-upgrades-scouts-workers-and-a-reviewer.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Hoja Mustaffa Abdul Latheef\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@hojaonline\" \/>\n<meta name=\"twitter:site\" content=\"@hojaonline\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Hoja Mustaffa Abdul Latheef\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/subagents-for-big-upgrades-scouts-workers-and-a-reviewer\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/subagents-for-big-upgrades-scouts-workers-and-a-reviewer\\\/\"},\"author\":{\"name\":\"Hoja Mustaffa Abdul Latheef\",\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/#\\\/schema\\\/person\\\/e6fbd54c2061674d8ea3e7861d858c7b\"},\"headline\":\"Subagents for big upgrades: scouts, workers and a reviewer\",\"datePublished\":\"2026-11-06T15:00:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/subagents-for-big-upgrades-scouts-workers-and-a-reviewer\\\/\"},\"wordCount\":934,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/#\\\/schema\\\/person\\\/e6fbd54c2061674d8ea3e7861d858c7b\"},\"image\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/subagents-for-big-upgrades-scouts-workers-and-a-reviewer\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/hoja.in\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/subagents-for-big-upgrades-scouts-workers-and-a-reviewer.jpg\",\"keywords\":[\"AI agents\",\"Claude Code\",\"Code review\",\"TYPO3\",\"Upgrades\"],\"articleSection\":[\"AI engineering\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/hoja.in\\\/blog\\\/subagents-for-big-upgrades-scouts-workers-and-a-reviewer\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/subagents-for-big-upgrades-scouts-workers-and-a-reviewer\\\/\",\"url\":\"https:\\\/\\\/hoja.in\\\/blog\\\/subagents-for-big-upgrades-scouts-workers-and-a-reviewer\\\/\",\"name\":\"Claude Code subagents for big TYPO3 upgrades\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/subagents-for-big-upgrades-scouts-workers-and-a-reviewer\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/subagents-for-big-upgrades-scouts-workers-and-a-reviewer\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/hoja.in\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/subagents-for-big-upgrades-scouts-workers-and-a-reviewer.jpg\",\"datePublished\":\"2026-11-06T15:00:00+00:00\",\"description\":\"Using Claude Code subagents for TYPO3 upgrades: read-only scouts in parallel, workers with disjoint file sets and a reviewer at every hop.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/subagents-for-big-upgrades-scouts-workers-and-a-reviewer\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/hoja.in\\\/blog\\\/subagents-for-big-upgrades-scouts-workers-and-a-reviewer\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/subagents-for-big-upgrades-scouts-workers-and-a-reviewer\\\/#primaryimage\",\"url\":\"https:\\\/\\\/hoja.in\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/subagents-for-big-upgrades-scouts-workers-and-a-reviewer.jpg\",\"contentUrl\":\"https:\\\/\\\/hoja.in\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/subagents-for-big-upgrades-scouts-workers-and-a-reviewer.jpg\",\"width\":1200,\"height\":630,\"caption\":\"Scouts, workers and a reviewer\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/subagents-for-big-upgrades-scouts-workers-and-a-reviewer\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/hoja.in\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Subagents for big upgrades: scouts, workers and a reviewer\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/hoja.in\\\/blog\\\/\",\"name\":\"Hoja Mustaffa Abdul Latheef \u2013 Blog\",\"description\":\"Notes from daily work with TYPO3, PHP and AI-assisted engineering\",\"publisher\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/#\\\/schema\\\/person\\\/e6fbd54c2061674d8ea3e7861d858c7b\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/hoja.in\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/#\\\/schema\\\/person\\\/e6fbd54c2061674d8ea3e7861d858c7b\",\"name\":\"Hoja Mustaffa Abdul Latheef\",\"logo\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/#\\\/schema\\\/person\\\/image\\\/\"},\"description\":\"Senior TYPO3 Developer at jweiland.net, TYPO3 CMS Certified Developer. I write about TYPO3 upgrades, extension development, PHP and AI-assisted engineering with Claude Code.\",\"sameAs\":[\"https:\\\/\\\/hoja.in\\\/\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Claude Code subagents for big TYPO3 upgrades","description":"Using Claude Code subagents for TYPO3 upgrades: read-only scouts in parallel, workers with disjoint file sets and a reviewer at every hop.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/hoja.in\/blog\/subagents-for-big-upgrades-scouts-workers-and-a-reviewer\/","og_locale":"en_US","og_type":"article","og_title":"Claude Code subagents for big TYPO3 upgrades","og_description":"Using Claude Code subagents for TYPO3 upgrades: read-only scouts in parallel, workers with disjoint file sets and a reviewer at every hop.","og_url":"https:\/\/hoja.in\/blog\/subagents-for-big-upgrades-scouts-workers-and-a-reviewer\/","og_site_name":"Hoja Mustaffa Abdul Latheef \u2013 Blog","article_published_time":"2026-11-06T15:00:00+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/hoja.in\/blog\/wp-content\/uploads\/2026\/10\/subagents-for-big-upgrades-scouts-workers-and-a-reviewer.jpg","type":"image\/jpeg"}],"author":"Hoja Mustaffa Abdul Latheef","twitter_card":"summary_large_image","twitter_creator":"@hojaonline","twitter_site":"@hojaonline","twitter_misc":{"Written by":"Hoja Mustaffa Abdul Latheef","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/hoja.in\/blog\/subagents-for-big-upgrades-scouts-workers-and-a-reviewer\/#article","isPartOf":{"@id":"https:\/\/hoja.in\/blog\/subagents-for-big-upgrades-scouts-workers-and-a-reviewer\/"},"author":{"name":"Hoja Mustaffa Abdul Latheef","@id":"https:\/\/hoja.in\/blog\/#\/schema\/person\/e6fbd54c2061674d8ea3e7861d858c7b"},"headline":"Subagents for big upgrades: scouts, workers and a reviewer","datePublished":"2026-11-06T15:00:00+00:00","mainEntityOfPage":{"@id":"https:\/\/hoja.in\/blog\/subagents-for-big-upgrades-scouts-workers-and-a-reviewer\/"},"wordCount":934,"commentCount":0,"publisher":{"@id":"https:\/\/hoja.in\/blog\/#\/schema\/person\/e6fbd54c2061674d8ea3e7861d858c7b"},"image":{"@id":"https:\/\/hoja.in\/blog\/subagents-for-big-upgrades-scouts-workers-and-a-reviewer\/#primaryimage"},"thumbnailUrl":"https:\/\/hoja.in\/blog\/wp-content\/uploads\/2026\/10\/subagents-for-big-upgrades-scouts-workers-and-a-reviewer.jpg","keywords":["AI agents","Claude Code","Code review","TYPO3","Upgrades"],"articleSection":["AI engineering"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/hoja.in\/blog\/subagents-for-big-upgrades-scouts-workers-and-a-reviewer\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/hoja.in\/blog\/subagents-for-big-upgrades-scouts-workers-and-a-reviewer\/","url":"https:\/\/hoja.in\/blog\/subagents-for-big-upgrades-scouts-workers-and-a-reviewer\/","name":"Claude Code subagents for big TYPO3 upgrades","isPartOf":{"@id":"https:\/\/hoja.in\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/hoja.in\/blog\/subagents-for-big-upgrades-scouts-workers-and-a-reviewer\/#primaryimage"},"image":{"@id":"https:\/\/hoja.in\/blog\/subagents-for-big-upgrades-scouts-workers-and-a-reviewer\/#primaryimage"},"thumbnailUrl":"https:\/\/hoja.in\/blog\/wp-content\/uploads\/2026\/10\/subagents-for-big-upgrades-scouts-workers-and-a-reviewer.jpg","datePublished":"2026-11-06T15:00:00+00:00","description":"Using Claude Code subagents for TYPO3 upgrades: read-only scouts in parallel, workers with disjoint file sets and a reviewer at every hop.","breadcrumb":{"@id":"https:\/\/hoja.in\/blog\/subagents-for-big-upgrades-scouts-workers-and-a-reviewer\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/hoja.in\/blog\/subagents-for-big-upgrades-scouts-workers-and-a-reviewer\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/hoja.in\/blog\/subagents-for-big-upgrades-scouts-workers-and-a-reviewer\/#primaryimage","url":"https:\/\/hoja.in\/blog\/wp-content\/uploads\/2026\/10\/subagents-for-big-upgrades-scouts-workers-and-a-reviewer.jpg","contentUrl":"https:\/\/hoja.in\/blog\/wp-content\/uploads\/2026\/10\/subagents-for-big-upgrades-scouts-workers-and-a-reviewer.jpg","width":1200,"height":630,"caption":"Scouts, workers and a reviewer"},{"@type":"BreadcrumbList","@id":"https:\/\/hoja.in\/blog\/subagents-for-big-upgrades-scouts-workers-and-a-reviewer\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/hoja.in\/blog\/"},{"@type":"ListItem","position":2,"name":"Subagents for big upgrades: scouts, workers and a reviewer"}]},{"@type":"WebSite","@id":"https:\/\/hoja.in\/blog\/#website","url":"https:\/\/hoja.in\/blog\/","name":"Hoja Mustaffa Abdul Latheef \u2013 Blog","description":"Notes from daily work with TYPO3, PHP and AI-assisted engineering","publisher":{"@id":"https:\/\/hoja.in\/blog\/#\/schema\/person\/e6fbd54c2061674d8ea3e7861d858c7b"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/hoja.in\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/hoja.in\/blog\/#\/schema\/person\/e6fbd54c2061674d8ea3e7861d858c7b","name":"Hoja Mustaffa Abdul Latheef","logo":{"@id":"https:\/\/hoja.in\/blog\/#\/schema\/person\/image\/"},"description":"Senior TYPO3 Developer at jweiland.net, TYPO3 CMS Certified Developer. I write about TYPO3 upgrades, extension development, PHP and AI-assisted engineering with Claude Code.","sameAs":["https:\/\/hoja.in\/"]}]}},"_links":{"self":[{"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/posts\/144","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/comments?post=144"}],"version-history":[{"count":1,"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/posts\/144\/revisions"}],"predecessor-version":[{"id":150,"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/posts\/144\/revisions\/150"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/media\/145"}],"wp:attachment":[{"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/media?parent=144"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/categories?post=144"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/tags?post=144"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}