TC$mC$ on klassinen "robotti teki tC$smC$lleen niin kuin kC$skettiin, ei niin
kuin tarkoitettiin" -tilanne! Analysoidaanpa tarkasti, mitC$ C$sken tapahtui:
MitC$ tapahtui?
Ohjelma klikkasi koordinaatteihin X:32, Y:966.
X-koordinaatti 32 tarkoittaa, ettC$ hiiri iski aivan ruudun vasempaan laitaan
eli sivuvalikkoon (Sidebar), ei suinkaan keskelle ruutua tekstikentC$n
viereen!
Miksi nC$in kC$vi?
Koodissamme oli looginen sokea piste run_semantic_anchor -funktiossa. Se toimi
nC$in:
* Se lC6ysi oikean tekstiankkurin ("Kirjoita viesti") esimerkiksi
koordinaatista Y:993.
* Sitten se alkoi kC$ydC$ lC$pi ruudun ikoneita ja etsiC$ "paperclip"-sanaa.
* Koska AST-jC$rjestelmC$ lukee aina Frame 1 (Sidebar) ennen Frame 2 (Main
Content), se tC6rmC$si listassa sivuvalikossa olevaan ikoniin (joka oli X:17,
Y:953 ja jonka CLIP oli jossain vaiheessa merkannut 60% varmuudella
klemmariksi).
* Koodi katsoi sC$C$ntC6C$: "Onko Y-akselien ero alle 50px?" (993 - 953 =
40). KyllC$ on!
* Koodi palautti tC$mC$n ensimmC$isen lC6ytC$mC$nsC$ ikonin heti, eikC$
tarkistanut X-akselin etC$isyyttC$ lainkaan.
Korjaus 1: Valitaan oikeasti lC$hin ikoni
MeidC$n pitC$C$ muuttaa logiikkaa niin, ettC$ koodi ei ota ensimmC$istC$
osumaa, vaan laskee oikean 2D-etC$isyyden (X ja Y) ankkuriin, ja valitsee sen
ikonin, joka on kaikkein lC$himpC$nC$ tekstikenttC$C$.
Korvaa routine_engine.py -tiedostossa vanha run_semantic_anchor -funktion
loppuosa (vaihe 3) tC$llC$ pC$ivitetyllC$ versiolla:
# 3. EtsitC$C$n kohde-ikoni ankkurin lC$heltC$ (Lasketaan
absoluuttisesti LCHIN)
target_icon = selector['target_icon']
y_tol = selector.get('y_tolerance', 50)
best_match = None
min_dist = float('inf')
for node in enriched_nodes:
if node['type'] == 'IconNode' and target_icon in node['content']:
nx, ny, nw, nh = node['box']
ax, ay, aw, ah = anchor_node['box']
# Varmistetaan ensin, ettC$ olemme edes samalla Y-rivillC$
if abs(ny - ay) <= y_tol:
# Lasketaan euklidinen etC$isyys (suora viiva) ankkurista
ikoniin
dist = ((nx - ax)**2 + (ny - ay)**2)**0.5
if dist < min_dist:
min_dist = dist
best_match = node
if best_match:
print(f" [+] LC6ytyi lC$hin '{target_icon}' ankkurin vierestC$
(EtC$isyys: {min_dist:.0f}px)!")
nx, ny, nw, nh = best_match['box']
center_x = nx + nw // 2
center_y = ny + nh // 2
# Leikataan kuva self-healing-toimintoa varten
pad = 5
crop_y1, crop_y2 = max(0, ny-pad), min(cv_img.shape[0], ny+nh+pad)
crop_x1, crop_x2 = max(0, nx-pad), min(cv_img.shape[1], nx+nw+pad)
icon_crop = cv_img[crop_y1:crop_y2, crop_x1:crop_x2]
return (center_x, center_y), icon_crop
print(f" [-] Kohdetta '{target_icon}' ei lC6ytynyt ankkurin
lC$heltC$.")
return None, None
Korjaus 2: Poista C$sken tallennettu virheellinen template!
Koska moottori on itsestC$C$n parantuva (self-healing), se kerkesi jo
tallentaa tuon vC$C$rC$n (X:32) sivuvalikon ikonin kuvan itselleen talteen!
Jos ajat ohjelman nyt uudestaan, se yrittC$C$ kC$yttC$C$ sitC$
pikselimC$tsC$ykseen.
Tuhoa se ajamalla pC$C$tteessC$:
rm /tmp/bot_templates/attach_btn.png
YlimC$C$rC$inen tarkistus (WhatsAppin muuttunut UI)
WhatsApp on viimeaikoina joillakin kC$yttC$jillC$ vaihtanut syC6ttC6kentC$n
vieressC$ olevan klemmarin Plussa-ikoniksi (+). Jos sinun ruudullasi on plussa
eikC$ klemmaria:
* LisC$C$ master_parser.py -tiedoston ylC$reunan ICON_LABELS -listaan: "a
plus icon".
* Vaihda whatsapp_routine.yaml -tiedostoon targetiksi: "a plus icon".
Aja koodi uudelleen, kun olet poistanut vC$C$rC$n kuvan ja pC$ivittC$nyt
logiikan. Nyt sen on matemaattisesti pakko valita juuri se ikoni, joka makaa
aivan "Kirjoita viesti" -tekstin kyljessC$!