<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
  <title>Tero's blog</title>
  <link>https://terolaitinen.fi</link>
  <description>Personal technical blog by Tero Laitinen. Articles on software engineering, architecture, and technology.</description>
  <language>en</language>
  <lastBuildDate>Sun, 10 May 2026 09:44:12 GMT</lastBuildDate>
  <atom:link href="https://terolaitinen.fi/feed.xml" rel="self" type="application/rss+xml"/>
  
  <item>
    <title>Agentic Software Project Estimation</title>
    <link>https://terolaitinen.fi/agentic-software-project-estimation</link>
    <guid isPermaLink="true">https://terolaitinen.fi/agentic-software-project-estimation</guid>
    <pubDate>Sun, 10 May 2026 00:00:00 GMT</pubDate>
    <description>Software project estimation usually asks a practical question: how much work remains before a defined completion state is reached? Agentic workflows can improve the answer by making estimation assumptions explicit, attaching size estimates to trackable work units, projecting those estimates into calendar dates, and feeding delivery outcomes back into future estimation guidance. The central opportunity is not that agents can guess better than people. It is that agents can help make estimation more repeatable, inspectable, reviewable, and correctable in large organizations with complex requirements, legacy systems, and cross-team dependencies.</description>
    <category>ai-agents</category>
    <category>project-management</category>
    <category>software-estimation</category>
  </item>
  <item>
    <title>Incremental Datalog Conflict Detection with OPAM Metadata</title>
    <link>https://terolaitinen.fi/incremental-datalog-conflict-detection-with-opam-metadata</link>
    <guid isPermaLink="true">https://terolaitinen.fi/incremental-datalog-conflict-detection-with-opam-metadata</guid>
    <pubDate>Sat, 09 May 2026 00:00:00 GMT</pubDate>
    <description>Conflict detection for requirements needs a formal substrate that can update after small repository changes without rechecking the whole repository. This post proposes a restricted Datalog model, uses OPAM package metadata as a concrete benchmark, and reports a FlowLog run where incremental commits took 0.89 ms at p50 while batch recomputation took 783.6 ms at p50 over the same 30-commit window.</description>
    <category>requirements-engineering</category>
    <category>formal-methods</category>
    <category>performance</category>
  </item>
  <item>
    <title>Higher-Order Agentic Loops</title>
    <link>https://terolaitinen.fi/higher-order-agentic-loops</link>
    <guid isPermaLink="true">https://terolaitinen.fi/higher-order-agentic-loops</guid>
    <pubDate>Fri, 08 May 2026 00:00:00 GMT</pubDate>
    <description>An agent loop is usually described as a practical control pattern: execute, observe, validate, revise, repeat. That framing is useful for building systems, but it hides a more basic question. If one agent loop can inspect and steer another agent loop, and another loop can inspect and steer that steering loop, do we get a genuine hierarchy of problem-solving power?</description>
    <category>ai-agents</category>
    <category>formal-methods</category>
  </item>
  <item>
    <title>Agent-Assisted Inconsistency Resolution for Monorepos</title>
    <link>https://terolaitinen.fi/agent-assisted-inconsistency-resolution-for-monorepos</link>
    <guid isPermaLink="true">https://terolaitinen.fi/agent-assisted-inconsistency-resolution-for-monorepos</guid>
    <pubDate>Thu, 07 May 2026 00:00:00 GMT</pubDate>
    <description>Large repositories need continuous semantic maintenance. A practical inconsistency resolver would treat a Git monorepo as a versioned knowledge base, use deterministic checks where possible, spend bounded agentic and formal-reasoning budget on high-value candidate artifact groups, and open reviewable pull requests that repair drift across code, tests, documentation, schemas, configuration, and mirrored external systems.</description>
    <category>ai-agents</category>
    <category>requirements-engineering</category>
    <category>monorepos</category>
    <category>automation</category>
  </item>
  <item>
    <title>Agentic Side Project Setup</title>
    <link>https://terolaitinen.fi/agentic-side-project-setup</link>
    <guid isPermaLink="true">https://terolaitinen.fi/agentic-side-project-setup</guid>
    <pubDate>Wed, 06 May 2026 00:00:00 GMT</pubDate>
    <description>This is a work-in-progress side-project setup for me, at most 4 worker hosts, 1 public box, and 1 monorepo. The aim is to maximize AI subscription usage and hardware usage while minimizing my oversight.</description>
    <category>ai-agents</category>
    <category>automation</category>
    <category>github-actions</category>
  </item>
  <item>
    <title>Building Your Own Agent Orchestrator</title>
    <link>https://terolaitinen.fi/building-your-own-agent-orchestator</link>
    <guid isPermaLink="true">https://terolaitinen.fi/building-your-own-agent-orchestator</guid>
    <pubDate>Fri, 01 May 2026 00:00:00 GMT</pubDate>
    <description>I finally set aside some time to experiment with agent orchestrators. It turns out that building one tuned to your workflow is straightforward. The agent drafts its own orchestration skill, you run it, flag what falls short, and it iterates. The result fits your repositories, build system, and other constraints including budget. You may start from scratch or fork an existing orchestrator.</description>
    <category>ai-agents</category>
    <category>automation</category>
  </item>
  <item>
    <title>Vibe Coding Experiments with Opus 4.6 and Codex 5.3</title>
    <link>https://terolaitinen.fi/vibe-coding-experiments-with-opus-4-6-and-codex-5-3</link>
    <guid isPermaLink="true">https://terolaitinen.fi/vibe-coding-experiments-with-opus-4-6-and-codex-5-3</guid>
    <pubDate>Tue, 24 Feb 2026 00:00:00 GMT</pubDate>
    <description>I&apos;ve used coding agents extensively at work, but until recently I hadn&apos;t tried building anything usable from scratch with them outside work. Opus 4.6 and GPT-5.3-Codex have both been impressive, so I thought I&apos;d see how they perform on greenfield projects. At work, code reviews are mandatory. Personal experiments have leaner quality standards.</description>
    <category>ai-agents</category>
    <category>deployment</category>
    <category>prototyping</category>
  </item>
  <item>
    <title>Isolated Web-Based Rapid Prototyping Sandbox with Mock Service Worker</title>
    <link>https://terolaitinen.fi/isolated-web-based-rapid-prototyping-sandbox-with-mock-service-worker</link>
    <guid isPermaLink="true">https://terolaitinen.fi/isolated-web-based-rapid-prototyping-sandbox-with-mock-service-worker</guid>
    <pubDate>Mon, 28 Jul 2025 00:00:00 GMT</pubDate>
    <description>Rapid prototyping is effective for requirements discovery and alignment, allowing stakeholders with complementary expertise to explore how an aspect of a new product or an improvement to an existing one works in practice. Prototypes can also serve as partial reference implementations, encoding a meaningful subset of requirements in an unambiguous way.</description>
    <category>ai-agents</category>
    <category>requirements-engineering</category>
    <category>prototyping</category>
  </item>
  <item>
    <title>Cursor-Assisted Requirements Engineering: Unifying Google Docs, Slack, JIRA, Confluence and Submodules Into Cross-Linked Markdown</title>
    <link>https://terolaitinen.fi/requirements-engineering-with-cursor-from-google-docs-slack-convos-jira-confluence-and-submodules-into-cross-linked-markdown</link>
    <guid isPermaLink="true">https://terolaitinen.fi/requirements-engineering-with-cursor-from-google-docs-slack-convos-jira-confluence-and-submodules-into-cross-linked-markdown</guid>
    <pubDate>Sun, 06 Jul 2025 00:00:00 GMT</pubDate>
    <description>Tracking software requirements and communicating effectively with all stakeholders when information is scattered across multiple systems like Slack, Google Docs, JIRA, Confluence, GitHub, and elsewhere can be challenging. While I wait for the industry to solve this, I experiment with makeshift solutions. My current workflow uses Cursor as the central hub. It operates on a requirements-focused GitHub repository that consolidates the relevant software-focused repos as submodules, copies of Slack threads, and Google Docs. I then use MCP to sync the remaining information.</description>
    <category>ai-agents</category>
    <category>requirements-engineering</category>
    <category>monorepos</category>
  </item>
  <item>
    <title>Software Requirements Engineering with Human-Level AI</title>
    <link>https://terolaitinen.fi/software-requirements-engineering-with-human-level-ai</link>
    <guid isPermaLink="true">https://terolaitinen.fi/software-requirements-engineering-with-human-level-ai</guid>
    <pubDate>Sat, 21 Jun 2025 00:00:00 GMT</pubDate>
    <description>AI models increasingly cover the how of building software products, reshaping the role of software engineers. The ongoing shift may simply result in yet another abstraction layer while still requiring a “software engineer” to guide the implementation. Alternatively, the responsibilities of product managers and software engineers could gradually converge. In the latter case, a deep understanding of technology is still relevant, but most of the remaining work consists of understanding where software can add value and capturing the requirements with sufficient clarity and detail so that the AI models can derive the implementation from them.</description>
    <category>ai-agents</category>
    <category>requirements-engineering</category>
    <category>product-development</category>
  </item>
  <item>
    <title>Migrating Blog to GitHub Pages with Claude Code Pro</title>
    <link>https://terolaitinen.fi/migrating-blog-to-github-pages-with-claude-code</link>
    <guid isPermaLink="true">https://terolaitinen.fi/migrating-blog-to-github-pages-with-claude-code</guid>
    <pubDate>Wed, 11 Jun 2025 00:00:00 GMT</pubDate>
    <description>I migrated this website from self-hosted Ghost to GitHub Pages using Claude Code Pro. The process took a few hours.</description>
    <category>ai-agents</category>
  </item>
  <item>
    <title>Speccing AI-assisted Software Requirements Engineering</title>
    <link>https://terolaitinen.fi/speccing-ai-assisted-software-requirements-engineering</link>
    <guid isPermaLink="true">https://terolaitinen.fi/speccing-ai-assisted-software-requirements-engineering</guid>
    <pubDate>Thu, 13 Mar 2025 00:00:00 GMT</pubDate>
    <description>Answering questions on how a product with many software components should work can be challenging. The software may have been written by countless developers over a long period of time, and many may no longer be available for consultation. In principle, maintaining a formal and complete specification separate from the implementation would help in understanding the product’s intended behavior. In practice, such rigor requires an engineering budget and expertise that may be available only when developing safety- or security-critical systems. Additionally, studying a formal specification for a complex system to verify if the implementation conforms to it or to propose a modification can be time-consuming and error-prone.</description>
    <category>ai-agents</category>
    <category>requirements-engineering</category>
    <category>product-development</category>
  </item>
  <item>
    <title>Validating React Context Usage by Prop Drilling Opaque Tag Types</title>
    <link>https://terolaitinen.fi/validating-react-context-usage-by-prop-drilling-opaque-tag-types</link>
    <guid isPermaLink="true">https://terolaitinen.fi/validating-react-context-usage-by-prop-drilling-opaque-tag-types</guid>
    <pubDate>Sun, 28 Jul 2024 00:00:00 GMT</pubDate>
    <description>React context allows data to be passed to nested components outside props, reducing the need for prop drilling. Type checker can validate that a component passes correct values in a child component’s props. However, a component’s type signature does not expose the contexts it taps with useContext. Context-using hooks can be injected in props, making data access explicit and type-checkable. With dependency injection, type signatures in props are complete, allowing alternative implementations in different call sites, such as tests and component explorer configurations. If such customizability is unnecessary, it is enough to pass an opaque tag type that encodes which contexts are available, reducing some boilerplate code compared to dependency injection.</description>
    <category>react</category>
    <category>typescript</category>
    <category>frontend-architecture</category>
    <category>type-systems</category>
  </item>
  <item>
    <title>Super Bomberman-Inspired Roblox Game: Part 1</title>
    <link>https://terolaitinen.fi/super-bomberman-inspired-roblox-game-part-1</link>
    <guid isPermaLink="true">https://terolaitinen.fi/super-bomberman-inspired-roblox-game-part-1</guid>
    <pubDate>Sat, 06 Jan 2024 00:00:00 GMT</pubDate>
    <description>This post continues the learning journal on game development, recording the first steps of working on a Super Bomberman-inspired game as I pivoted from Unity to Roblox Studio with zero experience.</description>
    
  </item>
  <item>
    <title>Minimal Physics-Based Multiplayer Unity Game</title>
    <link>https://terolaitinen.fi/minimal-physics-based-multiplayer-unity-game</link>
    <guid isPermaLink="true">https://terolaitinen.fi/minimal-physics-based-multiplayer-unity-game</guid>
    <pubDate>Sun, 30 Jul 2023 00:00:00 GMT</pubDate>
    <description>Unity is a capable proprietary game development environment and arguably the most sensible choice for many independent game developers. As the first part of a learning journal, this post describes implementing a minimal multiplayer 3d game with Unity involving physics. As a disclaimer, I’m a beginner with Unity and C#, so calibrate your expectations accordingly.</description>
    
  </item>
  <item>
    <title>Single-Server Deployments with Terraform, Docker Compose, and GitHub Actions</title>
    <link>https://terolaitinen.fi/deploying-with-terraform-docker-compose-and-github-actions</link>
    <guid isPermaLink="true">https://terolaitinen.fi/deploying-with-terraform-docker-compose-and-github-actions</guid>
    <pubDate>Sun, 30 Apr 2023 00:00:00 GMT</pubDate>
    <description>A single cloud server can affordably power a range of services. In many cases, the vertical scalability capabilities of a single host are enough to cover the needs of many business applications for years, if not indefinitely. Deploying on top of plain cloud servers requires more expertise and oversight and has different risks and costs than relying on popular PaaS offerings like Heroku. There are also tools like Dokku that facilitate deploying to a single server with a good developer experience. But let&apos;s assume that you don&apos;t want to use any of these, but prefer to build your deployment pipeline on top of lower-level building blocks like Terraform, an infrastructure provisioning tool, Docker Compose, a multi-container manager, and GitHub Actions, a CI/CD automation tool. This post shows one way to do that - ok, cheating a little by also relying on Docker Hub, S3, Route53, and Let&apos;s Encrypt for convenience, but still keeping recurring hosting costs minimal.</description>
    <category>deployment</category>
    <category>github-actions</category>
  </item>
  <item>
    <title>Automating Partitioned Table Migrations with GitHub Actions</title>
    <link>https://terolaitinen.fi/automating-partition-table-migrations-with-github-actions</link>
    <guid isPermaLink="true">https://terolaitinen.fi/automating-partition-table-migrations-with-github-actions</guid>
    <pubDate>Tue, 26 Jul 2022 00:00:00 GMT</pubDate>
    <description>PostgreSQL supports table partitioning, which splits rows into multiple partitions for improved query performance and easier bulk data transfers. Partitioned tables are useful when data are regularly inserted into a table and only recently added rows are selected in active operation. Older table partitions can be detached, archived, and finally dropped. Changes to database schemas in production systems should be managed with schema migrations, version-controlled, and incrementally applied SQL scripts. Repeated schema migrations should be automated to avoid errors, save engineering time, and ensure they are run. GitHub Actions is a CI/CD automation service that executes jobs according to workflow definitions. This post shows how to use GitHub Actions to regularly open pull requests that manage table partition migrations.</description>
    <category>automation</category>
    <category>github-actions</category>
  </item>
  <item>
    <title>React SSR Memory Consumption</title>
    <link>https://terolaitinen.fi/react-ssr-memory-consumption</link>
    <guid isPermaLink="true">https://terolaitinen.fi/react-ssr-memory-consumption</guid>
    <pubDate>Thu, 21 Jul 2022 00:00:00 GMT</pubDate>
    <description>Server-side rendering (SSR) can help improve core web vitals and is essential for SEO. React and node.js are often used to server-side render web pages. However, under high concurrency, rendering complex web pages may increase memory consumption and cause the application to crash if memory allocation fails. This post explores the following topics:</description>
    <category>react</category>
    <category>performance</category>
  </item>
  <item>
    <title>TypeScript Conditional Type Inference in Function Parameters</title>
    <link>https://terolaitinen.fi/typescript-conditional-type-inference-in-function-parameters</link>
    <guid isPermaLink="true">https://terolaitinen.fi/typescript-conditional-type-inference-in-function-parameters</guid>
    <pubDate>Tue, 19 Jul 2022 00:00:00 GMT</pubDate>
    <description>Conditional Types are type-level conditional expressions of the form:</description>
    <category>typescript</category>
    <category>type-systems</category>
  </item>
  <item>
    <title>Injecting Hooks Into React Components</title>
    <link>https://terolaitinen.fi/injecting-hooks-to-react-components</link>
    <guid isPermaLink="true">https://terolaitinen.fi/injecting-hooks-to-react-components</guid>
    <pubDate>Thu, 14 Jul 2022 00:00:00 GMT</pubDate>
    <description>Dependency Injection is a design pattern providing dependencies to a function (or class) in call sites rather than importing them directly in the implementation. Using the pattern it is easier to supply different implementations for dependencies depending on the call site (e.g., modular code reuse, tests, and component explorer). A loosely coupled codebase can be more maintainable. Hooks are used for writing stateful React components without introducing a class. This post explores three ways how to inject hooks to React components instead of importing them:</description>
    <category>react</category>
    <category>frontend-architecture</category>
  </item>
</channel>
</rss>