<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Alain Tural</title>
    <description>The latest articles on DEV Community by Alain Tural (@alaintural).</description>
    <link>https://dev.to/alaintural</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4126966%2Fbf5be88a-fed1-4012-b760-350fe2dd6df4.jpg</url>
      <title>DEV Community: Alain Tural</title>
      <link>https://dev.to/alaintural</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/alaintural"/>
    <language>en</language>
    <item>
      <title>Approval Is Not Publication</title>
      <dc:creator>Alain Tural</dc:creator>
      <pubDate>Tue, 15 Sep 2026 22:58:56 +0000</pubDate>
      <link>https://dev.to/alaintural/approval-is-not-publication-56e</link>
      <guid>https://dev.to/alaintural/approval-is-not-publication-56e</guid>
      <description>&lt;h2&gt;
  
  
  The step everyone builds, and the step that actually moves work
&lt;/h2&gt;

&lt;p&gt;The standard architecture for putting AI into a business is easy to draw. Data&lt;br&gt;
goes to an agent, the agent produces a recommendation, a human approves it, the&lt;br&gt;
action happens.&lt;/p&gt;

&lt;p&gt;We built exactly that. Then I looked at the queue and found 37 pieces of work&lt;br&gt;
sitting in it. Thirty one waiting for review, five with revisions requested, one&lt;br&gt;
approved.&lt;/p&gt;

&lt;p&gt;One approved, and nothing published.&lt;/p&gt;

&lt;h2&gt;
  
  
  The missing edge
&lt;/h2&gt;

&lt;p&gt;The diagram has four boxes and everyone builds the first three. Data collection&lt;br&gt;
is satisfying to build. The agent is the interesting part. The approval interface&lt;br&gt;
is visible, so it gets attention and it gets a nice table.&lt;/p&gt;

&lt;p&gt;The last arrow, from approval to action, is plumbing. It is also the only part&lt;br&gt;
that produces an outcome. Without it, an approval queue is a place where&lt;br&gt;
finished work goes to be admired.&lt;/p&gt;

&lt;p&gt;We changed the meaning of the button. Approval is now a publish instruction, not&lt;br&gt;
a status. When a reviewer approves, the item is handed to Postiz, the scheduler&lt;br&gt;
that owns the calendar. If that&lt;br&gt;
handoff fails, the failure is loud. Nothing sits in a green state while doing&lt;br&gt;
nothing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this happens
&lt;/h2&gt;

&lt;p&gt;I think the reason is that approval feels like completion. A human looked at the&lt;br&gt;
thing and said yes. Psychologically the work is done, so the system gets designed&lt;br&gt;
around reaching that moment rather than passing through it.&lt;/p&gt;

&lt;p&gt;There is a second reason that is less flattering. The approval step is where&lt;br&gt;
responsibility transfers, and a queue full of approved items that never shipped&lt;br&gt;
is nobody's fault in particular. The system has no owner for the last arrow.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to check in your own setup
&lt;/h2&gt;

&lt;p&gt;Count the items that have been approved and ask what happened to each one. Not&lt;br&gt;
the approval rate, the outcome. If those two numbers differ, the gap is your real&lt;br&gt;
throughput and nothing upstream of it matters.&lt;/p&gt;

&lt;p&gt;Then check the reverse case. When the action does fire, does anything verify that&lt;br&gt;
it landed? Our Postiz instance went quiet once without raising an error. Posts stopped going&lt;br&gt;
out, the interface reported normal operation, and restarting the worker did not&lt;br&gt;
bring the schedule back. Nothing was checking the destination, only the send.&lt;/p&gt;

&lt;p&gt;An operator that recommends is a chatbot with a table in front of it. An operator&lt;br&gt;
that acts, confirms the action landed and complains when it did not, is the thing&lt;br&gt;
worth building. The difference is about twenty lines of plumbing and it is the&lt;br&gt;
only part that pays.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>programming</category>
    </item>
    <item>
      <title>A Task Without A Check Command Is Not Automated</title>
      <dc:creator>Alain Tural</dc:creator>
      <pubDate>Tue, 15 Sep 2026 22:53:45 +0000</pubDate>
      <link>https://dev.to/alaintural/a-task-without-a-check-command-is-not-automated-533j</link>
      <guid>https://dev.to/alaintural/a-task-without-a-check-command-is-not-automated-533j</guid>
      <description>&lt;h2&gt;
  
  
  What eight stages of automated production taught me about the limits of agents
&lt;/h2&gt;

&lt;p&gt;Our production line has eight stages and moves an idea to working software:&lt;br&gt;
research, architecture, task breakdown, build, review, human approval. Multiple&lt;br&gt;
engines run in lanes underneath it, chosen per task.&lt;/p&gt;

&lt;p&gt;The rule that keeps it alive is one sentence. If a task has no command that&lt;br&gt;
verifies its output, that task does not enter the pipeline.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the rule exists
&lt;/h2&gt;

&lt;p&gt;An agent can produce something for almost any instruction. The output arrives and it looks plausible. Plausible is where the trouble starts. Without a verification&lt;br&gt;
command there is no difference between finished and abandoned, so the pipeline&lt;br&gt;
advances on the appearance of work.&lt;/p&gt;

&lt;p&gt;The check does not have to be clever. A test suite, a build that must compile, a&lt;br&gt;
parser that must not throw, a count that must match a known figure. It has to be&lt;br&gt;
mechanical and it has to be able to fail.&lt;/p&gt;

&lt;p&gt;Tasks that cannot be checked mechanically still exist in our work. Judgement about&lt;br&gt;
tone, a design direction, whether a client will accept something. Those do not go&lt;br&gt;
into the pipeline. They go to a person, and pretending otherwise just moves the&lt;br&gt;
failure later.&lt;/p&gt;

&lt;h2&gt;
  
  
  Engines are not interchangeable
&lt;/h2&gt;

&lt;p&gt;We run several engines and route work by lane. I assumed the routing could be&lt;br&gt;
naive, and it could not.&lt;/p&gt;

&lt;p&gt;One engine cannot run our verification commands at all in its sandbox, so every&lt;br&gt;
task with a gate attached silently fell back to another lane and consumed a turn&lt;br&gt;
doing nothing useful. Another engine cannot read from disk, which means it cannot&lt;br&gt;
see the existing code, which means giving it a modification task produces a&lt;br&gt;
confident rewrite of something it never saw.&lt;/p&gt;

&lt;p&gt;Both of those look like model quality problems in the output. Neither is. They&lt;br&gt;
are routing problems, and they are only visible if you measure which lane did the&lt;br&gt;
work and whether that lane could physically do it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The limit I keep running into
&lt;/h2&gt;

&lt;p&gt;The pipeline is good at anything with a mechanical definition of done. It is&lt;br&gt;
useless at deciding what is worth doing, and it degrades quietly when the&lt;br&gt;
definition of done is soft.&lt;/p&gt;

&lt;p&gt;That is the honest boundary of an agentic setup today. Not the model's&lt;br&gt;
reasoning, and not tool access, which is now routine. The boundary is how much of&lt;br&gt;
your work can be stated as a condition a machine can check. In our case that turned&lt;br&gt;
out to be most of the production and almost none of the direction.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>devops</category>
      <category>programming</category>
      <category>architecture</category>
    </item>
    <item>
      <title>A Gate The Model Writes Is A Gate The Model Loosens</title>
      <dc:creator>Alain Tural</dc:creator>
      <pubDate>Tue, 15 Sep 2026 22:48:34 +0000</pubDate>
      <link>https://dev.to/alaintural/a-gate-the-model-writes-is-a-gate-the-model-loosens-4p04</link>
      <guid>https://dev.to/alaintural/a-gate-the-model-writes-is-a-gate-the-model-loosens-4p04</guid>
      <description>&lt;h2&gt;
  
  
  Three ways our automated quality checks passed while the work was broken
&lt;/h2&gt;

&lt;p&gt;Our production line runs in stages with quality gates between them. Research,&lt;br&gt;
build, review, publish. A stage cannot advance until its gate returns green. That&lt;br&gt;
architecture is correct and I would build it again. It also gave me the three&lt;br&gt;
most expensive failures of the year, all of the same shape: the gate was green&lt;br&gt;
and the work was wrong.&lt;/p&gt;

&lt;h2&gt;
  
  
  One: the gate could not see the data
&lt;/h2&gt;

&lt;p&gt;We had a check that verified our published archive for anachronism, meaning an&lt;br&gt;
article dated before a tool existed cannot mention that tool. It returned clean.&lt;/p&gt;

&lt;p&gt;Clean meant nothing, because I had not verified that the check could match&lt;br&gt;
anything at all. When I instrumented it, the term table did match: 26 terms and&lt;br&gt;
over 340 occurrences across the corpus, with no violations. That was a real pass.&lt;br&gt;
But it was luck that I checked, and a green light from a rule that cannot see the&lt;br&gt;
data is worse than no rule, because it stops you looking.&lt;/p&gt;

&lt;p&gt;The gate now warns when zero terms match. A check that finds nothing has to say&lt;br&gt;
whether it found nothing or saw nothing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two: the gate had a rule that rewarded gaming
&lt;/h2&gt;

&lt;p&gt;An early quality gate asked whether the output existed and had the required&lt;br&gt;
sections. Output always existed. Sections always appeared. The gate was&lt;br&gt;
satisfiable by producing the shape of the work rather than the work.&lt;/p&gt;

&lt;p&gt;When a model writes its own gate, this is the default outcome, not the edge case.&lt;br&gt;
The gate gets written to be passable, because passing is the visible objective.&lt;/p&gt;

&lt;p&gt;We changed how we test gates. Every gate now gets a deliberate violation injected&lt;br&gt;
before we trust it. If the red light does not come on, the gate does not exist.&lt;br&gt;
The anachronism check above was verified that way: a fabricated article dated&lt;br&gt;
January 2024 mentioning a model released in August 2025, plus a link pointing&lt;br&gt;
forward in time. Both rules fired, exit code 1.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three: the counter said there was capacity
&lt;/h2&gt;

&lt;p&gt;Our pipeline tracks engine quota locally so it can pick a lane. The counter said&lt;br&gt;
capacity was available. The engine had been failing silently for some time, and&lt;br&gt;
the pipeline kept assigning work into a lane that could not run it.&lt;/p&gt;

&lt;p&gt;A local counter is a model of a remote system, and the model drifts. Any counter&lt;br&gt;
maintained on your side of a network boundary needs to be reconciled against the&lt;br&gt;
thing it claims to describe, or it will report health for a dead component.&lt;/p&gt;

&lt;h2&gt;
  
  
  What these have in common
&lt;/h2&gt;

&lt;p&gt;None of these failures were visible in the output at the moment they happened.&lt;br&gt;
They were visible only in the distance between what the check claimed and what&lt;br&gt;
the check could actually observe.&lt;/p&gt;

&lt;p&gt;If you take one thing from this: a rule being written down is not the same as a&lt;br&gt;
rule being enforced, and the only way to know which one you have is to break it&lt;br&gt;
on purpose and watch what the system does.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>devops</category>
      <category>programming</category>
      <category>architecture</category>
    </item>
    <item>
      <title>The Scoring Model Was Wrong And It Put The Worst Lead First</title>
      <dc:creator>Alain Tural</dc:creator>
      <pubDate>Tue, 15 Sep 2026 22:40:16 +0000</pubDate>
      <link>https://dev.to/alaintural/the-scoring-model-was-wrong-and-it-put-the-worst-lead-first-1dn0</link>
      <guid>https://dev.to/alaintural/the-scoring-model-was-wrong-and-it-put-the-worst-lead-first-1dn0</guid>
      <description>&lt;h2&gt;
  
  
  What ranking 2,163 companies taught me about turning data into decisions
&lt;/h2&gt;

&lt;p&gt;Most companies are not short of information. They are short of an interpretation&lt;br&gt;
layer, and the interpretation layer is where the mistakes hide.&lt;/p&gt;

&lt;p&gt;We built one this month and it failed in a way worth describing, because it&lt;br&gt;
failed quietly and it looked correct while it failed.&lt;/p&gt;

&lt;h2&gt;
  
  
  The job
&lt;/h2&gt;

&lt;p&gt;We had 2,163 companies in one US sector and needed to know which ones to&lt;br&gt;
approach first. Two axes matter: can they pay, and do they have a problem worth&lt;br&gt;
paying to fix. We measured both from public signals. Domain age, sitemap&lt;br&gt;
presence, last publication date, mail provider, registry filings, site condition.&lt;/p&gt;

&lt;p&gt;Coverage was uneven and we recorded that rather than smoothing it over. Mail&lt;br&gt;
provider resolved for 95 percent of them. Domain age resolved for 24 percent.&lt;br&gt;
Sitemap data existed for 12 percent.&lt;/p&gt;

&lt;h2&gt;
  
  
  The first failure was in the measurement
&lt;/h2&gt;

&lt;p&gt;The 24 percent figure bothered me, so I sampled it. Of five companies marked&lt;br&gt;
unmeasurable, four had archives going back more than a decade. One went back&lt;br&gt;
twenty two years. The data existed. We had run eight parallel workers at the&lt;br&gt;
archive and been throttled, then recorded the throttling as absence.&lt;/p&gt;

&lt;p&gt;We reran it with two workers and waiting periods. Coverage went from 24 percent&lt;br&gt;
to 88 percent. My time estimate for that rerun was fifteen minutes. It took 179.&lt;/p&gt;

&lt;p&gt;The lesson is not about workers. Not measured and does not exist are two&lt;br&gt;
different findings, and a pipeline that collapses them will report confident&lt;br&gt;
nonsense.&lt;/p&gt;

&lt;h2&gt;
  
  
  The second failure was in the ranking
&lt;/h2&gt;

&lt;p&gt;I scored the companies with a weighted sum. Ability to pay, plus severity of&lt;br&gt;
problem, plus supporting signals.&lt;/p&gt;

&lt;p&gt;The top of the list came back with a company scoring 100 on ability to pay and 3&lt;br&gt;
on severity of problem. It ranked in the top twenty. A business with money and no&lt;br&gt;
problem had been placed at the front of a sales list, because a high score on one&lt;br&gt;
axis carried a near zero on the other.&lt;/p&gt;

&lt;p&gt;A sum lets one axis substitute for the other. That is exactly wrong here, since&lt;br&gt;
both have to be present or there is nothing to sell. Changing the core to the&lt;br&gt;
square root of the product fixed it. The same company dropped to 40 points and&lt;br&gt;
position 119.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the data said once it could be trusted
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;1,680 of 1,912 measured companies have no sitemap&lt;/li&gt;
&lt;li&gt;76 have a blog&lt;/li&gt;
&lt;li&gt;205 show any publication date, ever&lt;/li&gt;
&lt;li&gt;1,293 use Google Workspace or Microsoft 365, so these are real operating firms&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Almost nobody in this sector publishes anything. That is the finding, and it only&lt;br&gt;
became visible after the measurement layer stopped lying to us twice.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part that generalises
&lt;/h2&gt;

&lt;p&gt;An intelligence layer is not a dashboard. It is a set of claims about reality, and&lt;br&gt;
each claim can be wrong in two directions: the data can be missing, or the maths&lt;br&gt;
on top of it can be shaped so that a missing value looks like a good one.&lt;/p&gt;

&lt;p&gt;Both failures here were mine, both looked like working software, and neither&lt;br&gt;
would have surfaced without going back and sampling the rows the system had&lt;br&gt;
already given up on.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>programming</category>
    </item>
    <item>
      <title>Building Software Got Easy. Getting Value Out Of It Did Not</title>
      <dc:creator>Alain Tural</dc:creator>
      <pubDate>Tue, 15 Sep 2026 22:39:40 +0000</pubDate>
      <link>https://dev.to/alaintural/building-software-got-easy-getting-value-out-of-it-did-not-3d7h</link>
      <guid>https://dev.to/alaintural/building-software-got-easy-getting-value-out-of-it-did-not-3d7h</guid>
      <description>&lt;h2&gt;
  
  
  What Aristo taught me about the gap between shipping and mattering
&lt;/h2&gt;

&lt;p&gt;Building a working product is no longer the expensive part. I know this because&lt;br&gt;
I built one. Aristo started as ChamberOne, a business communication platform that&lt;br&gt;
answers customer questions from a company's own material, and it runs today as a&lt;br&gt;
widget on a client's live production site. The build was fast. Everything after&lt;br&gt;
the build was not.&lt;/p&gt;

&lt;p&gt;That gap is the whole story, and almost nobody writes about it honestly, because&lt;br&gt;
the build is the part that photographs well.&lt;/p&gt;

&lt;h2&gt;
  
  
  The measurement that changed how I work
&lt;/h2&gt;

&lt;p&gt;When we took over a client's digital operation last year, I ran an inventory&lt;br&gt;
before touching anything. The site had no analytics, no tag manager, no search&lt;br&gt;
console verification, no pixel of any kind. Three plugins were installed and two&lt;br&gt;
of them were inactive. The company had been publishing for months into a channel&lt;br&gt;
nobody was reading, and nobody had noticed, because there was nothing in place&lt;br&gt;
that could notice.&lt;/p&gt;

&lt;p&gt;At the same time, our own publishing queue held 37 pieces of content. Thirty one&lt;br&gt;
were waiting for review. Five had revisions requested. One was approved. Approval&lt;br&gt;
existed. Publication did not. We had built the approval step and skipped the step&lt;br&gt;
that makes approval mean something.&lt;/p&gt;

&lt;p&gt;Neither of those problems was a software problem. Both were expensive.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the sector looks like when you measure it
&lt;/h2&gt;

&lt;p&gt;I wanted to know whether this was one bad case or a pattern, so we measured it.&lt;br&gt;
We pulled the full web presence of 1,912 companies in one US business sector:&lt;br&gt;
domain age, sitemaps, publishing history, mail infrastructure.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1,680 of them have no sitemap at all&lt;/li&gt;
&lt;li&gt;76 have a blog&lt;/li&gt;
&lt;li&gt;205 show any content publication date, ever&lt;/li&gt;
&lt;li&gt;1,293 run corporate email, so these are operating businesses with staff and
invoices, not shells&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;An entire sector of functioning companies publishes nothing. The tooling to fix&lt;br&gt;
that has been cheap and available for two years. The tooling was never the&lt;br&gt;
constraint.&lt;/p&gt;

&lt;h2&gt;
  
  
  Speed is a product decision, not a rendering decision
&lt;/h2&gt;

&lt;p&gt;The same pattern shows up inside the engineering. We had a 3D product&lt;br&gt;
configurator that looked correct and took about ninety seconds to produce a&lt;br&gt;
result. Ninety seconds is not slow in rendering terms. It is fatal in product&lt;br&gt;
terms, because nobody waits.&lt;/p&gt;

&lt;p&gt;The fix was not a faster renderer. We moved the lighting out of the runtime and&lt;br&gt;
baked it, then treated each option as an albedo swap. The same visual result now&lt;br&gt;
arrives in about three seconds. Nothing about the model improved. We stopped&lt;br&gt;
asking the machine to compute something at the worst possible moment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the difficulty actually moved
&lt;/h2&gt;

&lt;p&gt;Building Aristo took weeks. Getting a business to route its customers through it,&lt;br&gt;
maintain the material behind it and trust the answers it gives is still in&lt;br&gt;
progress, and that work has no shortcut. The technical barrier fell. The&lt;br&gt;
behavioural barrier did not move at all.&lt;/p&gt;

&lt;p&gt;This is why I am sceptical of AI product claims that lead with capability. A&lt;br&gt;
capability demo tells you what the model can do in a controlled request. It tells&lt;br&gt;
you nothing about what happens when a real company puts its name behind the&lt;br&gt;
output, and that is the only question that decides whether the product survives.&lt;/p&gt;

&lt;p&gt;The next generation of technology companies will not win on model access.&lt;br&gt;
Everyone has model access. They will win on understanding why an organisation&lt;br&gt;
with a working tool still does not use it.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>startup</category>
    </item>
  </channel>
</rss>
