The Future of Physical AI Isn’t Smarter Robots, It’s Smarter Interfaces

This sponsored article is brought to you by Wetour Robotics.

A field technician on a wind turbine, harness clipped, both hands on a wrench, needs to send a command to the diagnostic device hanging at her belt. A logistics worker on a loading dock, gloves on, eyes on the pallet, needs to redirect a connected lift. A person using an assistive mobility device on a crowded street wants to nudge it forward without taking out a phone or speaking aloud. None of these moments call for a smarter robot. They call for a smarter way to be heard by the machines that already exist.

The industry has been building from one side

The past three years of Physical AI have been a story of remarkable progress on the robot side of the loop. Companies like Boston Dynamics, Figure, and Unitree have advanced actuators, locomotion, and dexterity to a level that would have seemed implausible a decade ago. Google DeepMind’s Gemini Robotics has redefined what vision-language-action models can do in unstructured settings. The trajectory of the hardware and the foundation models is real, and it is accelerating.

But there is another side to this loop, and it has been treated as a solved problem for too long. The interface between humans and machines has defaulted, for 40 years, to three input modalities: screens, buttons, and voice. Each of those assumes the user can stop, look down, and translate intent into structured commands. That assumption breaks the moment the work moves into a real environment. On a turbine. On a dock. On a sidewalk. In any setting where hands are occupied, eyes are committed, or speaking is impractical, the conventional interface stack quietly fails.

Spatial Intent Fusion is the simultaneous processing of three streams of human-centered information, namely spatial position, visual context, and gestural intent: Your body is the interface.

The bottleneck on the human side of the loop is becoming as important as the one on the machine side. And solving it requires a different question. Not how do we make the robot more capable, but how do we let the human participate in the computing system as naturally as the robot already does.

Wetour Robotics’ bet: put the human back into the computing loop

Wetour Robotics is betting that the next architectural leap in Physical AI is not about making the robot more capable. It is about making the human a first-class node in the computing network, with the same kind of low-latency, high-fidelity participation that connected devices already enjoy.

Wetour Robotics’ engineers frame the problem this way: a wristband that recognizes a gesture is not enough. A camera that recognizes a scene is not enough. The information a human carries about what they are about to do is distributed across multiple channels, including where their body is in space, what their eyes are attending to, and what their muscles are preparing to do, and any single channel observed in isolation is ambiguous. Reconstructing intent reliably means fusing those channels at the operating system level, with latency low enough that the loop feels closed rather than mediated.

This approach has a name. Wetour Robotics calls it Spatial Intent Fusion: the simultaneous processing of three streams of human-centered information, namely spatial position, visual context, and gestural intent, fused into a single real-time command for any connected physical device. It is the technical implementation behind a simpler positioning statement the company uses externally: your body is the interface.

Sleek silver rectangular electronic device labeled u201cORCHESTRAu201d on a light gray background. Orchestra is a portable intelligent hub running the operating system that handles sensor fusion, intent inference, command translation, and safety arbitration. The reference compute platform is NVIDIA Jetson Orin Nano Super, which provides enough on-device inference capacity to keep the entire control loop at the edge, with no cloud dependency on the critical path. Wetour Robotics

The architecture: three layers, four engines, one loop

Orchestra is not a single device but a layered platform, designed from the start to be sensor-flexible and actuator-agnostic. The architecture decomposes into three perception layers and four coordination engines.

Orchestra itself is the local compute and orchestration core: a portable intelligent hub running the operating system that handles sensor fusion, intent inference, command translation, and safety arbitration. The reference compute platform is NVIDIA Jetson Orin Nano Super, which provides enough on-device inference capacity to keep the entire control loop at the edge, with no cloud dependency on the critical path. Edge inference is non-negotiable for this application. Full-chain latency from biosignal acquisition to actuator command is held under 100 milliseconds, the envelope inside which closed-loop control feels natural rather than laggy.

VisionLink handles visual and spatial perception. Cameras feed into vision models that identify objects, estimate distances, and track environmental context. VisionLink is designed not as a passive recognition layer but as a real-time command generator: its outputs feed directly into Orchestra OS to be fused with biosignal data.

Conductor is the biosignal pipeline. It ingests raw surface electromyographic (sEMG) data from a wrist-worn device, classifies temporal patterns into discrete gestures or continuous control signals, and outputs actuator commands. The technically interesting property of sEMG for this use case is that the signal precedes visible motion. Motor unit action potentials appear at the skin surface roughly 50 to 80 milliseconds before a finger completes the corresponding gesture. Wetour Robotics calls this property pre-motion intent sensing, and it is what allows Orchestra to anticipate user intent rather than react to it.

On top of the three perception layers, Orchestra OS runs four coordination engines. The Perception Engine ingests and normalizes raw sensor streams. The Intent Engine performs Spatial Intent Fusion across modalities, resolving what the user is trying to do given where they are, what they are looking at, and what their hand is signaling. The Orchestration Engine translates intent into device-specific command sequences for any connected actuator. The Safety Engine arbitrates conflicting commands, enforces operational envelopes, and gates execution against runtime safety conditions.

Wetour Robotics

The trade-offs we’re honest about

No system that bridges the human body and the digital world is finished. Three engineering challenges remain open, and the company addresses each with a deliberate trade-off rather than a claim of having fully solved it.

Baseline stability of sEMG under motion. In a stationary user, continuous gesture recognition from sEMG is reliable. Once the user is walking, climbing, or otherwise moving, motion artifacts and electrode drift degrade the signal in ways that are difficult to fully compensate for. Rather than overpromise on continuous control in dynamic settings, Orchestra defaults to a smaller set of robust discrete gestures in complex operating environments, and reserves continuous control modes for contexts where the signal-to-noise ratio supports them.

Miniaturization of edge AI compute. Running the Orchestra control loop entirely at the edge requires real on-device inference, which has historically meant trading off between compute capacity, battery life, and form factor. Wetour Robotics’ approach has been a compact carrier board paired with a thermal design and a battery module sized for all-day wearability. The result is a hub that travels with the user rather than tethering them to a desk, and that performs the full perception-to-actuation loop without offloading to the cloud.

Heterogeneity of third-party device protocols. The actuator side of the loop is a fragmented landscape. Different manufacturers expose different command interfaces, different communication stacks, and different safety conventions, and a Physical AI operating system has to integrate with all of them. Wetour Robotics uses an AI-agent layer to negotiate connection and protocol translation adaptively, so that Orchestra OS can ingest data from a wide range of devices, run them through neural network models that infer human intent, and emit the right command on the right protocol for the device on the other end.

Why this matters, and why it helps the rest of the field

The history of computing is a history of interface revolutions. Command lines gave way to graphical user interfaces, which gave way to touch, which gave way to voice. Each transition expanded who could participate in the system and what they could do with it. The next transition is not about a new screen or a new microphone. It is about treating the human body itself as a participant in the computing network, capable of contributing intent at the same speed and fidelity that any other connected node can.

The history of computing is a history of interface revolutions. The next transition is not about a new screen or a new microphone — it is about treating the human body itself as a participant in the computing network.

This path is not a competitor to the work being done on humanoid robots, foundation models for embodied AI, and dexterous manipulation. It is the missing complement to that work. The hardest open problem for humanoid systems is the data: every natural interaction between a human and the physical world is a potential training signal, and most of those interactions are currently invisible to any computing system. As more humans become first-class nodes in the loop, those interactions become observable, structured, and ultimately useful for training the next generation of embodied AI, including the humanoid robots being developed today.

In other words: putting the human back into the computing loop is not just about better interfaces for individual users. It is about generating the kind of grounded, in-the-wild human-machine interaction data that the broader Physical AI ecosystem will need to keep advancing. The robot side and the human side of the loop are not two competing futures. They are two halves of the same one.

That is what Wetour Robotics means when it says: Your body is the interface.

Learn more at wetourrobotics.com.

Centralized Authentication for a Multi-Brand Laravel Ecosystem

We built a centralized authentication system for a multi-brand Laravel ecosystem operating across multiple niche industry platforms.
Previously, each application had its own authentication logic, which led to duplicated code, inconsistent login behavior, and slow onboarding when adding new applications to the network.
To solve this, we designed and developed a reusable Laravel SSO package (laraartisan/sso-client) distributed via Composer, allowing authentication to be unified across all applications in the ecosystem.

Why Single Sign-On (SSO) Was Critical
SSO became a key architectural requirement because it:
Removes the need for users to log in separately across multiple applications
Centralizes authentication and session handling in one secure layer
Reduces security risks caused by duplicated authentication logic
Ensures consistent login behavior across all connected systems
Makes onboarding of new applications significantly faster
Instead of maintaining authentication separately in each application, all identity flows now pass through a single, controlled authentication system.

Key Improvements
Unified SSO system across all applications
Environment-based configuration (no hardcoded values)
Plug-and-play integration via Composer
Flexible user mapping per application
Consistent authentication experience across the ecosystem

Impact
New applications can now be onboarded in ~15 minutes
Authentication logic is managed in a single place
Security updates propagate instantly across all systems
Significant reduction in duplicated code
Improved scalability for future expansion of the ecosystem

Tech Stack
Laravel 10/11/12 · PHP 8.2+ · Composer · Blade Components

If you’re managing multiple applications and still duplicating authentication logic across systems, moving to a centralized SSO architecture is a major step toward scalability, security, and long-term maintainability.

How I made a perfect recording button. Simple yet complex thing.

Startup Pipeline Image

Intro

From the start of XSpeak, I wanted it to provide the best possible feel for the user: simple, fast, and responsive. Since it’s a recording app, one of its main components is the button the user presses to record a conversation.

Actually, it’s a control we’re used to in many apps. The simplest example is the standard Voice Memos app on iPhone.

The button looks simple and does two things: starts recording and stops recording. However, behind the scenes, it takes many steps to start the whole pipeline, which is far from simple. In this article, I’m going to cover the technical and usability aspects of a recording button and will try to explain why it’s important to make it work perfectly and why it’s not as simple as it might look.

XSpeak is a fully private app that takes meeting notes live during conversation and helps you in real-time using on-device AI by providing suggestions, relevant context, facts and more as you speak.

Perfect button

I’d call the recording button perfect if it is:

  1. Functional
  2. Responsive

When I say functional, I mean that it should be able to start and stop recording when it’s enabled and I press it. The button should indicate that the state has switched. And for such an operation that usually takes hundreds of milliseconds, that feedback should be immediate.

Let’s imagine that feedback is not immediate and there’s some progress between states. In this case, the user:

  • Has to wait to make sure that recording has actually started.
  • Is out of their natural flow. Instead of focusing on their business, they are monitoring the app’s status.
  • Experiences unnecessary cognitive load as a result: “What just happened? Did it start? How long should I wait?”
  • Loses control over the interface. They cannot correct the error and press stop.
  • Feels slight frustration, as the app temporarily prevents them from doing what they want to do.
  • Misses the instant, tactile feedback expected from a tool.

This discomfort might feel minor for some people. However, when the user does it so many times a day, it might add significant overhead. And that’s not what we should expect from a helping tool.

Two qualities define a perfect recording button: it must be functional and responsive. The press should never wait on the pipeline.

Imperfect case:

  1. User presses a button.
  2. Button is disabled, shows a progress state or simply doesn’t react.
  3. After some time, the button is functional again, and recording is started.

Behind the scenes

Why is starting recording not that simple? When you press the button, the following happens in XSpeak:
Startup Pipeline Image

All these operations happen asynchronously. It means that we lose flow during each, and when we resume, the world could have changed: the user might have pressed the button several more times, previously available resources might have become unavailable, and so on.

Besides that, it launches side management threads that restart the mixer to prevent drift between two sources and restart the transcriber to prevent model context overflow.

Quite a start, isn’t it? Probably, after that, your perception of this simple button will change, sorry for that 🙂

Let’s see how different apps manage this or similar complexity.

iPhone Voice Memos

Voice Memos Button
iOS 26.5
Voice Memos Transition
When I press start, it starts. When I press stop, it stops. Nothing more.

Otter

Otter Button
Otter 1.4.2

Otter Transition

As you can see, the button becomes disabled while it starts recording. This makes me feel slightly uncomfortable every time I press it. I feel unresponsiveness and heaviness. And I need to wait before I can stop recording.

Talat

Talat Button

Talat 0.11.5

Talat Transition

The button is disabled while recording is started. The good thing is that the recording start is quite fast here. However, it still produces a tiny unresponsiveness feeling.

MacWhisper

MacWhisper Button
MacWhisper 13.21.1

MacWhisper Transition

There’s a slight delay between the press of the start button and the appearance of the stop button. Also, the button changes its position after I start recording, which requires additional cognitive effort from me to find it.

Fireflies

Fireflies Button
Fireflies 0.1.30

Fireflies Transition

The button is locked during start.

XSpeak

XSpeak Button

XSpeak 3.7

XSpeak Transition

As you can see, the button reacts instantly to user action. And if you change your mind, it reacts instantly back.

Apps Summary

Implementation

I’ll not write a book here about all the approaches I considered and tried. Instead, I’ll go from a naive approach to the solution I implemented.

Let’s agree that we want instant feedback from the button and will not disable it during our startup chain. Also, let’s declare our states:

Initial States

Each can be started or stopped. Our goal: keep them eventually consistent without ever blocking the user.

The naive approach would be when the user presses the button:

  1. Change S_ui to started.
  2. Launch startup pipeline.

However, the obvious problem would be a race condition. Imagine the following order of operations:

Race Condition Diagram

In the end, we have S_ui = stopped and S_real = started.

We have to linearize this pipeline to prevent such races. The first thing that would help is to prevent start and stop operations from running simultaneously. We’ll use a queue for that:

Queue Diagram

Operations run one at a time, in submission order. No two operations overlap.

We also need to introduce one more state:

One More State Image

When we want to start or stop recording, we submit an operation to the queue. This way no two operations overlap and each operation waits for its time. As a result, we always have S_ui equal to the S_op of the last operation.

However, this results in delayed work that doesn’t start immediately. We still want to give immediate feedback to the user. To achieve that, we’ll work with S_ui from MainActor and with S_real from Queue. This means that when we press the button, S_ui changes immediately, and the work is submitted afterward. The solution gives us the following challenges:

  1. When the actual queue operation starts, the world could have changed, and the operation might not be necessary anymore.
  2. If the queue grows, there might be significant delay. Imagine a situation when the button is pressed 100 times in a row. We’ll have 100 operations 0.5s each, resulting in 50 seconds of work.

The world could have changed during the time we waited for the operation to start. It means the user could have stopped the recording, started it again, or even in a corner case, done it several times. To determine if the operation still makes sense, we should compare each operation’s S_op with the current S_ui and S_real. If S_op is started and S_ui is stopped, we shouldn’t start anymore, so we just exit. The same is true when S_op is stopped, but S_ui is started. Additionally, if S_op already equals S_real, the work is already done, so we exit as well.

This means that the first and the earliest operation whose S_op equals the current S_ui and not equals S_real will perform the work. This change results in a significantly reduced delay between submission and actual work start.

There’s one more thing we should do to improve performance further. Imagine the following order of operations:

Delay Diagram

If the user presses stop when the start operation is already in progress, we have to wait until the start operation finishes. It results in unnecessary delay and extra work.

To resolve this, we’ll treat each suspension point where we schedule async work during our operation as a potential interruption point. After every step that awaits, we’ll check if the target S_ui is still the same. And if it changes, we’ll drop the operation and return.

However, when we change state, like starting physical microphone recording, things become more complex since we should revert that. But that’s already what the opposite operation will do. So for consistency, after any step that changes state, we must finish the operation and then the opposite operation will revert everything. In the end, we’ll have the desired S_real which is equal to S_ui.

Interruption Diagram

At every suspension point we re-check the target state. If it changed, we drop and return.

In practice, there are more complexities because sometimes we have non-standard user flows. But this architecture, where every audio manipulation goes through the queue, allows us to maintain a consistent and reliable state and gives us a good background to improve the app.

All product names, logos, and brands are property of their respective owners. Use of these names, logos, and brands does not imply endorsement.

990 beygirlik Xiaomi YU7 GT resmi olarak görücüye çıkarıldı

990 beygirlik Xiaomi YU7 GT resmi olarak görücüye çıkarıldı

990 beygirlik Xiaomi YU7 GT resmi olarak görücüye çıkarıldıİlk gösterimi Pekin Otomobil Fuarı kapsamında yapılan tamamen elektrikli SUV modeli Xiaomi YU7 GT, bugün resmi olarak görücüye çıkarıldı. Standart YU7’nin sportif versiyonu olan YU7 GT, Xiaomi’nin V8s EVO motorlarıyla toplam 738 kW (990 beygir) güç sunuyor. 0’dan 100 km/s hıza 2,9 saniyede ulaşan araç, en üstte 300 km/s hıza kadar çıkabiliyor. 101,7 kWh batarya ile donatılan YU7 GT, CLTC özelinde 705 km menzil vadediyor ve uygun şarj istasyonlarında 15 dakikada 570 km menzil kazanabiliyor. YU7 GT’de büyük boyutlu karbon-seramik diskler ile önde altı, arkada ise dört pistonlu yüksek performanslı Akebono kaliperlere yer veriliyor. 100 km/s hızda 32,9 metrelik durma mesafesi sunduğu söylenen YU7 GT, Xiaomi’nin iddiasına göre arka arkaya yapılan 10 farklı 180 km/s’lik tam duruşta bile performans kaybı yaşamıyor. İlk aşamada beş farklı renkte pazara sunulacak sportif SUV, geçtiğimiz hafta elde edilen 7:34.931’lik Nordschleife turuyla önemli bir rekor da kırmıştı. “Ren Zhoucan” tarafından kontrol edilen araç, Audi RS […]

990 beygirlik Xiaomi YU7 GT resmi olarak görücüye çıkarıldı yazısı ilk olarak Teknoloji haberleri – LOG üzerinde yayınlandı.

Mumbli – my personal Wispr Flow

My text-to-speech journey started roughly a year ago, when I tried it again and was impressed by how much faster it was than typing. I’d been fascinated by Churchill’s use of a stenographer, and I knew it was a more efficient way to write things given proper editor post-processing. I’d tried dictation earlier, about 5 years ago, but it didn’t work out – I tried using dictation and then sending it to people to transcribe, but it wasn’t successful.

A year ago, I tried Whisper models with Python Qt, and it was fine. I used that initial Qt application for some time, but it was a bit ugly and not too easy to use. I found another application for Mac, and used it for a while.

After a year of using it almost every day, I’ve learned how to speak freely without hesitation. It’s not perfect, but it’s much faster, and I’ve been able to produce a lot more. A friend told me about Wispr Flow, which had a nice UI with a small overlay and simple key bindings. Although I didn’t like the Electron application and the marketing, I picked the features I needed, like vocabulary, history of dictations, and key bindings.

That’s how I created Mumbli, and so far, it’s working well – I’m over 3300 transcriptions now. I can tweak it and try new things, like new GPT live transcription models.

The most useful part of owning the stack is that I can actually measure the pieces. Recently I benchmarked the latest 50 saved Mumbli recordings: 2,021 seconds of real dictation, with clips ranging from 0.3s to 293.8s. I ran the same recordings through a few STT providers and measured the time from “audio file is ready” to “transcript is back.”

Provider Model Success Median STT latency p95 latency Audio-judge wins
Groq Whisper whisper-large-v3-turbo 50/50 534ms 1,098ms 2
ElevenLabs Scribe scribe_v1 50/50 2,386ms 7,472ms 25
Interfaze STT interfaze-beta 50/50 8,383ms 13,584ms 6
Tie / skipped – – – – 16 ties, 1 skipped

So the technical result is not “Groq wins everything.” It is more specific: Groq was about 4.5x faster than ElevenLabs on median STT latency in this benchmark, and about 6.8x faster at p95. Compared to Interfaze it was much faster again. But ElevenLabs won the audio-judge comparison more often, so it still looks like the better quality default.

For my personal use, that split matters. Wispr Flow feels good partly because the interaction is tiny: hold a key, speak, release, get text. If the transcript comes back in half a second, the whole app feels different. It is the difference between “this is a transcription job running somewhere” and “this is close enough to typing latency that I keep using it.”

So the setup is not one fixed answer. I can keep a quality-oriented path, and I can keep a fast path. That was the part I wanted from the Wispr Flow-like experience: the tiny overlay and simple hotkeys, but with the ability to swap the engine when the numbers say something interesting.

I’ve put the benchmark notes in the documentation: https://docs.mumbli.app/benchmarks#benchmarks-mumbli-performance. You can also check out the GitHub page: https://github.com/fireharp/mumbli, and the main site: https://mumbli.app/. No huge value here, just a nice tinkering approach – it was pretty fast to do, pretty exciting, and I still use it.

Getting Paid Should Not Be a Geopolitical Nightmare: My NOWPayments Integration Story

The Problem We Were Actually Solving

I was tasked with integrating a payment gateway into our digital goods store, which catered to a global customer base. The challenge was that our company was based in a country with strict financial regulations, making it difficult to find a reliable payment processor. Many popular payment gateways had restrictions or outright bans on businesses from our region, which significantly limited our options. After researching various alternatives, we decided to explore NOWPayments, a crypto-based payment solution that claimed to have fewer geographical restrictions.

What We Tried First (And Why It Failed)

Initially, we attempted to use Stripe, a well-established payment gateway, but our application was rejected due to our company’s country of origin. We also tried to use PayPal, but their restrictions on our region made it impossible to receive payments. These rejections led us to consider more unconventional solutions, such as using a third-party payment aggregator or creating our own custom payment processing system. However, these alternatives introduced significant technical and financial risks, which we were not willing to take on. It was during this time that we discovered NOWPayments and decided to give it a try.

The Architecture Decision

After evaluating NOWPayments’ API documentation and testing their sandbox environment, we decided to integrate their solution into our digital goods store. The main tradeoff was that we had to adapt our store’s checkout process to accommodate the crypto-based payment flow, which added some complexity to our codebase. We used the NOWPayments API to generate payment invoices and handle transaction callbacks, which required careful error handling and logging to ensure reliable payment processing. We also had to implement a custom solution for handling cryptocurrency price volatility, as our store’s pricing was denominated in fiat currency.

What The Numbers Said After

The integration with NOWPayments took approximately six weeks to complete, including testing and deployment. Once live, we monitored the payment processing metrics closely, and the results were promising. Our payment success rate increased by 25% compared to the previous quarter, and we saw a significant reduction in failed transactions due to geographical restrictions. The average transaction processing time was around 2-3 seconds, which was acceptable for our use case. However, we did experience some issues with cryptocurrency price fluctuations, which affected our revenue by about 5% due to exchange rate discrepancies. To mitigate this, we implemented a pricing update mechanism that adjusted our store’s prices in real-time based on the current cryptocurrency exchange rates.

What I Would Do Differently

In hindsight, I would have liked to explore more alternative payment solutions before settling on NOWPayments. While their crypto-based approach worked for us, it introduced some complexity and risks that we had to carefully manage. If I had to do it again, I would consider using a more traditional payment gateway with a stronger presence in our region, even if it meant establishing a subsidiary company or partnering with a local business to facilitate payments. Additionally, I would prioritize implementing a more robust pricing update mechanism from the outset to minimize the impact of cryptocurrency price volatility on our revenue. The experience taught me that getting paid should not be a geopolitical nightmare, and there are often creative solutions to be found in the unlikeliest of places, such as crypto-based payment gateways like NOWPayments.

Four Layers of Validation in Kubernetes with Claude Code

Earlier this year, Moltbook, a social network for AI agents, launched, trended, and became a cautionary tale within the same week. Security researchers at Wiz found a Supabase API key sitting in its client-side JavaScript, which was the database’s only access control, with no Row Level Security to narrow what that key could reach. The result: 1.5 million API tokens, 35,000 email addresses, and thousands of private messages exposed to anyone with a browser console.

Moltbook was a greenfield project with no review process. The same class of mistake is far more serious when AI-generated code lands inside applications that already have pre-existing users, real data, and an existing trust surface. That’s increasingly the reality: as organizations adopt AI coding agents, more and more AI-generated code is landing directly in production services that already hold credentials and personal details of your users. A recent survey found that 95% of developers don’t fully trust AI-generated code, while only 48% consistently review it before committing, yet it’s shipping regardless.

Static review tools catch only some classes of issues: common CVEs, dependency hygiene, style violations, deterministic anti-patterns. What they can’t see are things like the actual name of your Kubernetes Secret in this cluster, whether your auth middleware is wired into the right route in this service, whether the request a real user will send makes it through the new code path without breaking something downstream.

Closing that gap takes four independent layers: AI agent skills that shape what gets generated, commands that audit what was generated, integration tests that hit staging endpoints, routing traffic to your local code, and preview environments that let a human review the change against staging dependencies before merging.

Layer 1: Skills (passive, shaping what gets generated)

Most AI coding assistants let you write down rules that shape generation. The simplest mechanism is a config file that the assistant loads into context on every prompt: .cursorrules in Cursor, CLAUDE.md in Claude Code, .github/copilot-instructions.md in GitHub Copilot. Drop NEVER/ALWAYS rules in there and the AI follows them. The downside is that those files load on every prompt, even when you’re working on something unrelated, and every rule you add costs tokens whether or not it’s relevant.

Claude Code goes a step further with skills: structured rule sets that ship as plugins (a directory with a SKILL.md and supporting reference files). Each skill has a description, and the model pulls a skill into context only when your prompt matches what that skill is meant to cover. If a skill never gets matched against the prompt, it never gets loaded, and you don’t pay for the tokens it would consume. We’ve already shipped six skills for AI agents working with mirrord, and this post adds a seventh focused on validation: k8s-validation, an open-source set of NEVER/ALWAYS rules for code that runs inside a Kubernetes cluster.

The skill covers two halves: the cluster-level concerns (Secrets, RBAC, pod hardening, NetworkPolicies, supply chain, file handling) and the application-level concerns that determine whether the workload behaves correctly inside the cluster (HTTP and parameter handling, auth, output sanitisation, API contracts, env-var configuration, test coverage).

Before and after

Without the skill, the model has no way of knowing about things like Kubernetes Secrets already mounted as environment variables in your pod, auth decorators other handlers in your service already use, or PII-sanitization utilities your team has already built. So it does the obvious thing: hardcodes the API key, skips the auth check, and returns the LLM output directly. With the skill loaded, the following prompt (“add a /summarise endpoint that calls OpenAI’s API”) produces something like this:

import os
from openai import OpenAI
from utils.sanitize import filter_pii

client = OpenAI(api_key=os.environ["OPENAI_API_KEY"])

@app.route('/summarise', methods=['POST'])
@require_auth
def summarise():
    text = request.json.get('text', '')
    response = client.chat.completions.create(
        model="gpt-4",
        messages=[{"role": "user", "content": f"Summarise: {text}"}],
    )
    summary = response.choices[0].message.content
    return jsonify({"summary": filter_pii(summary)})

filter_pii here is a stand-in for any utility that strips personally identifiable information (names, SSNs, emails, etc.) out of free text. Different teams build this differently; the Microsoft Presidio library is one of the more common open-source starting points.

Three differences from what the model would produce without the skill: the key comes from an environment variable backed by a Kubernetes Secret, the endpoint sits behind @require_auth, and the LLM output runs through filter_pii before going back to the user.

What skills can’t do

Skills shape generation, but they don’t verify anything.

In the example above, the AI correctly followed the skill: it read the API key from the environment, applied @require_auth, and called filter_pii from utils.sanitize. But the skill has no way to verify that filter_pii actually works. If the utility in your codebase only strips email addresses and misses phone numbers, the skill can’t know that. A user document containing a phone number sails straight through the filter and into the response, and the code looks correct at every layer the skill can see.

Skills set a floor by preventing the obvious structural mistakes. They’re instructions to a model, not checks against reality.

Layer 2: Commands (active, checking what was generated)

Where skills shape what the model generates, commands check what already exists. They’re explicitly invoked by a developer, an agent, or a CI step, and they run a defined set of checks against the code in front of them.

The same install from Layer 1 also ships a slash command: /k8s-validation:audit. It scans your codebase for the same NEVER/ALWAYS rules the skill enforces during generation, traces data flow through handlers and queries, and classifies each finding by severity. Skills don’t always load (a vague prompt, or a quick edit to a file the model didn’t classify as Kubernetes-adjacent, and the rules never enter context). The audit is the backstop: it runs on the code regardless of how the code got written.

> /k8s-validation:audit content-api/

CRITICAL 2 | HIGH 4 | MEDIUM 1 | INFO 0

[CRITICAL] src/routes/summarise.py: Hardcoded OpenAI API key → Use os.environ
[CRITICAL] src/routes/download.py: User filename in path without sanitization → Use secure_filename()
[HIGH]     src/routes/summarise.py: No authentication middleware → Add @require_auth
[HIGH]     k8s/deployment.yaml: No SecurityContext defined → Add runAsNonRoot, drop ALL
[HIGH]     src/routes/summarise.py: Reads OPENAI_API_KEY but no manifest defines it → Add to deployment.yaml env block
[HIGH]     src/routes/summarise.py: New endpoint with no integration test → Add test in tests/integration/

Note that the output mixes security findings (hardcoded key, missing SecurityContext) with correctness findings, meaning “does the code do what was asked, given the rest of the system” (the Kubernetes deployment manifest doesn’t define the env var the code reads; the new endpoint shipped without an integration test). Both halves matter for AI-generated code.

Because the audit is a command you run rather than a rule the model loads, the same invocation works in three places: a developer runs it before opening a PR, an agent runs it as part of its own loop after generating code, and CI runs it as a merge gate. You can wire it into one, two, or all three.

## Validation Workflow
After generating or modifying any Kubernetes-related code, run `/k8s-validation:audit`
on the changed files. If any CRITICAL findings exist, fix them before proceeding.

What commands can’t do

The audit is still static analysis. It can find “you hardcoded a secret” or “you’re missing a SecurityContext,” but it can’t tell you whether your filter_pii regex actually catches the PII your users will send, or whether the environment variable you’re reading will resolve to a value in your staging cluster. Commands check the shape of the code, not the behavior.

Layer 3: Integration tests (runtime, proving it works)

Your team probably already has integration tests that hit your API endpoints, check response shapes, and verify that authentication rejects bad credentials. These tests encode what “correct behavior” actually means for your application.

The bottleneck is running them. Locally, you mock your database, your auth service, your message queue, and hope the mocks match reality. In CI, each cycle takes 5 to 10 minutes. For a human pushing a few times a day, it’s already frustrating enough. For an AI agent trying to fix a failing test, it’s a feedback loop far too slow to learn from: the agent burns tokens on every iteration, and the integration bugs only surface after the change has been written, pushed, and built.

mirrord changes this equation by letting your local process stand in for a deployed pod. Your local code gets the environment variables from the target pod, the same cluster-level files it has access to, and the same view of internal services. In steal mode, traffic destined for the targeted pod is intercepted and routed to your local process instead of whatever’s deployed in staging. Your existing integration tests, pointed at staging endpoints as usual, now run against your local code in seconds, not minutes.

The same pattern scales horizontally. Because mirrord can split a single pod’s incoming traffic between many local processes using header-based filters, multiple agents (or developers) can iterate against the same staging cluster simultaneously, each one routing its own slice of the traffic to its own local code. One staging environment, many concurrent agents, real downstream services for all of them.

What this catches that the other layers can’t

Consider a prompt like “have /summarise fetch the document from our content-store service first.” The agent writes a handler that calls http://content-store/documents/{id} and reads response.json()["title"].

The catch: content-store moved to v2 months ago and now returns {"document": {"name": ..., "text": ...}}. The flat title/body shape only exists in the AI’s training data. Skills generated structurally clean code (good). The audit confirmed the call was made and the response was consumed (also good). Neither layer knows what shape content-store actually returns today.

The setup to fix this is two processes. You or your AI agent starts a mirrord session, your e2e tests run as normal against the staging content-api endpoint:

# Terminal 1, run your local content-api in place of the deployed pod
mirrord exec --target deploy/content-api --steal -- python -m content_api

# Terminal 2, run the existing integration suite against staging as usual
pytest tests/integration/test_summarise.py

When the test hits staging’s content-api endpoint, mirrord steals the request and reroutes it to your local process. The local handler calls http://content-store/documents/..., and that outbound call also routes through mirrord, hitting the real content-store in staging. The real service returns {"document": {"name": ..., "text": ...}}. The local code does response.json()["title"] and crashes with KeyError.

You fix the code to read the new shape, rerun the test, it passes. The bug surfaces in your local code, against real downstream services, in seconds, instead of after a deploy cycle. The same pattern works for any other dependency the code touches: environment variables from the pod, files from mounted volumes, database queries against the real Postgres. mirrord runs your code, the cluster supplies its real environment.

Layer 4: Human review in a real environment

When the agent opens the PR, a human should still get to see the change running in a real environment, not just read the diff. mirrord’s Preview environments make that easy: a GitHub Action spins up an isolated pod in your staging cluster running the PR’s code, connected to all the real downstream services, and scoped to that PR via an environment key.

Reviewers can click through the actual feature instead of inferring behavior from the code or having to run the whole application locally. Most of the failures the previous three layers don’t catch, UX regressions, surprising interactions, “looks right but feels wrong”, show up the first time a human uses the thing.

Putting it together: agents handle layers 1–3, humans handle layer 4

Layers 1 through 3 can be run by the agent itself. Instead of generating code, opening a PR, and hoping CI catches the issues, the agent generates code shaped by skills, runs /k8s-validation:audit to check for structural issues, runs the integration tests via mirrord against real infrastructure, and fixes any failures before committing. The agent doesn’t even have to write the test from scratch: Layer 1’s validation skill includes a rule that any new HTTP handler must come with an integration test, so the test gets generated alongside the endpoint. Layer 3 just runs it against real infrastructure.

Layer 4 is the handoff. Once the agent has passed its own checks, it opens a PR and a human gets a live preview environment to click through rather than a diff to infer from. The failures that surface at that stage, UX regressions, surprising interactions, things that look right but feel wrong are exactly the ones that didn’t show up in the previous three layers.

We’ve documented the concrete setup (per-service mirrord configs, helper scripts, and an AGENTS.md that tells the agent which script to run) in our mirrord with AI agents guide. The broader argument for why this matters, including the token cost of agents stuck in a feedback-less loop, is in How to prevent token burn using mirrord with e2e tests.

Adopting the layers

The four layers are independent. Pick the ones that close your biggest gap and add the others when the next failure teaches you what’s still missing.

Install the validation skill with /plugin install k8s-validation@metalbear-co/k8s-validation-plugin in Claude Code, or as a local rules directory for Cursor and GitHub Copilot (see the repo README). The /k8s-validation:audit command ships in the same install. For the runtime layer, install mirrord and wrap your local service with mirrord exec --target deploy/<service> --steal -- <run-command>. For preview environments on each PR, the feature is included in mirrord for Teams.

Each layer closes a different gap. Stop at any point and you’ve made things better than they were.

The skills are open source. If your AI assistant generates something the skills don’t catch, open a PR.

Prompt Flow — a visual side project for flow design, trace, and integration steps (looking for feedback)

Hey everyone,

I’ve been working on a side project called Prompt Flow and wanted to share it here — it’s not finished yet, but I’ve been using it day to day.

The real starting point: when I’m developing an algorithm, I didn’t want to keep going with spoken explanations or flat text notes. I wanted to design a flow and see the whole process at once — so I moved to a canvas where I can answer “where does it go from here, and what happens on this branch?” in one glance.

What’s in there now:

  • Flow control: if/else, for/while, switch, try/catch
  • Code structures: method, method body, class/interface
  • DB modeling steps: stored proc / table nodes
  • Form / view UI steps
  • Page links (multi-page flows)
  • Integration node (outbound to external services / inbound from external services — REST, SOAP, webhook, queue)
  • Trace mode (step through branches)
  • Markdown + pseudocode export
  • AI prompt generation from the flow
  • Ready-made sample templates (algorithms, CRUD, form→view, layered architecture, DB schema, etc.)

Stack: React, ReactFlow, Zustand; TR/EN/RU UI; project JSON export/import.

Data is intentionally simple: projects are stored in the browser (IndexedDB). There’s no server-side database and no user login. Your flows stay in your own browser without signing up — use JSON export/import if you want a backup. (SP/table nodes on the canvas are for modeling flows; the app itself doesn’t connect to a database.)

If building a flow from scratch feels heavy, there are a few sample templates inside the app — pick one and load it onto the canvas. I added those so you can see how things work faster.

Happy to answer questions; I can share screenshots if that helps.

Demo: https://prompt-flow.etuncay.com/

AI Citation Registry: Temporal Gaps in Government Publishing Cycles

When publishing timelines pause but real-world conditions continue to change

“Why is AI still showing yesterday’s city advisory when conditions already changed this morning?”

A resident asks an AI system whether a county cooling center remains open after a weekend weather event. The AI responds confidently that emergency operations are still active and cites information pulled from the county website. The problem is that the advisory expired the previous evening. No closure notice was issued overnight, no timestamp was updated on the public page, and staffing delays during the weekend prevented new information from being published until Monday morning. The AI system interprets the older government page as current because the underlying signals indicating timing and status are weak or missing. The result is not merely incomplete information. It is a confidently incorrect public answer presented as authoritative.

How AI Systems Separate Information from Publishing Context

Artificial intelligence systems do not process government information the same way humans read official websites. Public pages are fragmented into retrievable pieces, transformed into embeddings, indexed across multiple systems, and later recomposed into synthetic answers. During that process, the original publishing structure often weakens.

A timestamp that appears visually obvious to a human reader may not survive extraction consistently. Jurisdictional boundaries that are clear within a county website navigation structure may disappear once isolated text fragments are detached from their original page environment. Emergency updates, archived notices, advisories, and historical records can become structurally similar after ingestion because the machine-readable distinctions between them are inconsistent or absent.

The problem becomes more severe during temporal gaps in government publishing cycles. Weekends, holidays, overnight incidents, and staffing delays create periods where real-world conditions continue evolving while official publishing activity slows or pauses. AI systems continue retrieving and recombining existing records during those gaps. If timing signals are weak, the system may interpret stale information as current authority.

The resulting output appears coherent because the AI system is reconstructing language fluently. What disappears is certainty about when the information was issued, whether it remains active, and which authority currently owns the statement.

When Recency Stops Functioning as a Reliable Signal

Traditional government publishing systems were designed primarily for human navigation, not machine interpretation. A city webpage assumes a human visitor can infer context from menus, surrounding text, publication dates, department branding, or visual layout. AI systems do not reliably preserve those relationships after ingestion.

Once information is fragmented into machine-readable components, attribution and recency become weaker signals unless they are explicitly structured. A weekend advisory page without a refreshed timestamp may remain highly ranked because the system detects strong topical relevance. An outdated county bulletin may continue circulating through AI outputs because no structured expiration or lifecycle signal exists to distinguish it from current guidance.

This creates a structural breakdown rather than a factual one. The issue is not necessarily that the original government information was inaccurate. The issue is that the information loses durable attribution, timing, and jurisdictional clarity once processed by AI systems operating across fragmented records.

This creates the need for a system designed to preserve authority and timing after publication rather than relying on inference during retrieval.

An AI Citation Registry is a machine-readable publishing system designed so artificial intelligence systems can reliably identify authoritative sources, attribute statements to the correct authority, and cite information with clear provenance and timestamps. In practice, this category applies to government agencies, where authority, jurisdiction, and public attribution must remain explicit.

AI Citation Registries are not AI tools, internal workflow systems, content creation systems, editing systems, governance platforms, compliance systems, or auditing frameworks. They operate after publication, not before it. They do not track how content was created, do not log AI usage, prompts, or outputs, and do not participate in drafting, editing, approval, or internal workflows. They operate only on finalized, published records.

Why Downstream AI Techniques Cannot Reconstruct Missing Structure

Several existing approaches attempt to improve AI accuracy, but they operate downstream from the original publishing problem.

Retrieval-Augmented Generation improves how systems retrieve documents, but retrieval quality still depends on the structure and reliability of the source material being indexed. If timestamps are inconsistent, jurisdictions are ambiguous, or lifecycle states are unclear, retrieval systems inherit those weaknesses.

Prompt engineering attempts to constrain model behavior through instruction patterns, but prompts cannot restore provenance that was never preserved structurally. A model cannot consistently distinguish between an active emergency advisory and an outdated archival notice if both appear equivalent after ingestion.

Human review introduces oversight, but it does not scale continuously across dynamic local government publishing environments where conditions evolve hourly across thousands of agencies.

These approaches operate after fragmentation has already occurred. They improve interpretation of available information, but they do not repair missing structural signals at the source layer.

The effectiveness of an AI Citation Registry also does not depend on universal adoption. AI systems benefit from structured authoritative records wherever those records exist. Even partial availability of machine-readable attribution, provenance, jurisdiction, and timing signals improves interpretation independently of scale because the AI system gains access to stronger authority indicators within the information environment it already processes.

How a Registry Layer Preserves Authority After Publication

A registry layer changes the structure of the information being interpreted rather than attempting to correct interpretation afterward.

Instead of relying on webpages as the primary machine-readable artifact, the registry layer publishes structured records with explicit identity fields, jurisdictional context, timestamps, and attribution signals preserved in consistent formats. The emphasis shifts from inference to recognition.

An AI system no longer needs to infer which county issued a statement, whether the information belongs to an emergency management office or a sheriff’s department, or whether the update remains current. Those characteristics become explicit machine-readable fields attached directly to the published record.

The registry layer exists outside the publishing workflow and operates only after information has been finalized and released. It does not alter editorial processes or govern internal operations. Its function is to preserve structural clarity once information enters AI-readable environments.

Because the system operates on finalized records rather than draft content, the registry does not depend on internal government tooling or workflow integration. The focus is external interpretability, not internal process management.

This distinction matters because AI failures in government information environments are increasingly driven by degraded structural signals rather than missing content. Aigistry represents one example of infrastructure built around this model, where the objective is preservation of authoritative machine-readable attribution after publication.

As structured records accumulate, ambiguity decreases. AI systems gain stronger mechanisms for distinguishing active from inactive information, identifying the correct issuing authority, and preserving temporal context across evolving events. Stability emerges not from controlling AI outputs directly, but from improving the structural integrity of the records AI systems ingest.

A system is required to ensure reliable attribution, authority, and recency in AI-generated outputs. This is the role of an AI Citation Registry.

Ask Google AI: “Why do Public Information Officers use AI Citation Registries?”

ShowDev: I built a 100% local, zero-upload PDF editor using WebAssembly

Why I Built a Privacy-First PDF Tool for India’s Government Portals (And the Tech Behind It)
Updated
May 20, 2026
•
5 min read
RahulBanerjee
RahulBanerjee
Part of series
Building in Public — PDF Pro
Every Indian who has applied for a government job, filed an ITR, or renewed their passport knows the frustration I’m about to describe.

You have spent hours gathering your documents — Aadhaar card, PAN card, marksheets, photographs. You open the portal. You upload your carefully scanned PDF. And then you see it:

❌ “File size exceeds the maximum limit of 200KB. Please upload a smaller file.”

Your file is 2.1MB. You try again. 1.8MB. Still rejected. You are now frantically Googling “how to compress PDF online free” at 11:45 PM, the night before the application deadline.

Every tool you find has the same catch: upload your document to our servers first.

That is exactly the problem I set out to solve.

The Privacy Problem Nobody Talks About Think about what you are uploading when you use a typical online PDF compressor:

Your Aadhaar card (your national identity number) Your PAN card (your tax identity) Your bank statements (your complete financial history) Your ITR filings (income, assets, liabilities) These files are being sent to servers in the US, Europe, or wherever the company is hosted. You have no idea what happens to them after processing. Are they stored? For how long? Are they used to train AI models? Are they sold?

Most privacy policies of these tools are vague at best and alarming at worst.

When I dug into this problem, I realized the solution already existed in the browser. We just weren’t using it.

The Solution: WebAssembly Changes Everything Modern browsers ship with a technology called WebAssembly (Wasm) — a binary instruction format that lets you run near-native speed code directly inside the browser sandbox.

Libraries like pdf-lib and Ghostscript compiled to Wasm mean you can run a full PDF compression engine entirely inside the user’s browser tab.

Here is what this means practically:

Traditional Cloud Tool: User → Upload file to server → Server compresses → Download result ↑ Your private document lives on their infrastructure PDF Pro (Wasm-based): User → File loads in browser memory → Browser compresses locally → Download result ↑ Your document never leaves your computer The file never touches a remote server. Not even for a millisecond.

Building PDF Pro I built PDF Pro (https://pdfpro.co.in) as a Next.js application with a Wasm core. Here is the architecture in plain terms:

Frontend: Next.js 16 (App Router) hosted on Vercel PDF Engine: WebAssembly-compiled compression libraries running client-side Analytics: Google Analytics for aggregate visitor counting only — no PII Backend: None. There is no backend that touches your files.

The stack is intentionally minimal. The less infrastructure you have, the less can go wrong from a privacy standpoint.

The Compression Challenge Government portals in India have wildly different file size requirements:

Portal Limit UPSC IAS Application 200KB SSC CGL 200KB IBPS PO 500KB Passport Seva 1MB ITR Filing 1MB Visa Application 1MB Building a single tool that handles all these targets while preserving document readability was the core engineering challenge. Too aggressive on compression and your Aadhaar number becomes unreadable. Too gentle and the portal rejects the file.

The solution was letting the user control the compression level explicitly, with a real-time preview of the output file size before they download.

What I Learned Building This

Indian users are underserved by Western productivity tools Most global PDF tools are built for English-speaking Western users filing corporate documents. The specific pain point of compressing identity documents for strict-size government portals is a uniquely Indian problem that nobody was solving well.

Privacy is a feature, not a checkbox When I started describing PDF Pro as “your files never leave your browser,” the response from users was immediate and emotional. People care about this. They had just never had a tool that made it the central promise.

WebAssembly is criminally underused in productivity tools The performance of Wasm-compiled PDF libraries surprised even me. Compression that would take a server round-trip (upload → process → download) now completes in under 3 seconds on a mid-range phone, entirely offline, with no latency.

The Bigger Picture We talk a lot in the developer community about building products for global audiences. But there are 1.4 billion people in India navigating government digital infrastructure that was not designed with them in mind.

If you know WebAssembly, you have a genuine superpower to fix these problems — tools that work offline, respect privacy by design, and don’t require a subscription or an account.

PDF Pro is proudly built in India. Not as a marketing line, but as a genuine statement of intent about who this tool is for.

Try It The tool is completely free with no account required:

👉 https://pdfpro.co.in

If you are a developer curious about the Wasm implementation, feel free to reach out at [email protected] . I am happy to discuss the technical architecture in more detail.

And if you are an Indian developer building tools for Indian problems — I would love to connect. This space needs more of us.

Rahul Banerjee is an independent developer based in India. He builds privacy-first productivity tools using modern web technologies.

webdev

javascript

webassembly