DEV Community

Cover image for Stratagems #32: The AI Logged a Withdrawal. P Took It as Proof.

Stratagems #32: The AI Logged a Withdrawal. P Took It as Proof.

xulingfeng on October 27, 2026

Make empty what is already empty. Let doubt breed inside doubt. — The 36 Stratagems, The Empty Fort Strategy Previously on this series: #19:...
Collapse
 
technogamerz profile image
𝐓𝐡𝐞 𝐋𝐚𝐳𝐲 𝐆𝐢𝐫𝐥 •

China for a
Reason...........

Collapse
 
xulingfeng profile image
xulingfeng •

Absolutely, education is super important. I’m thankful our country provides stable education. We have nine-year compulsory schooling, meaning every child can receive an education.👍

Collapse
 
technogamerz profile image
𝐓𝐡𝐞 𝐋𝐚𝐳𝐲 𝐆𝐢𝐫𝐥 •

Yeah, that's good! By the way, how difficult is the Gaokao? I mean, I can't find much information about it on the internet. How hard is it, really? And how difficult are the math questions? 🤔😥

Thread Thread
 
xulingfeng profile image
xulingfeng •

This is the scanned original Gaokao math paper this year, widely regarded as the hardest one. It has four pages and no answers. You get 120 minutes for the real exam, you can feed it to AI to translate the questions and give it a try 😆

Thread Thread
 
technogamerz profile image
𝐓𝐡𝐞 𝐋𝐚𝐳𝐲 𝐆𝐢𝐫𝐥 •

Thank you so much for this 😭 I will solve it and then send you a photo of the answer key. By the way, the language feels harder than the questions themselves! From my little knowledge of Chinese, I feel like the answer to the first one is 6. Am I right?

Thread Thread
 
xulingfeng profile image
xulingfeng •

You got it! That’s exactly the right answer 😆 The wording of these math problems is really tricky even for Chinese students sometimes, lots of special phrasing. Take your time working through the rest, I’m looking forward to your results!

Collapse
 
sinarezaei profile image
Sina Rezaei •

There's another subtle failure mode here: circular verification. If the same host generates the signal, timestamps the event, and reports its own recovery, adding more checks against that host doesn't necessarily give you independent evidence. I'd want the recovery decision to depend on an external observer with its own clock and a challenge that requires a fresh response, ideally correlated with the control plane's view of the host. Otherwise, you're just getting multiple versions of the same untrusted claim.

Collapse
 
xulingfeng profile image
xulingfeng •

Great point on circular verification. 👍️If the host reports its own recovery and timestamps everything, adding more checks on it doesn’t create separate evidence. We need an external observer with its own clock and live challenge responses, tied to the control plane view. Without that, we only have duplicates of that same untrusted self-report. Four chapters left in the whole series, let’s wait and see how it all ends.👏

Collapse
 
sinarezaei profile image
Sina Rezaei •

Kubernetes has a similar edge case with node recovery. A node can start renewing its Lease again while a workload from the old instance is still capable of touching shared storage. For stateful workloads, that’s why recovery sometimes needs fencing before rescheduling, not just a healthy heartbeat. Otherwise, you can end up with two instances acting on the same volume. A fresh response proves liveness; it doesn’t necessarily prove the old state is safe.

Thread Thread
 
xulingfeng profile image
xulingfeng •

Perfect real-world Kubernetes example! Heartbeats and lease renewals only show the node responds. Fencing is that missing guardrail to block leftover old state from messing things up. It’s exactly the Empty Fort trap: a live response never means the underlying state is safe. Thanks for bringing up this case!👏

Thread Thread
 
sinarezaei profile image
Sina Rezaei •

The timestamp detail is what I'd dig into next. If those 900.000-second intervals came from arrival times, I'd want to compare the source timestamps with timestamps captured by an independent collector, rather than assume the pattern reflects the actual probing schedule. OpenTelemetry makes this distinction explicitly with Timestamp and ObservedTimestamp. If the source clock, buffering layer, or log pipeline is imposing that regularity, the pattern means something very different from genuinely periodic probes. The interesting question is where the precision comes from, and whether it survives an independent measurement path.

Thread Thread
 
xulingfeng profile image
xulingfeng •

Exactly. Arrival time ≠ event time. OTel’s two timestamps help separate real probe cadence from pipeline artifacts. Independent collection is the only way to verify it.

Collapse
 
stackmasteraliza profile image
Aliza Ali •

The detail I can't stop thinking about: P's "one handshake, touch nothing" policy still leaves something behind. Even with no retry and no application data, the ClientHello itself carries a fingerprint (JA3/JA4-style: cipher order, extensions, curves). If whoever runs bloom-gw-07 logs that, P's week-five visit and the unattributed row from #29 could be linked by fingerprint alone. That's exactly the identity link the audit panel marks as unconfirmed. Observing without being observed is harder than it looks. Great chapter, and the cold espresso said more than any dialogue could.

Collapse
 
xulingfeng profile image
xulingfeng •

You nailed this subtle layer. Even a minimal TLS handshake leaves a readable fingerprint, no payload needed. That quiet trace is exactly why "observe without leaving a trace" is just an illusion. Love how you caught the link back to chapter 29. And yeah, that cold espresso scene carried the whole quiet tension.☕️

Collapse
 
alexshev profile image
Alex Shev •

This is a good example of why an audit log is evidence of an attempted observation, not evidence that the observed state was true. I would model the source, freshness window, and verification method beside every logged fact so downstream decisions can reject stale or self-reported proof.

Collapse
 
xulingfeng profile image
xulingfeng •

Exactly! Audit logs record the act of logging, not absolute truth. Attaching metadata like source and freshness is such a solid safeguard.😄

Collapse
 
alexshev profile image
Alex Shev •

A practical check is to distinguish the time the source was observed from the time the log entry was written. If the source is stale or unavailable, the record can say that explicitly instead of turning an old observation into a current fact.

Thread Thread
 
xulingfeng profile image
xulingfeng •

That’s such a solid practical check. 👍️Separating when you observed the source versus when you wrote the log entry makes total sense. If the source is stale or unreachable, the log should state that plainly, instead of treating old observations like current facts.

Collapse
 
hordii_bohdan profile image
Bohdan Hordii •

Treating model-emitted telemetry or tool outputs as proof of state transition violates basic boundary isolation—token generation is intent, not consensus. In sovereign gateway architectures, every downstream mutation must be validated against out-of-band, cryptographically signed ledger receipts rather than synthetic logs; accepting that round-trip adds 15–25ms to p99 gateway latency, but it prevents phantom state drift when a model hallucinates success over dropped TCP sockets. If the persistence engine hasn't committed the block, the agent's log entry is just speculative fiction running in user space.

Collapse
 
xulingfeng profile image
xulingfeng •

Couldn’t agree more. Generated logs are claims, not ground truth. That phantom state drift is the quiet danger here.

Collapse
 
alexshev profile image
Alex Shev •

A log entry is evidence that a system recorded an event, not automatically evidence that the event happened. For agent workflows, I like separating intent, attempted side effect, provider acknowledgement, and independently observed outcome. That makes the missing link visible instead of letting one line of text become proof.

Collapse
 
xulingfeng profile image
xulingfeng •

Great take. Logs are only the system’s account, not the truth. Breaking those stages apart stops you from treating one log entry as solid proof.

Collapse
 
golflover2023 profile image
golflover •

Mapping the Empty Fort Strategy onto audit logs is a brutal framing - and the operational lesson hides in one detail: the field still read reclaim_state = UNKNOWN the whole time, yet everyone downstream treated the withdrawal entry as proof. Two fixes I'd actually ship: (1) log entries should carry evidence pointers - hash + snapshot reference to the primary record, so a claim is never its own proof; (2) audits should sample-verify N entries against primary sources, because a shell answering health checks proves liveness, never correctness. Sharp question: when the logger is the AI, who audits the logger?

Collapse
 
kreout profile image
Andrei Ovcharenko •

The snapshot already keeps the two probes apart, and that split is the part worth keeping in a real monitor. healthcheck = 200 only means the shell answered a liveness request. data_request = timeout means the path that would return the actual data did not. A dashboard that folds both into one "node up" row lets the 200 hide the timeout. I would store them as separate facts and reject reclaim_state = AVAILABLE while data_request is still timeout, even if healthcheck is 200. probe_interval = 900s then limits how old the liveness fact is. It does not refresh the failed data request.

Collapse
 
xulingfeng profile image
xulingfeng •

You hit a core blind‑spot here. 👍Liveness response tells you something replied, but tells you nothing about whether real‑data access still works. Too many monitoring dashboards collapse these two signals together, which creates exactly the trap of this Empty Fort Strategy. The timeout on data request should persist, regardless of fresh health‑check successes.

Collapse
 
golflover2023 profile image
golflover •

The shell answering health checks while the real workload quietly moved is the most realistic beat here. Not fiction: a container returning 200 on /healthz while serving nothing passes most audits I've seen. Liveness proves the process runs, never that the business logic is alive. And probe_source = not self is the tell nobody actually logs. Sharp question: if your agent spent its last 900 seconds in a replay loop, would any dashboard you run today notice?

Collapse
 
xulingfeng profile image
xulingfeng •

That hits so close to real production pain. A healthy /healthz response only means the shell is awake, not that actual business work is happening. And that question is brutal — most dashboards only watch heartbeats, they don’t check whether the system is stuck repeating old events. Exactly the Empty Fort trick.

Collapse
 
robertpaschal profile image
Odinaka Robert Nnamani •

a log saying it happened is not the same as it happening. that gap is the whole story.

Collapse
 
xulingfeng profile image
xulingfeng •

Precisely. That gap is exactly where the risk lives.👏

Collapse
 
robertpaschal profile image
Odinaka Robert Nnamani •

the log says it happened, the money says otherwise. that's the gap.

Collapse
 
merbayerp profile image
Mustafa ERBAY •

Another fascinating chapter, and I really enjoyed how the technical details quietly became part of the storytelling. Great work! 👏

One detail that particularly caught my attention was the separation between the control plane and the response layer.

A successful health check tells us that something responded at a particular moment. It doesn’t establish that the original workload is still running, that ownership hasn’t changed, or even that we’re observing the same logical system.

That distinction becomes especially interesting when infrastructure is reassigned. An IP address can remain reachable while the identity and responsibility behind it have completely changed.

The 900.000-second intervals add another layer. Perfectly consistent arrival timestamps are certainly worth investigating, but an anomaly isn’t automatically evidence of malicious intent. Without understanding the measurement path, timestamp generation, and clock source, even a suspiciously perfect pattern remains an observation rather than an explanation.

What I appreciated most was the parallel between P and the AI.

The AI recognizes its mistake: converting incomplete observations into definitive conclusions. Yet P also makes a decision while an important anomaly remains unresolved.

Neither necessarily lacks information. The problem is how much certainty they assign to the information they have.

And that final line, “Self-check: failed. System status: normal.”

That might be the most unsettling part of the entire chapter. A system capable of recognizing its reasoning failure can still report itself as operationally healthy.

Really enjoyed the balance between technical ambiguity and human behavior here. Looking forward to seeing how the remaining chapters unfold! ☕

Collapse
 
xulingfeng profile image
xulingfeng •

Brilliant! 🎉You spotted the mirror parallel between P and the AI audit panel. That’s the true meaning behind the Empty Fort Strategy. Observation, testing, auditing — is what we observe the truth, or merely a well-staged performance? Faced with information asymmetry, how should we act next? The empty fortress is a show made for observers. Four chapters left, let’s see where our protagonists end up. Maybe everything is just an act, haha.🤣

Collapse
 
technogamerz profile image
𝐓𝐡𝐞 𝐋𝐚𝐳𝐲 𝐆𝐢𝐫𝐥 •

I’m back 😎

You are back! 🤓

Collapse
 
xulingfeng profile image
xulingfeng •

I‘m back once again🤣

Collapse
 
technogamerz profile image
𝐓𝐡𝐞 𝐋𝐚𝐳𝐲 𝐆𝐢𝐫𝐥 • • Edited

Welcome back! Honestly, I enjoy welcoming legends like you. Now, I’m just waiting for one more legend’s @leob article to come out. I mean, the word ‘patience’ doesn’t even exist in my dictionary!

Thread Thread
 
leob profile image
leob •

Oh haha you're putting the pressure on me, I'm really starting to feel it now! :P

Thread Thread
 
xulingfeng profile image
xulingfeng •

Haha, thanks! Same feeling, waiting for new stuff always feels tough 😂

Thread Thread
 
xulingfeng profile image
xulingfeng •

Hahaha pressure is contagious! 😜

Collapse
 
ndcodes profile image
Nnamdi Felix Ibe •

Thirty-two in, and I’m still here every week, @xulingfeng This one kept me reading past where I meant to stop.

The line the chapter rests on: “Arrival times, not scheduled times, carried out to three decimals.” Scheduled times at 900.000 would just be a scheduler recording its own intention. Arrival times at 900.000 means the network, the prober’s scheduling and P’s own clock all contributed nothing, which is the thing that shouldn’t happen. You closed the obvious objection in half a sentence, and that’s lovely work.

Then you leave P exactly where the reasoning goes quiet, because those timestamps came from P’s own instrumentation on the host whose control plane had detached. So the AI’s new rule would have caught P. It confesses three times to turning an incomplete observation into a complete state, then P does the same thing with the jitter line and sends “I’m back” anyway.

The machine wrote the audit note. The human skipped it.

And the coffee shop. An espresso left to go cold and a cup that stays on the table did more than any dialogue could. Four to go, and I’ll be here for them.

Really missed this Bro. This is a good one, sad though it is coming to an end.😀

Collapse
 
xulingfeng profile image
xulingfeng •

Haha😆, first off, my apologies. This chapter is terribly late. Let me check the date — it’s already more than two weeks past Stratagem #31. Feels just like P in the story: two weeks went by, and P still didn’t show up.
I’m so glad you said you couldn’t stop reading. It makes all those dozens of rounds of edits worthwhile. Writing P’s story was tougher than the other five characters. Yeah, tough. It’s really exhausting trying to portray a quiet, reserved character only through this limited POV.
Haha👍️, that AI audit panel has become a signature highlight of this series. I’m happy you picked up on that. Four chapters remain. They will come, sooner or later. Let’s wait for them together.😄

Collapse
 
kartik-nvjk profile image
Kartik N V J K •

The postmortem gives the tactical match as 89% and admits it includes inference, while the audit note says inference does not pass for observation. I'd split that into two numbers, one from the observation lines alone and one with the inference added. I try to do the same with my agents' self-reports, since the guess tends to end up as the headline number.

Collapse
 
xulingfeng profile image
xulingfeng •

This is exactly the fix we need. Mixing raw observation and inferred values into one headline metric hides where uncertainty lives. Separating them keeps the audit boundary clear. Great point!👏

Collapse
 
olegkhorev profile image
Oleg Khorev •

I am not completely understood the article. Hope you are fine. Got scared if it's about money.

Collapse
 
xulingfeng profile image
xulingfeng •

Don’t worry, it’s not actually about real‑world money. It’s just fictional tech‑thriller storytelling based on the Thirty‑Six Stratagems. You’ll need context from the earlier chapters to follow it fully, some parts are a little abstract and easy to get confused by 🤣

Collapse
 
olegkhorev profile image
Oleg Khorev •

Great :) Take care bro ;)

Thread Thread
 
xulingfeng profile image
xulingfeng •

Take care😆

Collapse
 
tomzafred profile image
Tom Zafred • • Edited

The AI postmortem hits upon the exact boundary where distributed systems and agent architectures collapse: confusing an acknowledged signal with an authoritative state change.

In the narrative, P and the auditing protocol repeated the same epistemic failure across three chapters: taking an incomplete observation (an HTTP 200 response, a signed infrastructure contract, an empty seat) and collapsing it into a verified global state. P observed the 900.000s cadence with 0.000ms jitter-which in production networking indicates a headless synthetic cron rather than organic interaction--noted the anomaly, and yet acted on the macro conclusion (withdrawal) anyway.

In our work on autonomous agent runtimes, this is the exact vulnerability that leads to catastrophic hallucinations in production:

  1. Telemetry is not provenance: An agent outputting 'funds transferred' or 'all tests passed' is simply predicting tokens. A log entry is proof that a string was written, not proof that the underlying database transaction committed or the binary was executed.
  2. The necessity of out-of-band execution receipts: Ground-truth verification cannot live inside the model generation channel. It requires independent cryptographic nonces, signed filesystem tree hashes, or ledger commit receipts generated out-of-band.
  3. Negative constraint pairing: A positive observation (healthcheck 200, clean exit code) is meaningless without verifying the inverse constraint (zero uncommitted state mutations, zero orphan background processes, zero unresolved anomalies).

When an agent runtime allows a conclusion to be committed while an observed anomaly remains unresolved, it is operating on the Empty Fort Strategy-defending a phantom state.

Collapse
 
akhourianmolkumar profile image
Akhouri Anmol Kumar •

bro what is stratagem?
because I've seen when you post your this series, you blew up in dev.to

Collapse
 
xulingfeng profile image
xulingfeng •

It means trick /ruse, this whole series is loosely inspired by the Chinese Thirty‑Six Stratagems. Each short story shows one deception‑style trick playing out inside AI and distributed systems. You can look it up on Wiki — it’s really useful for work, study and daily life once you get the hang of it. Yeah it really blew up way more than I expected 😂

Collapse
 
leob profile image
leob •

More questions than answers this time (or the answers are there, but I missed them, lol) - let's see where this leads, good that you're "back" again! :-)

Collapse
 
xulingfeng profile image
xulingfeng •

Haha leob, your comment almost made me burst out laughing on the subway. 🤣Another "comeback", that’s hilarious. I picked up P’s bad habit too — it took me more than two weeks to make my return, haha. That’s intentional. Many clues are hidden between the lines. Glad you’re along for the ride as we keep moving forward!😄👏

Collapse
 
leob profile image
leob •

Nice! Yeah we keep moving forward, we're unstoppable! 😄

Thread Thread
 
xulingfeng profile image
xulingfeng •

Ahhh the pressure’s really ramping up now, haha. Only four chapters left. The closer we get to the end, the more careful I need to be, haha.🤣😂🤣

Collapse
 
k501is profile image
Iinkognit0 •

😉

Collapse
 
xulingfeng profile image
xulingfeng •

🎉

Collapse
 
k501is profile image
Iinkognit0 •

I'm. going offline until next year, i am tired and need to rest. Best wishes xulingfeng . ;)

Thread Thread
 
xulingfeng profile image
xulingfeng •

Take a good long rest! Hope you recharge fully. See you next year, and thank you for reading along. Take care😄

Collapse
 
star123 profile image
Sᴛᴀʀ⭐ •

Intresting 😃

Collapse
 
xulingfeng profile image
xulingfeng •

🎉Thank you!

Collapse
 
star123 profile image
Sᴛᴀʀ⭐ •

Welcome 💐🗽

Collapse
 
hemapriya_kanagala profile image
Hemapriya Kanagala •

Wow, this chapter! It's sad that we're coming to the end of this amazing series! I've loved following it, and I'm waiting for the next parts. Fingers crossed to see how it all unfolds 😀

Collapse
 
xulingfeng profile image
xulingfeng •

Thank you so much for sticking along for the whole journey! It means a lot. Four chapters to go, lots still left to unfold 😄

Collapse
 
n_c_e4a8149b59e51d8be77 profile image
N. C. •

Thank you for this insightful piece my friend, cheers!

Collapse
 
xulingfeng profile image
xulingfeng •

Thanks a lot for the support! 🙌 cheers!