AI & Agents

Agents that are readable, reliable and worth shipping.

A practical blueprint for modern agentic systems: crisp interfaces, safer workflows, faster iteration loops, and a clear direction for the team building them. Proven on five live products built with AI in the loop, and tested first in the Lab.

AI-assisted engineering in practice

AI increases engineering velocity. Engineering discipline makes the result production-worthy.

The flagship example is AssetCare, a Java 25, Spring Boot 4.1 and Angular 22 application taken from architecture to a live Kubernetes deployment at assetcare.janaka.me. This is the workflow rather than a slogan: what the assistant did, what the engineer kept, and how the two are kept honest.

Rules first

The repository carries a short CLAUDE.md with the non-negotiables (dependency direction, migrations as changesets, archive not delete, an audit event per write, Problem Details, authorization as a policy, no secrets in Git) and project skills for the common changes. The assistant works inside those rules from the first prompt.

Generate and review

Options drafted against the model and cut down by hand; adapter and test code generated in small units and read before it is kept. Nothing is merged that I cannot explain line by line.

Verify by machine

An ArchUnit test enforces the architecture, Testcontainers prove the migrations, Playwright runs against the production image, CI scans, signs and rehearses the restore. The assistant's output has to pass the same gates as mine.

Decide and record

Every decision that constrains the future is an ADR with the options that lost. The verification report marks a check as passed only when it was run. The engineer signs both.

AI-assisted, on AssetCare

  • Architectural exploration: identity, persistence, state management and storage options, before the ADRs were written.
  • Code generation inside the written rules: use cases, adapters, DTOs, tests, the Angular screens.
  • Debugging and migration analysis: Spring Boot 4.1 start-up failures, an inject() after await, a lazy-association failure, Keycloak's iss parameter in the URL.
  • Kubernetes and deployment investigation: an iptables rule that failed on Hetzner's image, a Helm wait that hung on an unbound volume, a compose race.
  • Test generation, documentation and infrastructure iteration: the beginner's setup guide, the runbook, the health script, Terraform for the second cloud, dashboards and alert rules.
  • Operational diagnostics: reading logs and probe output together, faster than an evening with search results.

Engineering responsibility, kept

  • Architecture: one modular service, PostgreSQL, Keycloak, K3s on one server, and the documented seams to an enterprise platform.
  • Security: the threat model, the authorization model, the header policy, pinning Tomcat for three critical CVEs, rotating development passwords before the demo went public.
  • Trade-offs: leaving a free cloud that could not deliver a VM and paying a few euros a month for one that could.
  • Validation and verification: running every check, marking the rest as not executed, confirming the 401 and the certificate from outside.
  • Production decisions and deployment: what the ingress exposes, when to tag a release, what a public demo account may do.

The full account in the case study →  ·  The engineering article →

Applied

Five products, built with AI in the loop.

The practice on this page is not theoretical. Beyond AssetCare, five privacy-first web apps went from blank page to public URL by one engineer, with large language models used deliberately at every step and every line reviewed by hand. They are live, in use, and available for acquisition or licensing.

Specify

Product scope and interaction flows drafted against a model, then cut back by hand until only what earns its place remains.

Build and review

Implementation in tight generate-and-review loops with Claude Code and OpenAI Codex. I stay the architect and the reviewer; nothing ships that I cannot explain line by line.

Write and design

Interface copy in two languages and the visual identity of all five apps, produced with AI assistance and edited to one consistent voice.

Ship and hold the bar

Weeks, not quarters, with no team and no budget. The same standard as regulated banking work: move fast with the model, then hold the result to what the domain demands.

The same discipline, for hire or for sale.

The products are the evidence. The catalogue has the specs, the flows and the handover package; the Lab has the experiments the patterns came from.

Three directions

Where the work is heading.

01 · Product

AI-first experience

Interfaces that communicate confidence: a clear next action, instant feedback, and visible progress through every workflow.

02 · Engineering

Capability-driven architecture

Model every action as a typed capability, then add policy checks, structured logs and a rollback path before it reaches production.

03 · Team

Momentum loops

Weekly wins, monthly demos and a KPI dashboard people actually read — enough rhythm to keep delivery meaningful.

Blueprint

An MCP-enabled agent skeleton.

A starter pattern for robust orchestration over the Model Context Protocol (MCP): explicit tool capabilities discovered from MCP servers, strict I/O contracts and policy-aware handlers. It grew out of the Job-Research Agent in the Lab. The complete treatment, protocol to production with a verified Java, Spring AI and Python server, is the Academy guide MCP end to end. The runnable version is the MCP agent skeleton, a small Python stdio client with a tool router and an agent loop; the background is in MCP for agent integrations.

const capabilities = [
  {
    name: 'searchDocs',
    description: 'Search company knowledge base',
    parameters: { query: 'string' }
  },
  {
    name: 'createTicket',
    description: 'Create support ticket',
    parameters: { title: 'string', body: 'string' }
  }
];

const agentPrompt = `
You can call: searchDocs, createTicket.
Prefer searchDocs for evidence, createTicket on explicit request.
Return strict JSON payload for selected capability.
`;

1 · Capability list

Each operation is an MCP tool: explicit, typed and discoverable through the server's tools/list, so both the developer and the model know what a valid action looks like.

2 · Prompt policy

The prompt sets selection rules and output structure, which is what removes the ambiguity that unsafe behaviour hides in.

3 · Strict output

A strict JSON payload makes downstream execution predictable and cheap to validate.

Production patterns

  • RAG + verification — ground every answer in trusted internal context, and verify the assumption before acting on it. Worked example: the FAISS chatbot in the Lab.
  • DLQ + guardrails — route malformed output to a dead-letter queue with triage and alerting.
  • Streaming UX — show partial responses and phase-level progress on anything long-running.
  • Observability — traces, metrics, prompt versions and a feedback loop, or quality gaps stay invisible.

Research tracker

  • Weekly signal scan — collect three to five updates that actually matter.
  • Score by impact — rank on relevance, maturity and return.
  • Monthly synthesis — turn the reading into one focused implementation.
  • Quarterly reset — drop the noise and sharpen the roadmap themes.

See research/trend-map-2026.md · implementations land in the Lab

Roadmap

Where 2026 is going.

Tier 1 · now

Reliability, evals and observability, multimodal in production, retrieval quality, safety engineering.

Tier 2 · next

Open-model optimisation, coding agents, and standards for enterprise agent platforms.

Tier 3 · explore

Embodied systems, AI for science, and the regulatory and economic shifts around both.

From experiment to product

Where this page sits.

Build something meaningful this week.

Pick one trend, one workflow and one measurable outcome. Progress beats perfection.

Open the Lab →