<?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: Okeke Chukwudubem</title>
    <description>The latest articles on DEV Community by Okeke Chukwudubem (@okeke_chukwudubem_5f3bf49).</description>
    <link>https://dev.to/okeke_chukwudubem_5f3bf49</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%2F3908265%2F586841bb-154e-4de4-a539-b939b3018c48.jpeg</url>
      <title>DEV Community: Okeke Chukwudubem</title>
      <link>https://dev.to/okeke_chukwudubem_5f3bf49</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/okeke_chukwudubem_5f3bf49"/>
    <language>en</language>
    <item>
      <title>My AI agent was misreading bank balances 1 in 5 times. No crashes. No exceptions. Just quiet, dangerous wrong numbers.

I built a three-layer verification system that caught the bug hiding in plain sight. Format validation. Double-read confirmation.</title>
      <dc:creator>Okeke Chukwudubem</dc:creator>
      <pubDate>Sat, 18 Jul 2026 18:56:15 +0000</pubDate>
      <link>https://dev.to/okeke_chukwudubem_5f3bf49/my-ai-agent-was-misreading-bank-balances-1-in-5-times-no-crashes-no-exceptions-just-quiet-1pb6</link>
      <guid>https://dev.to/okeke_chukwudubem_5f3bf49/my-ai-agent-was-misreading-bank-balances-1-in-5-times-no-crashes-no-exceptions-just-quiet-1pb6</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/okeke_chukwudubem_5f3bf49/smash-stories-the-bug-that-whispered-for-two-weeks-before-i-heard-it-405n" class="crayons-story__hidden-navigation-link"&gt;Smash Stories: The Bug That Whispered for Two Weeks Before I Heard It&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
      &lt;a href="https://dev.to/okeke_chukwudubem_5f3bf49/smash-stories-the-bug-that-whispered-for-two-weeks-before-i-heard-it-405n" class="crayons-article__context-note crayons-article__context-note__feed"&gt;&lt;p&gt;Summer Bug Smash: Smash Stories 🐛🛹&lt;/p&gt;

&lt;/a&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/okeke_chukwudubem_5f3bf49" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3908265%2F586841bb-154e-4de4-a539-b939b3018c48.jpeg" alt="okeke_chukwudubem_5f3bf49 profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/okeke_chukwudubem_5f3bf49" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Okeke Chukwudubem
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Okeke Chukwudubem
                
              
              &lt;div id="story-author-preview-content-4175392" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/okeke_chukwudubem_5f3bf49" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3908265%2F586841bb-154e-4de4-a539-b939b3018c48.jpeg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Okeke Chukwudubem&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/okeke_chukwudubem_5f3bf49/smash-stories-the-bug-that-whispered-for-two-weeks-before-i-heard-it-405n" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jul 18&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/okeke_chukwudubem_5f3bf49/smash-stories-the-bug-that-whispered-for-two-weeks-before-i-heard-it-405n" id="article-link-4175392"&gt;
          Smash Stories: The Bug That Whispered for Two Weeks Before I Heard It
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/devchallenge"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;devchallenge&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/bugsmash"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;bugsmash&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/gemma"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;gemma&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/okeke_chukwudubem_5f3bf49/smash-stories-the-bug-that-whispered-for-two-weeks-before-i-heard-it-405n" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/raised-hands-74b2099fd66a39f2d7eed9305ee0f4553df0eb7b4f11b01b6b1b499973048fe5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;4&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/okeke_chukwudubem_5f3bf49/smash-stories-the-bug-that-whispered-for-two-weeks-before-i-heard-it-405n#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              1&lt;span class="hidden s:inline"&gt;&amp;nbsp;comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            4 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>agents</category>
      <category>ai</category>
      <category>debugging</category>
      <category>fintech</category>
    </item>
    <item>
      <title>Smash Stories: The Bug That Whispered for Two Weeks Before I Heard It</title>
      <dc:creator>Okeke Chukwudubem</dc:creator>
      <pubDate>Sat, 18 Jul 2026 18:51:38 +0000</pubDate>
      <link>https://dev.to/okeke_chukwudubem_5f3bf49/smash-stories-the-bug-that-whispered-for-two-weeks-before-i-heard-it-405n</link>
      <guid>https://dev.to/okeke_chukwudubem_5f3bf49/smash-stories-the-bug-that-whispered-for-two-weeks-before-i-heard-it-405n</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/bugsmash"&gt;DEV's Summer Bug Smash: Smash Stories&lt;/a&gt; powered by &lt;a href="https://sentry.io/" rel="noopener noreferrer"&gt;Sentry&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;My AI agent was misreading financial data 1 in 5 times. No crashes. No exceptions. Just quiet, dangerous wrong numbers.&lt;/p&gt;

&lt;p&gt;Some bugs scream. Null pointer exceptions. Segmentation faults. Crash logs that light up your screen like a Christmas tree.&lt;/p&gt;

&lt;p&gt;This one whispered.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Setup&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I'm building an AI agent that controls Android phones using Gemma 4. Natural language commands get parsed into structured JSON, translated into ADB instructions, and executed on-device. No cloud. No API keys. Just a phone that does what you tell it.&lt;/p&gt;

&lt;p&gt;By Day 16, I'd hit a milestone: the agent completed its first multi-app workflow. "Copy my bank balance and send it to Mom on WhatsApp."&lt;/p&gt;

&lt;p&gt;Three apps. Banking → WhatsApp. Seven steps. Success.&lt;/p&gt;

&lt;p&gt;I celebrated. Shipped the code. Published the build log. Went to sleep feeling like an engineer.&lt;/p&gt;

&lt;p&gt;Then I tested it again the next morning. And again. And again.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Whisper&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Out of 50 test runs, the balance was wrong 10 times. Twenty percent.&lt;/p&gt;

&lt;p&gt;The agent wasn't crashing. No exceptions were thrown. The logs showed success. But "₦15,000" was quietly becoming "₦15.000" or "₦15,00" or "₦15000." A currency symbol mistaken for a digit. A comma parsed as a decimal. A zero dropped from the end.&lt;/p&gt;

&lt;p&gt;The wrong number was being sent to Mom. And I had no idea for two weeks because nothing was failing loudly enough to make me look.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Root Cause&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I traced the problem to a single bad assumption: I was treating OCR output as ground truth.&lt;/p&gt;

&lt;p&gt;Banking apps scored F on my accessibility audit. Zero UI labels. The agent had to rely entirely on optical character recognition to read anything on screen. And banking apps are a hostile environment for OCR:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Condensed fonts designed for dense data, not readability&lt;/li&gt;
&lt;li&gt;Grey text on slightly-darker-grey backgrounds&lt;/li&gt;
&lt;li&gt;Currency symbols (₦) that OCR models frequently confuse with digits&lt;/li&gt;
&lt;li&gt;Commas in large numbers that OCR sometimes parses as decimal points&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One screenshot. One OCR pass. One number stored in memory. No verification. No double-check. No sanity check. I had built a pipeline that trusted a single, unreliable data source with financial information.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Fix: Defense in Depth&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I didn't try to make the OCR better. Tesseract and ML Kit are what they are. Instead, I built a three-layer verification system that treats every financial number as unverified until proven otherwise.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Layer 1: Format Validation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before a number is accepted, it must match a valid currency pattern. The regex checks for currency symbols (₦, $, £, €) followed by properly formatted digits. Anything that doesn't match gets rejected instantly.&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
python
pattern = r'[₦$£€]?\s?\d{1,3}(?:,\d{3})*(?:\.\d{2})?'
matches = re.findall(pattern, extracted_text)
if not matches:
    return False, "", "No currency values found"

This alone catches about half the errors garbled text, partial reads, and non-numeric data that OCR sometimes returns.

Layer 2: Double-Read Confirmation

The agent captures two separate screenshots and runs OCR on both independently. If the numbers match, the value is accepted with high confidence. If they differ, a third screenshot is captured and the best-of-three wins.

# Read twice
text1 = extract_text(screenshot1)
text2 = extract_text(screenshot2)

num1 = extract_number(text1)
num2 = extract_number(text2)

if num1 == num2:
    return True, num1, "High confidence"

# Tiebreaker
text3 = extract_text(screenshot3)
num3 = extract_number(text3)

if num1 == num3:
    return True, num1, "Medium confidence (2/3)"
elif num2 == num3:
    return True, num2, "Medium confidence (2/3)"

This catches transient OCR errors—pixel-level variations between screenshots that produce different readings. The cost is 4-6 extra seconds per financial read. The benefit is catching errors that would otherwise silently corrupt data.

Layer 3: Range Validation

Even a correctly formatted, double-confirmed number can be nonsensical. A balance of "₦0" might mean an empty account—or it might mean the OCR failed completely and returned nothing. A balance of "₦999,999,999,999" is almost certainly an error.

if 1 &amp;lt;= value &amp;lt;= 1_000_000_000:
    return True
else:
    return False  # Suspicious. Re-read.

This catches the edge cases—numbers that pass format and double-read checks but are clearly wrong in context.

The Celebration

After implementing all three layers, I re-ran the 50-test battery. The error rate dropped from 20% to 6%. For the specific "₦15,000" test case, 20 out of 20 reads were correct with double-read confirmation.

The agent now succeeds 19 times out of 20 on multi-app financial tasks. The one failure is a timeout (banking app loads slowly on an old device), not a misread. And critically, when verification fails, the agent now knows it failed. It reports low confidence and aborts the task instead of silently sending wrong data.

What This Taught Me

The bug wasn't in the OCR engine. It was in my architecture. I had built a system that trusted a single, unreliable data source with financial information. That wasn't a Tesseract problem. That was a design problem.

The fix wasn't a better model. It was a better process. Three cheap, fast checks that together create confidence where no single check could. Defense in depth applied to data integrity.

This changed how I think about every feature I build. I now ask: "If this component silently returns wrong data, will I know? If not, where's the verification?"

The Code

The full verification system is open source on GitHub:

👉 github.com/Dexter2344/phone-agent

vision.py contains the verify_financial_data() function. agent.py calls it before storing any financial value in task memory.

The Build Log

I've been documenting this project publicly for 17 days on Dev.to. Every breakthrough, every dead end, every "why is this broken" debugging session at 1 AM.

This bug was Day 17. The one that almost shipped. The one that whispered.

It's not the loudest bug I've ever caught. But it's the one that taught me the most.

This is my entry for the Dev.to Smash Stories contest. The Gemma 4 model powers the agent's command parsing and reasoning. The verification layer is my own work.

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>devchallenge</category>
      <category>bugsmash</category>
      <category>ai</category>
      <category>gemma</category>
    </item>
    <item>
      <title>Project Log #17: My Agent Misreads Bank Balances. Here's How I'm Fixing It.</title>
      <dc:creator>Okeke Chukwudubem</dc:creator>
      <pubDate>Sat, 18 Jul 2026 18:21:54 +0000</pubDate>
      <link>https://dev.to/okeke_chukwudubem_5f3bf49/project-log-17-my-agent-misreads-bank-balances-heres-how-im-fixing-it-4egj</link>
      <guid>https://dev.to/okeke_chukwudubem_5f3bf49/project-log-17-my-agent-misreads-bank-balances-heres-how-im-fixing-it-4egj</guid>
      <description>&lt;p&gt;Day 17. OCR on banking apps is unreliable. I built a verification layer that double-checks every number.&lt;/p&gt;

&lt;p&gt;Day 16 was a milestone: multi-app workflows. The agent copied my bank balance and sent it to Mom on WhatsApp. Three apps. One task.&lt;/p&gt;

&lt;p&gt;But behind that success was an uncomfortable truth: the agent misreads numbers about 20% of the time.&lt;/p&gt;

&lt;p&gt;For a message to Mom, that's a typo. For a financial transaction, that's a disaster.&lt;/p&gt;

&lt;p&gt;Today, I built the fix.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Problem&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Banking apps scored F on my accessibility audit. No UI labels. No content descriptions. The agent has to rely entirely on OCR to read anything on screen.&lt;/p&gt;

&lt;p&gt;And banking apps have terrible OCR conditions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Small, condensed fonts for account numbers and balances&lt;/li&gt;
&lt;li&gt;Low contrast (grey text on slightly darker grey backgrounds)&lt;/li&gt;
&lt;li&gt;Currency symbols (₦, $, £) that OCR often confuses with numbers&lt;/li&gt;
&lt;li&gt;Commas in large numbers that OCR sometimes reads as decimals&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The result? A balance of "₦15,000" sometimes gets read as "₦15.000" or "₦15,00" or "₦15000." One missing digit. One wrong decimal. And the entire task is compromised.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Fix: Numeric Verification Layer&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I built a verification step specifically for financial data. Before any number gets stored in task memory, it goes through three checks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Check 1: Format Validation&lt;/strong&gt;&lt;br&gt;
The extracted text must match a valid currency format. It must contain a currency symbol (₦, $, £, €) followed by digits, optionally with commas and a decimal point. Anything that doesn't match this pattern is rejected immediately.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Check 2: Double-Read Confirmation&lt;/strong&gt;&lt;br&gt;
The agent reads the same number twice—two separate screenshots, two separate OCR passes. If both readings match exactly, the number is accepted. If they differ, the agent reads a third time. If two out of three match, that value wins. If all three differ, the task is aborted with an error message.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Check 3: Range Validation&lt;/strong&gt;&lt;br&gt;
The extracted number must fall within a reasonable range. A bank balance of "₦0" or "₦999,999,999,999" is probably an OCR error. The agent checks that the number is between ₦1 and ₦1,000,000,000. Anything outside that range triggers a re-read.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Today's Progress&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Built numeric verification layer&lt;/td&gt;
&lt;td&gt;✅ Done&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tested on banking app balance (50 attempts)&lt;/td&gt;
&lt;td&gt;✅ 94% accuracy (up from ~80%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tested on "₦15,000" specifically (20 attempts)&lt;/td&gt;
&lt;td&gt;✅ 100% accuracy with double-read&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Added verification to &lt;code&gt;vision.py&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;✅ Done&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Updated &lt;code&gt;agent.py&lt;/code&gt; to use verification for financial data&lt;/td&gt;
&lt;td&gt;✅ Done&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;The Results&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before the verification layer: 20% error rate on financial data.&lt;br&gt;
After the verification layer: 6% error rate. Still not perfect, but dramatically better.&lt;/p&gt;

&lt;p&gt;For the specific task of reading a bank balance and sending it to Mom, the agent now succeeds 19 times out of 20. The one failure is usually a timeout (banking app loads slowly) rather than a misread.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What Still Breaks&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The double-read confirmation adds about 4-6 seconds to any task involving financial data. For a 3-app workflow, that's an extra 10-15 seconds. Not a dealbreaker, but noticeable.&lt;/p&gt;

&lt;p&gt;The range validation is crude. A legitimate bank balance of "₦0" (empty account) would be rejected as an error. I need a way to distinguish between "zero" and "OCR failed completely."&lt;/p&gt;

&lt;p&gt;And the verification only works for numbers. Text extraction—names, addresses, transaction descriptions—still has no verification. The agent could send "Mom" the wrong transaction description and have no way of knowing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's Next (Day 18)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add text verification for transaction descriptions&lt;/li&gt;
&lt;li&gt;Test with real financial data (multiple transactions, not just balance)&lt;/li&gt;
&lt;li&gt;Start building the demo video&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The Repo&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;github.com/Dexter2344/phone-agent&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;vision.py&lt;/code&gt; now includes &lt;code&gt;verify_financial_data()&lt;/code&gt; with format validation, double-read confirmation, and range checking. &lt;code&gt;agent.py&lt;/code&gt; calls it before storing any financial data in task memory.&lt;/p&gt;

&lt;p&gt;This is Day 17. The agent is learning to double-check its own work.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>python</category>
      <category>automation</category>
    </item>
    <item>
      <title>Day 16: My AI agent now resets to the home screen between app switches. The first 3-app workflow just worked—banking app summarise WhatsApp. Reliability went from "sometimes" to "almost always."

github.com/Dexter2344/phone-agent</title>
      <dc:creator>Okeke Chukwudubem</dc:creator>
      <pubDate>Tue, 14 Jul 2026 15:08:45 +0000</pubDate>
      <link>https://dev.to/okeke_chukwudubem_5f3bf49/day-16-my-ai-agent-now-resets-to-the-home-screen-between-app-switches-the-first-3-app-workflow-4g10</link>
      <guid>https://dev.to/okeke_chukwudubem_5f3bf49/day-16-my-ai-agent-now-resets-to-the-home-screen-between-app-switches-the-first-3-app-workflow-4g10</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/okeke_chukwudubem_5f3bf49/project-log-16-i-fixed-the-app-switching-problem-that-kept-breaking-my-agent-49em" class="crayons-story__hidden-navigation-link"&gt;Project Log #16: I Fixed the App-Switching Problem That Kept Breaking My Agent&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/okeke_chukwudubem_5f3bf49" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3908265%2F586841bb-154e-4de4-a539-b939b3018c48.jpeg" alt="okeke_chukwudubem_5f3bf49 profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/okeke_chukwudubem_5f3bf49" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Okeke Chukwudubem
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Okeke Chukwudubem
                
              
              &lt;div id="story-author-preview-content-4143275" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/okeke_chukwudubem_5f3bf49" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3908265%2F586841bb-154e-4de4-a539-b939b3018c48.jpeg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Okeke Chukwudubem&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/okeke_chukwudubem_5f3bf49/project-log-16-i-fixed-the-app-switching-problem-that-kept-breaking-my-agent-49em" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jul 14&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/okeke_chukwudubem_5f3bf49/project-log-16-i-fixed-the-app-switching-problem-that-kept-breaking-my-agent-49em" id="article-link-4143275"&gt;
          Project Log #16: I Fixed the App-Switching Problem That Kept Breaking My Agent
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/programming"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;programming&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/productivity"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;productivity&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/okeke_chukwudubem_5f3bf49/project-log-16-i-fixed-the-app-switching-problem-that-kept-breaking-my-agent-49em" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;1&lt;span class="hidden s:inline"&gt;&amp;nbsp;reaction&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/okeke_chukwudubem_5f3bf49/project-log-16-i-fixed-the-app-switching-problem-that-kept-breaking-my-agent-49em#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            3 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>agents</category>
      <category>ai</category>
      <category>mobile</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Project Log #16: I Fixed the App-Switching Problem That Kept Breaking My Agent</title>
      <dc:creator>Okeke Chukwudubem</dc:creator>
      <pubDate>Tue, 14 Jul 2026 15:08:12 +0000</pubDate>
      <link>https://dev.to/okeke_chukwudubem_5f3bf49/project-log-16-i-fixed-the-app-switching-problem-that-kept-breaking-my-agent-49em</link>
      <guid>https://dev.to/okeke_chukwudubem_5f3bf49/project-log-16-i-fixed-the-app-switching-problem-that-kept-breaking-my-agent-49em</guid>
      <description>&lt;p&gt;Day 16. The agent now resets to home between apps. Three-app workflows are working.&lt;/p&gt;

&lt;p&gt;Day 15 was a milestone: my agent completed its first multi-app task. It copied my bank balance and sent it to Mom on WhatsApp. Two apps. One task.&lt;/p&gt;

&lt;p&gt;But behind the scenes, it was fragile. The agent sometimes opened apps to the wrong screen. The banking app would resume from where it left off instead of starting fresh. A notification from the previous app would cover the new one. The task worked—but only sometimes.&lt;/p&gt;

&lt;p&gt;Today, I fixed the foundation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Home Screen Reset&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Between every app switch, the agent now returns to the home screen first. It's a simple &lt;code&gt;adb shell input keyevent KEYCODE_HOME&lt;/code&gt; command. But it solves a cascade of problems.&lt;/p&gt;

&lt;p&gt;Before the reset, here's what would happen:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Agent opens Banking App. Reads balance. ✅&lt;/li&gt;
&lt;li&gt;Agent opens WhatsApp. But WhatsApp was already open in the background on a different chat. ❌&lt;/li&gt;
&lt;li&gt;Agent tries to find "Mom" but it's looking at the wrong screen. ❌&lt;/li&gt;
&lt;li&gt;Task fails. ❌&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;After the reset:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Agent opens Banking App. Reads balance. ✅&lt;/li&gt;
&lt;li&gt;Agent returns to home screen. ✅&lt;/li&gt;
&lt;li&gt;Agent opens WhatsApp from scratch. It loads the main chat list. ✅&lt;/li&gt;
&lt;li&gt;Agent finds "Mom" and sends the message. ✅&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The fix is two lines of code. The reliability improvement is massive.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Today's Progress&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Added &lt;code&gt;go_home()&lt;/code&gt; between all app switches&lt;/td&gt;
&lt;td&gt;✅ Done&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tested "Copy balance → send to Mom" 10 times&lt;/td&gt;
&lt;td&gt;✅ 9/10 success&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tested "Copy address → paste into Maps" 10 times&lt;/td&gt;
&lt;td&gt;✅ 10/10 success&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tested 3-app workflow: "Get last transaction from banking app → summarise → email to accountant"&lt;/td&gt;
&lt;td&gt;✅ First success&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Updated &lt;code&gt;agent.py&lt;/code&gt; with home reset logic&lt;/td&gt;
&lt;td&gt;✅ Done&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;The 3-App Workflow&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The 3-app test was the real challenge. The command: "Get my last transaction from the banking app, summarise it, and send it to my accountant on WhatsApp."&lt;/p&gt;

&lt;p&gt;The agent:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Opened the banking app. Read the last transaction: "₦15,000 debit — Electricity Bill — June 19." ✅&lt;/li&gt;
&lt;li&gt;Stored it in task memory as &lt;code&gt;last_transaction&lt;/code&gt;. ✅&lt;/li&gt;
&lt;li&gt;Returned to home. Opened WhatsApp. ✅&lt;/li&gt;
&lt;li&gt;Found "Accountant" in contacts. ✅&lt;/li&gt;
&lt;li&gt;Retrieved &lt;code&gt;last_transaction&lt;/code&gt; from memory. ✅&lt;/li&gt;
&lt;li&gt;Typed: "Last transaction: ₦15,000 debit for Electricity Bill on June 19." ✅&lt;/li&gt;
&lt;li&gt;Pressed send. ✅&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Three apps. One task. Seven successful steps.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What Still Breaks&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The banking app OCR is still unreliable. On 2 out of 10 tests, the agent misread a digit in the balance. A "₦15,000" became "₦15,000" in one test and "₦15,000" in another—but on the failures, it read "₦15,000" as "₦15,000" or missed a digit entirely. For sending a balance to Mom, that's a typo. For transferring money, that's a disaster.&lt;/p&gt;

&lt;p&gt;I need a verification step specifically for financial data. Something that double-checks the OCR output before storing it in memory. That's the next wall to climb.&lt;/p&gt;

&lt;p&gt;The home screen reset adds about 1.5 seconds between app switches. For a 3-app task, that's 4.5 extra seconds. Not a dealbreaker, but noticeable. I'm experimenting with using &lt;code&gt;adb shell am force-stop&lt;/code&gt; instead of home reset—it's cleaner but takes longer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's Next (Day 17)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add financial data verification step&lt;/li&gt;
&lt;li&gt;Test 5-app workflows&lt;/li&gt;
&lt;li&gt;Start building a demo video of the full pipeline&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The Repo&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;github.com/Dexter2344/phone-agent&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;agent.py&lt;/code&gt; now includes &lt;code&gt;go_home()&lt;/code&gt; between app switches. Task memory handles multi-app data transfer. README updated.&lt;/p&gt;

&lt;p&gt;This is Day 16. The foundation is solid. The walls are going up.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Day 15: My AI agent just completed its first multi-app task. It copied my bank balance from my banking app and sent it to Mom on WhatsApp. Two apps. One task. Fully autonomous. Task memory is the key.

👉 github.com/Dexter2344/phone-agent</title>
      <dc:creator>Okeke Chukwudubem</dc:creator>
      <pubDate>Sat, 11 Jul 2026 22:21:45 +0000</pubDate>
      <link>https://dev.to/okeke_chukwudubem_5f3bf49/day-15-my-ai-agent-just-completed-its-first-multi-app-task-it-copied-my-bank-balance-from-my-4eid</link>
      <guid>https://dev.to/okeke_chukwudubem_5f3bf49/day-15-my-ai-agent-just-completed-its-first-multi-app-task-it-copied-my-bank-balance-from-my-4eid</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/okeke_chukwudubem_5f3bf49/project-log-15-my-ai-agent-just-completed-its-first-multi-app-task-38n7" class="crayons-story__hidden-navigation-link"&gt;Project Log #15: My AI Agent Just Completed Its First Multi-App Task&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/okeke_chukwudubem_5f3bf49" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3908265%2F586841bb-154e-4de4-a539-b939b3018c48.jpeg" alt="okeke_chukwudubem_5f3bf49 profile" class="crayons-avatar__image" width="800" height="735"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/okeke_chukwudubem_5f3bf49" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Okeke Chukwudubem
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Okeke Chukwudubem
                
              
              &lt;div id="story-author-preview-content-4122366" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/okeke_chukwudubem_5f3bf49" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3908265%2F586841bb-154e-4de4-a539-b939b3018c48.jpeg" class="crayons-avatar__image" alt="" width="800" height="735"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Okeke Chukwudubem&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/okeke_chukwudubem_5f3bf49/project-log-15-my-ai-agent-just-completed-its-first-multi-app-task-38n7" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jul 11&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/okeke_chukwudubem_5f3bf49/project-log-15-my-ai-agent-just-completed-its-first-multi-app-task-38n7" id="article-link-4122366"&gt;
          Project Log #15: My AI Agent Just Completed Its First Multi-App Task
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/programming"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;programming&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/productivity"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;productivity&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/okeke_chukwudubem_5f3bf49/project-log-15-my-ai-agent-just-completed-its-first-multi-app-task-38n7#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            3 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>Project Log #15: My AI Agent Just Completed Its First Multi-App Task</title>
      <dc:creator>Okeke Chukwudubem</dc:creator>
      <pubDate>Sat, 11 Jul 2026 22:21:17 +0000</pubDate>
      <link>https://dev.to/okeke_chukwudubem_5f3bf49/project-log-15-my-ai-agent-just-completed-its-first-multi-app-task-38n7</link>
      <guid>https://dev.to/okeke_chukwudubem_5f3bf49/project-log-15-my-ai-agent-just-completed-its-first-multi-app-task-38n7</guid>
      <description>&lt;p&gt;Day 15. The agent switched between two apps, copied data from one, and pasted it into another.&lt;/p&gt;

&lt;p&gt;For 14 days, my AI agent could do one thing well: operate within a single app. Open WhatsApp. Find a contact. Send a message. All within one ecosystem.&lt;/p&gt;

&lt;p&gt;Today, that changed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Milestone&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I gave the agent a command: "Copy my account balance from my banking app and send it to Mom on WhatsApp."&lt;/p&gt;

&lt;p&gt;It opened the banking app. It read the balance from the screen using OCR (since banking apps have zero accessibility labels—F score, remember?). It copied the number. It switched to WhatsApp. It found Mom. It typed the balance. It hit send.&lt;/p&gt;

&lt;p&gt;Two apps. One task. Completed autonomously.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What Made This Possible&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The key was building a task memory system. The agent now stores values extracted from one app in a simple key-value store (a Python dictionary that persists for the duration of the task). When it switches to the next app, it retrieves that value and uses it.&lt;/p&gt;

&lt;p&gt;The flow works like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Parse the command into a plan with Gemma 4.&lt;/li&gt;
&lt;li&gt;Execute Step 1: Open banking app. Read the balance. Store it in memory as &lt;code&gt;account_balance&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Execute Step 2: Open WhatsApp. Find the contact. Retrieve &lt;code&gt;account_balance&lt;/code&gt; from memory. Type it. Send.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The memory system is simple—just a dictionary that gets passed between steps. But it's the bridge between single-app automation and true multi-app workflows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Today's Progress&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Built task memory system (key-value store)&lt;/td&gt;
&lt;td&gt;✅ Done&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tested "Copy balance → send to Mom"&lt;/td&gt;
&lt;td&gt;✅ Success&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tested "Copy address → paste into Maps"&lt;/td&gt;
&lt;td&gt;✅ Success&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Updated &lt;code&gt;agent.py&lt;/code&gt; with multi-app support&lt;/td&gt;
&lt;td&gt;✅ Done&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Added task memory to README&lt;/td&gt;
&lt;td&gt;✅ Done&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;What Still Breaks&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The banking app is slow to load on my phone. Sometimes the agent times out waiting for the balance screen to appear. I added a retry loop, but it's not perfect.&lt;/p&gt;

&lt;p&gt;App switching is clunky. The agent uses &lt;code&gt;adb shell am start&lt;/code&gt; to launch apps, but if the app was already open in the background, it sometimes opens to the wrong screen. I'm working on a "reset to home screen" step between app switches.&lt;/p&gt;

&lt;p&gt;And the OCR on banking app text is unreliable. The font is small. The contrast is low. The agent sometimes misreads the balance by a digit or two. For a task like "send my balance to Mom," that's embarrassing but not catastrophic. For a task like "transfer money," that's dangerous. I need higher accuracy before I can trust this with anything financial.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Bigger Picture&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Multi-app workflows are the difference between a cool prototype and a useful tool. An agent that can only operate in one app is a novelty. An agent that can move data between apps is an assistant.&lt;/p&gt;

&lt;p&gt;The next step is chaining more complex workflows: "Find my last three transactions, summarise them, and email them to my accountant." That's three apps. That's the goal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's Next (Day 16)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add a "reset to home screen" step between app switches&lt;/li&gt;
&lt;li&gt;Improve OCR accuracy on banking apps&lt;/li&gt;
&lt;li&gt;Test a 3-app workflow&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The Repo&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;github.com/Dexter2344/phone-agent&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;agent.py&lt;/code&gt; now includes a task memory system. Multi-app workflows are supported. README updated with Day 15 status.&lt;/p&gt;

&lt;p&gt;This is Day 15. The agent is no longer trapped in one app.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Day 14: I doubled the accessibility audit to 30 apps. The public score list is now on GitHub. Every banking app scored F. WhatsApp, Google, and global apps score A. The pattern is undeniable.</title>
      <dc:creator>Okeke Chukwudubem</dc:creator>
      <pubDate>Mon, 06 Jul 2026 19:38:32 +0000</pubDate>
      <link>https://dev.to/okeke_chukwudubem_5f3bf49/day-14-i-doubled-the-accessibility-audit-to-30-apps-the-public-score-list-is-now-on-github-every-cip</link>
      <guid>https://dev.to/okeke_chukwudubem_5f3bf49/day-14-i-doubled-the-accessibility-audit-to-30-apps-the-public-score-list-is-now-on-github-every-cip</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/okeke_chukwudubem_5f3bf49/project-log-14-i-scored-30-apps-on-accessibility-heres-the-public-list-3cfg" class="crayons-story__hidden-navigation-link"&gt;Project Log #14: I Scored 30 Apps on Accessibility. Here's the Public List.&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/okeke_chukwudubem_5f3bf49" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3908265%2F586841bb-154e-4de4-a539-b939b3018c48.jpeg" alt="okeke_chukwudubem_5f3bf49 profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/okeke_chukwudubem_5f3bf49" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Okeke Chukwudubem
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Okeke Chukwudubem
                
              
              &lt;div id="story-author-preview-content-4082384" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/okeke_chukwudubem_5f3bf49" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3908265%2F586841bb-154e-4de4-a539-b939b3018c48.jpeg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Okeke Chukwudubem&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/okeke_chukwudubem_5f3bf49/project-log-14-i-scored-30-apps-on-accessibility-heres-the-public-list-3cfg" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jul 6&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/okeke_chukwudubem_5f3bf49/project-log-14-i-scored-30-apps-on-accessibility-heres-the-public-list-3cfg" id="article-link-4082384"&gt;
          Project Log #14: I Scored 30 Apps on Accessibility. Here's the Public List.
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/automation"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;automation&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/agents"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;agents&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/okeke_chukwudubem_5f3bf49/project-log-14-i-scored-30-apps-on-accessibility-heres-the-public-list-3cfg" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;1&lt;span class="hidden s:inline"&gt;&amp;nbsp;reaction&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/okeke_chukwudubem_5f3bf49/project-log-14-i-scored-30-apps-on-accessibility-heres-the-public-list-3cfg#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            2 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>a11y</category>
      <category>devjournal</category>
      <category>mobile</category>
      <category>testing</category>
    </item>
    <item>
      <title>Project Log #14: I Scored 30 Apps on Accessibility. Here's the Public List.</title>
      <dc:creator>Okeke Chukwudubem</dc:creator>
      <pubDate>Mon, 06 Jul 2026 19:37:12 +0000</pubDate>
      <link>https://dev.to/okeke_chukwudubem_5f3bf49/project-log-14-i-scored-30-apps-on-accessibility-heres-the-public-list-3cfg</link>
      <guid>https://dev.to/okeke_chukwudubem_5f3bf49/project-log-14-i-scored-30-apps-on-accessibility-heres-the-public-list-3cfg</guid>
      <description>&lt;p&gt;Day 14. The audit doubled in size. The accessibility score list is now public on GitHub.&lt;/p&gt;

&lt;p&gt;Last week, I published my first accessibility audit. 15 apps. A simple A-to-F score. The response surprised me.&lt;/p&gt;

&lt;p&gt;Developers reached out asking how their apps scored. A few wanted to know how to improve. One person told me they'd never thought about accessibility labels before reading my build log.&lt;/p&gt;

&lt;p&gt;So I spent the next few days doubling the audit. 30 apps. Same methodology. Same scoring system. The results are now public on GitHub.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Expanded Audit&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I added 15 more apps across new categories. Health apps. Education apps. Government services. More local apps.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Best Apps (A/B)&lt;/th&gt;
&lt;th&gt;Worst Apps (D/F)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Messaging&lt;/td&gt;
&lt;td&gt;WhatsApp, Telegram, Google Messages&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Email&lt;/td&gt;
&lt;td&gt;Gmail, Outlook&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Productivity&lt;/td&gt;
&lt;td&gt;Slack, Notion, Google Calendar&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Navigation&lt;/td&gt;
&lt;td&gt;Google Maps, Waze&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Banking&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;5 out of 5 tested scored F&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Health&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;3 out of 4 scored D or F&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Government&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;4 out of 4 scored F&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Food Delivery&lt;/td&gt;
&lt;td&gt;Uber Eats, Deliveroo&lt;/td&gt;
&lt;td&gt;Local apps scored D&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Education&lt;/td&gt;
&lt;td&gt;Duolingo, Khan Academy&lt;/td&gt;
&lt;td&gt;Local education apps scored D&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The pattern held. Global apps score high. Local apps score low. Every single banking app tested scored an F.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Public List&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I've published the full accessibility score list on GitHub. It's in the README under a new section called "Accessibility Audit."&lt;/p&gt;

&lt;p&gt;Each app gets:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A letter grade (A through F)&lt;/li&gt;
&lt;li&gt;A short explanation of why it scored that way&lt;/li&gt;
&lt;li&gt;Whether the UI tree is navigable by screen readers&lt;/li&gt;
&lt;li&gt;Whether my agent can automate it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This list is now the most detailed public resource I know of that connects AI agent capability to accessibility compliance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What This Means for Developers&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you're building a mobile app, here's what you should know:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Accessibility labels are not optional.&lt;/strong&gt; They're not a "nice to have." They determine whether millions of visually impaired users can use your app—and increasingly, whether AI agents can interact with it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Adding labels is not hard.&lt;/strong&gt; A single &lt;code&gt;content-desc&lt;/code&gt; attribute on a button takes seconds to add. The reason most apps score F is not technical difficulty. It's that nobody prioritised it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The gap is a business opportunity.&lt;/strong&gt; An app that scores A is usable by more humans AND more machines. As AI agents become more common, accessible apps will have an automation advantage.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;What's Next (Day 15)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Start reaching out to developers of F-scoring apps with specific, actionable feedback&lt;/li&gt;
&lt;li&gt;Add a "How to Improve Your Score" guide to the repo&lt;/li&gt;
&lt;li&gt;Begin testing whether my agent can now handle multi-app workflows (e.g., "Copy my bank balance from the banking app and send it to Mom on WhatsApp")&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The Repo&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;github.com/Dexter2344/phone-agent&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The accessibility audit is now a permanent section of the README. 30 apps scored. Public. Free. For anyone to use.&lt;/p&gt;

&lt;p&gt;This is Day 14. The list is out. The conversation is starting.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>automation</category>
      <category>agents</category>
    </item>
    <item>
      <title>Day 12: I took a week off from coding to audit 15 Android apps for accessibility. WhatsApp and Google apps are fully automatable. Local banking and government apps? Completely invisible. My AI agent is becoming an accessibility audit tool.</title>
      <dc:creator>Okeke Chukwudubem</dc:creator>
      <pubDate>Sat, 04 Jul 2026 23:14:38 +0000</pubDate>
      <link>https://dev.to/okeke_chukwudubem_5f3bf49/day-12-i-took-a-week-off-from-coding-to-audit-15-android-apps-for-accessibility-whatsapp-and-3kom</link>
      <guid>https://dev.to/okeke_chukwudubem_5f3bf49/day-12-i-took-a-week-off-from-coding-to-audit-15-android-apps-for-accessibility-whatsapp-and-3kom</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/okeke_chukwudubem_5f3bf49/project-log-12-i-spent-a-week-auditing-apps-the-results-changed-this-project-3h62" class="crayons-story__hidden-navigation-link"&gt;Project Log #12: I Spent a Week Auditing Apps. The Results Changed This Project.&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/okeke_chukwudubem_5f3bf49" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3908265%2F586841bb-154e-4de4-a539-b939b3018c48.jpeg" alt="okeke_chukwudubem_5f3bf49 profile" class="crayons-avatar__image" width="800" height="735"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/okeke_chukwudubem_5f3bf49" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Okeke Chukwudubem
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Okeke Chukwudubem
                
              
              &lt;div id="story-author-preview-content-4069608" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/okeke_chukwudubem_5f3bf49" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3908265%2F586841bb-154e-4de4-a539-b939b3018c48.jpeg" class="crayons-avatar__image" alt="" width="800" height="735"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Okeke Chukwudubem&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/okeke_chukwudubem_5f3bf49/project-log-12-i-spent-a-week-auditing-apps-the-results-changed-this-project-3h62" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jul 4&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/okeke_chukwudubem_5f3bf49/project-log-12-i-spent-a-week-auditing-apps-the-results-changed-this-project-3h62" id="article-link-4069608"&gt;
          Project Log #12: I Spent a Week Auditing Apps. The Results Changed This Project.
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/programming"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;programming&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/productivity"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;productivity&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/okeke_chukwudubem_5f3bf49/project-log-12-i-spent-a-week-auditing-apps-the-results-changed-this-project-3h62#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            3 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>a11y</category>
      <category>ai</category>
      <category>android</category>
      <category>devjournal</category>
    </item>
    <item>
      <title>Project Log #12: I Spent a Week Auditing Apps. The Results Changed This Project.</title>
      <dc:creator>Okeke Chukwudubem</dc:creator>
      <pubDate>Sat, 04 Jul 2026 23:14:06 +0000</pubDate>
      <link>https://dev.to/okeke_chukwudubem_5f3bf49/project-log-12-i-spent-a-week-auditing-apps-the-results-changed-this-project-3h62</link>
      <guid>https://dev.to/okeke_chukwudubem_5f3bf49/project-log-12-i-spent-a-week-auditing-apps-the-results-changed-this-project-3h62</guid>
      <description>&lt;p&gt;Day 12. I tested 15 popular Android apps for accessibility. What I found revealed who gets left behind.&lt;/p&gt;

&lt;p&gt;I took a week off from coding.&lt;/p&gt;

&lt;p&gt;Not because I was stuck. Not because I was tired. But because I needed to understand something that had been nagging at me since Day 10.&lt;/p&gt;

&lt;p&gt;Why does my AI agent work flawlessly on WhatsApp but completely fail on my banking app?&lt;/p&gt;

&lt;p&gt;The answer took a week of testing, documenting, and thinking. And what I found changed the direction of this entire project.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Week-Long Audit&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I tested 15 popular Android apps. For each one, I asked the same question: "Can my agent find and tap a core button using the UI tree?"&lt;/p&gt;

&lt;p&gt;I spent hours opening apps, dumping UI hierarchies, parsing XML, and documenting every content description I could find. I wasn't coding. I was investigating.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;App&lt;/th&gt;
&lt;th&gt;UI Tree Labels&lt;/th&gt;
&lt;th&gt;Agent Can Automate?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;WhatsApp&lt;/td&gt;
&lt;td&gt;Excellent&lt;/td&gt;
&lt;td&gt;✅ Fully&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google Messages&lt;/td&gt;
&lt;td&gt;Excellent&lt;/td&gt;
&lt;td&gt;✅ Fully&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gmail&lt;/td&gt;
&lt;td&gt;Excellent&lt;/td&gt;
&lt;td&gt;✅ Fully&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google Maps&lt;/td&gt;
&lt;td&gt;Excellent&lt;/td&gt;
&lt;td&gt;✅ Fully&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Spotify&lt;/td&gt;
&lt;td&gt;Good&lt;/td&gt;
&lt;td&gt;✅ Mostly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Slack&lt;/td&gt;
&lt;td&gt;Good&lt;/td&gt;
&lt;td&gt;✅ Mostly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Banking App A&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;❌ Completely blind&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Banking App B&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;❌ Completely blind&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Banking App C&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;❌ Completely blind&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Local Food Delivery App&lt;/td&gt;
&lt;td&gt;Minimal&lt;/td&gt;
&lt;td&gt;❌ Mostly blind&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Government Service App&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;❌ Completely blind&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Telecom App&lt;/td&gt;
&lt;td&gt;Minimal&lt;/td&gt;
&lt;td&gt;❌ Mostly blind&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The pattern was impossible to ignore. Global apps had rich accessibility labels. Local apps had nothing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What This Actually Means&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here's the truth I wasn't ready for.&lt;/p&gt;

&lt;p&gt;Accessibility labels exist so that screen readers can tell blind and visually impaired users what's on their screen. When a developer adds &lt;code&gt;content-desc="Send message"&lt;/code&gt; to a button, they're helping a blind person use WhatsApp.&lt;/p&gt;

&lt;p&gt;WhatsApp invested in accessibility. Google invested in accessibility. Their apps are usable by millions of people with disabilities—and, accidentally, by my AI agent.&lt;/p&gt;

&lt;p&gt;The local apps that skipped accessibility didn't just lock out my agent. They locked out every blind and visually impaired person who needs to use that banking app, that government service, that telecom platform.&lt;/p&gt;

&lt;p&gt;My AI agent is not the victim here. It's a canary in a coal mine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Accessibility Divide&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This divide follows a clear pattern. Global tech companies with large engineering teams and legal departments prioritise accessibility. They have dedicated accessibility engineers. They test with screen readers. They follow WCAG guidelines.&lt;/p&gt;

&lt;p&gt;Local apps, often built by smaller teams with tighter budgets, deprioritise accessibility. It's seen as a "nice to have" rather than a core requirement. The result is an entire class of applications that are unusable by people with disabilities—and by AI agents.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I'm Doing About It&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I'm adding an accessibility score to every app my agent supports. A simple A-F rating.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt; — Fully automatable. Rich labels everywhere. (WhatsApp, Google apps)&lt;br&gt;
&lt;strong&gt;B&lt;/strong&gt; — Mostly automatable. Good labels with some gaps. (Spotify, Slack)&lt;br&gt;
&lt;strong&gt;C&lt;/strong&gt; — Partially automatable. Some labels, mostly generic.&lt;br&gt;
&lt;strong&gt;D&lt;/strong&gt; — Mostly blind. Few labels. Heavy reliance on OCR fallback.&lt;br&gt;
&lt;strong&gt;F&lt;/strong&gt; — Completely inaccessible. No labels. Unusable by both AI and screen readers.&lt;/p&gt;

&lt;p&gt;This score isn't just for my agent. It's a public signal. If your app scores an F, you're not just failing my project. You're failing every visually impaired person who tries to use your service.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's Next (Day 13)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Expand the audit to 30+ apps&lt;/li&gt;
&lt;li&gt;Publish the first version of the accessibility score list&lt;/li&gt;
&lt;li&gt;Start reaching out to local app developers about their accessibility gaps&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The Repo&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;github.com/Dexter2344/phone-agent&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The audit results are being added to the README. The scoring system is documented.&lt;/p&gt;

&lt;p&gt;This is Day 12. I spent a week not writing code. And it was the most productive week of this entire project.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Day 12: My AI agent can control WhatsApp perfectly. But banking apps? Invisible. The difference is accessibility labels. Apps built for blind users are automatable. Apps that skip accessibility lock out both humans and ai.</title>
      <dc:creator>Okeke Chukwudubem</dc:creator>
      <pubDate>Tue, 30 Jun 2026 13:49:34 +0000</pubDate>
      <link>https://dev.to/okeke_chukwudubem_5f3bf49/day-12-my-ai-agent-can-control-whatsapp-perfectly-but-banking-apps-invisible-the-difference-is-3ek6</link>
      <guid>https://dev.to/okeke_chukwudubem_5f3bf49/day-12-my-ai-agent-can-control-whatsapp-perfectly-but-banking-apps-invisible-the-difference-is-3ek6</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/okeke_chukwudubem_5f3bf49/project-log-12-the-apps-my-ai-agent-cant-see-3918" class="crayons-story__hidden-navigation-link"&gt;Project Log #12: The Apps My AI Agent Can't See&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/okeke_chukwudubem_5f3bf49" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3908265%2F586841bb-154e-4de4-a539-b939b3018c48.jpeg" alt="okeke_chukwudubem_5f3bf49 profile" class="crayons-avatar__image" width="800" height="735"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/okeke_chukwudubem_5f3bf49" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Okeke Chukwudubem
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Okeke Chukwudubem
                
              
              &lt;div id="story-author-preview-content-4031792" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/okeke_chukwudubem_5f3bf49" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3908265%2F586841bb-154e-4de4-a539-b939b3018c48.jpeg" class="crayons-avatar__image" alt="" width="800" height="735"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Okeke Chukwudubem&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/okeke_chukwudubem_5f3bf49/project-log-12-the-apps-my-ai-agent-cant-see-3918" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jun 30&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/okeke_chukwudubem_5f3bf49/project-log-12-the-apps-my-ai-agent-cant-see-3918" id="article-link-4031792"&gt;
          Project Log #12: The Apps My AI Agent Can't See
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/programming"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;programming&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/productivity"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;productivity&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/okeke_chukwudubem_5f3bf49/project-log-12-the-apps-my-ai-agent-cant-see-3918#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            2 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>a11y</category>
      <category>agents</category>
      <category>ai</category>
      <category>automation</category>
    </item>
  </channel>
</rss>
