ESP32-S3 Bench Guide
ESP32‑S3 N16R8 벤치 가이드: 실시간 핀아웃, 강의, 시뮬레이터 및 벤치 로그
57개의 무료 교육 게임(체스·코딩·수학·단어·기억·온라인 멀티플레이 11종) 회원 없이 브라우저에서 바로 플레이
57 ücretsiz eğitici oyun: satranç, kodlama, matematik, kelime, hafıza ve 11 online çok oyunculu oyun. Üyeliksiz, tarayıcıda oynanır.
교육HTML · JavaScriptGitHub @emregunay212-cyber온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기ChildsPlayLogic - Oyun Bahcesi | 20+ free educational games for kids: Chess, Coding, Math, Penalty, LEGO World 3D & more. Online multiplayer supported.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Bilnet Okulları'nın 4-12 yaş için ücretsiz, üyeliksiz, tarayıcıda çalışan eğitici oyun platformu — vanilla HTML/JS/CSS, derleme adımı yok. 48 tek kişilik + 10 online = 58 oynanabilir oyun, 2 kapalı (data/games.json: 58 kayıt = 49 solo + 11 online, kod-macerasi/satranc iki sürümlü; Kelime Madeni 3D ve Ateş & Buz active: false). Hub dört yaş rafına ayrılır (Anaokulu 4-6 · 1-2. Sınıf · 3-4. Sınıf · 5-6. Sınıf; oyun yaş aralığının kestiği her rafta görünür), öğretmen görünümü kazanım + süre + arama ekler (B2b).README 전문 보기 ↗
Bilnet Okulları'nın 4-12 yaş için ücretsiz, üyeliksiz, tarayıcıda çalışan eğitici oyun platformu — vanilla HTML/JS/CSS, derleme adımı yok. 49 tek kişilik + 11 online = 60 oynanabilir oyun, 1 kapalı (
data/games.json: 59 kayıt = 50 solo + 11 online,kod-macerasi/satranciki sürümlü; Kelime Madeni 3Dactive: false). Hub dört yaş rafına ayrılır (Anaokulu 4-6 · 1-2. Sınıf · 3-4. Sınıf · 5-6. Sınıf; oyun yaş aralığının kestiği her rafta görünür), öğretmen görünümü kazanım + süre + arama ekler (B2b).
Depo: github.com/emregunay212-cyber/childsplaylogic · dal master · canlı: Vercel (master'a push = otomatik deploy).
Bu dosya (ve tüm *.md) .vercelignore ile yayın dışıdır.
| Yol | Ne | Not |
|---|---|---|
data/games.json | Oyun bilgisinin TEK kaynağı (B2a): slug, ad, modül, bölüm, ders, yaş, süre, kazanım, metinler, yıldız eşiği, online sürüm, tembel yükleme dosyaları; sections = hub bölümleri; shelves = yaş rafları (B2b: ages kapalı tam yaş aralığı, etiket) | Alan sözlüğü docs/inceleme-2026-09-15/kanit/B2a-veri-notlari.md; yayında açık (/data/games.json) |
tools/build-catalog.js | JSON → js/catalog.js (GAME_SHELVES/GAME_SECTIONS/GAME_CATALOG/GAME_MODULES, ÜRETİLMİŞ) + index.html altbilgi grupları (<!-- catalog:start/end -->), altbilgi giriş cümlesi (catalog:lead) ve SEO bloğu (catalog:seo: oyun sayıları, raf dağılımı, adlar); şema doğrular; --check fark varsa çıkış 1 | npm run catalog / catalog:check; bağımlılıksız; .vercelignore ile yayın dışı |
index.html + js/app.js | Hub (SPA). Kayıt defteri gameCategoryDefs/mpGameDefs GAME_CATALOG'dan türetilir — her oyun tembel thunk { game: GAME_MODULES[ad], id, levels, files, color: var(--kat-<bölüm>), comingSoon: !active, name, section, subject, age, minutes, teaches }; resolveModule() bozuk modülü yalnız kendi kartından düşürür. Hub çizimi (B2b): yaş rafı çipleri (bo_shelf) × kategori çipleri, "Devam et" satırı (Progress v2 lastPlayed), öğretmen anahtarı (bo_teacher: kazanım + süre + ders çipleri + arama) — sözleşme CLAUDE.md | Derin bağlantı: /?oyun=<slug> (tryDeepLink) |
js/games/<id>.js | Oyun modülü. Ya hub içinde doğrudan çalışır (const id = '<slug>', init/destroy) ya da games/<id>/index.html'i iframe'e gömen sarmalayıcıdır (örn. js/games/bilgi-ciftligi.js). Balon Labirenti üç dosyadır: balon-labirenti-fizik.js (saf, deterministik fizik) + balon-labirenti-levels.js (30 labirent + cozum) + modül; tools/balon-labirenti-coz.js çözüm tarayıcı. Klavye Kâşifi üç dosyadır: klavye-dizilim.js (ortak Türkçe Q dizilimi, On Parmak'la paylaşılır) + klavye-kasifi-icerik.js (6 kısım × 39 bölüm içerik) + modül. On Parmak (7 kısım × 102 bölüm) dokuz dosyadır (+ ortak klavye-dizilim.js) — aşağıdaki satır | 77 dosya |
games/<id>/ | iframe'de çalışan bağımsız oyunlar (27); hepsi noindex + canonical /oyunlar/<id>/ (PR #15). 20 eğitsel oyun (B5): index.html + game.js (satır içi script 0), kit games/_shared/ | Bazılarında kaynak/ + build.py ya da tools/ — üretilen index.html elle düzenlenmez |
games/_shared/edu-kit.js + edu-kit.css | Eğitsel iframe oyunlarının ortak çekirdeği (B5): window.EduKit — tek AudioContext + tone, pick/shuffle/randInt, window.storage köprüsü, onHidden (visibilitychange + pagehide), toast; CSS: tokens.css kopyası :root (ham hex yalnız burada), :focus-visible, reduced-motion | API sözleşmesi CLAUDE.md; npm run test:edu-kit (kit + satır içi script 0 + CSP provası); üretilmiş değil, elle düzenlenir |
js/games/klavye-dizilim.js, on-parmak-olcum.js, on-parmak-icerik.js, on-parmak-ekran.js, on-parmak-oyun-ortak.js, on-parmak-balon.js, on-parmak-canavar.js, on-parmak-baloncuk.js, on-parmak-elma.js, on-parmak.js + css/on-parmak.css | On Parmak (on parmak klavye; 7 kısım, 102 bölüm: orta/üst/alt sıra, büyük harf, rakamlar, noktalama, akıcı yazma): klavye-dizilim.js Türkçe Q dizilimi + parmak haritası + karakterOf (fiziksel tuş = konum; Kâşifi ile ortak), -olcum doğruluk/hız/yıldız (saf), -icerik kısım/bölüm verisi, -ekran klavye + eller tek SVG, -oyun-ortak mini oyun döngüsü/hız/RNG + ortak sahne yardımcıları ve oyun kabuğu, -balon Balon Vadisi, -canavar Canavar Saldırısı, -baloncuk Uçan Baloncuklar, -elma Elma Bekçisi (ilk kez Kısım 2'de), on-parmak.js modül (yükleme sırası bu); sahne renkleri yalnız css/on-parmak.css'te | Sözleşme CLAUDE.md "On Parmak"; npm run test:on-parmak; açılış sonraki adımlarda |
js/lock-catalog.js | Kilit listesi + yıldız eşikleri (GAME_CATALOG'dan türetilir; API aynı: SOLO_GAMES/ONLINE_GAMES/LOCK_CATALOG/LOCK_STARS_BY_KEY); hub ve admin paneli bunu okur | Eşik = JSON stars / online.stars; 0 = açık |
js/auth.js, js/firebase-config.js, js/multiplayer.js, js/lobby.js | Google girişi / misafir modu, users/{uid}/gameSaves bulut senkronu (GAME_SAVE_KEYS), Firebase Realtime Database lobi/oda | Firestore yok |
js/bilnet-meta.js | Eğitsel meta katman: jeton (DAILY_CAP = 50), giriş serisi, rozetler — istemci tarafı | |
js/hub-ia.js | Hub bilgi mimarisi yardımcıları (B2b): raf üyeliği (GAME_SHELVES), bo_shelf/bo_teacher tercihleri, aksan + İ/ı duyarsız arama katlaması ve sözcük-başlangıcı eşleşmesi, çip grubu (role=radiogroup, ok tuşları) ve kart grubu (roving tabindex; ızgarada Yukarı/Aşağı) klavye | Test tests/hub-ia.spec.js |
js/dialog.js | Tek modal/katman API'si (B3): Dialog.open/close/isOpen/fromKeyboard — <dialog> + showModal() (yedek yol: open + elle odak döngüsü), kardeşler inert, Escape/Tab/odak dönüşü tek yerde; kilit penceresi, meta panel, seviye tamamlama ve hesap menüsü (modal:false) bunu kullanır | Sözleşme CLAUDE.md; test tests/dialog.spec.js |
seo/games_data.py | GAMES = data/games.json yükler (also_online türetir) + STATIC_PAGES (gizlilik/hakkında/iletişim HTML içeriği) | active: false → noindex, sitemap/hub dışı |
seo/build_seo.py | Üretici: oyunlar/<slug>/index.html (59), oyunlar/index.html (B2b §3.11: yaş × kategori süzgeci JS'siz, radio + CSS :has(); kartlar hub anatomisinde, kazanım hep açık), sitemap.xml, llms.txt | Üretilenler elle düzenlenmez |
css/ | tokens.css (tasarım token'ları, B1 — her sayfada ilk stylesheet; kaynak docs/tasarim-sozlesmesi.md), main.css, hub.css, landing.css, games.css, multiplayer.css, admin.css, imza.css (hub kabuğu: ham hex yok, yalnız var(--…)), oyun başına <slug>.css (kendi temalı; B1'de dokunulmadı) | |
assets/images/hub/<slug>.svg | Hub kart görselleri v2 (128×128, rx 28, sahne dili; B2b) · assets/images/categories/*.svg kategori simgeleri v2 · assets/maskot/bulut-{mutlu,uyuyan}.svg maskot (marka onayı bekliyor) | klavye-kasifi.svg eski set (v2'si yok) |
admin.html + js/admin.js | Öğretmen/yönetici paneli: oyun kilitle-aç, ilerleme sıfırla → RTDB adminConfig | |
tests/, playwright.config.js, eslint.config.js, .github/workflows/ci.yml | Lint + Playwright duman testi + CI (PR #19) | |
tools/build.js (+ tools/lib/) | Deploy anında içerik hash'li önbellek kırma: her yerel js/css/html başvurusu ?h=<hash> (A10b). --out .build-check kopyaya üretir, --check çıktıyı doğrular | Vercel buildCommand; bağımlılıksız, Node ≥ 20; .vercelignore'a eklenmez |
js/lib/ | Vendor kütüphaneler, değiştirilmemiş kopyalar: chess.0.10.3.min.js (BSD-2), GLTFLoader.r128.js (MIT), stockfish.js (GPL-3); README.md kaynak URL + sha256 + lisans tablosu, LICENSES/ metinler (B8a). three.min.js r128 B6'ya kadar cdnjs'te | Lint dışı; build ?h= ekler; Firebase SDK vendor değil — gstatic + SRI |
tools/sri-check.js | index.html/admin.html'deki dış <script integrity> hash'lerini indirip yeniden hesaplar; uyuşmazlık → çıkış 1; --print güncel değerleri yazar (yenileme) | npm run sri:check (CI'da); bağımlılıksız; .vercelignore ile yayın dışı |
docs/inceleme-2026-09-15/, plans/ | 15 Eylül 2026 denetim raporları ve düzeltme blueprint'i | |
fabrika/ | Eğitsel olmayan oyunların tek dosyalık satış build'leri (ayrı README) | Yayın dışı |
python server.py # http://localhost:8000 — no-store başlıkları, thread'li (BASLAT-SERVER.bat aynı şey)
node tests/static-server.js --port 8765 # bağımlılıksız Node alternatifi (Playwright bunu kullanır)
Derleme yok; dosyayı düzenle, sayfayı yenile. Önbellek kırma deploy anında olur (A10b): Vercel node tools/build.js --check çalıştırır; her yerel js/css/html başvurusuna (index.html/admin.html/games/*/index.html etiketleri, js/catalog.js tembel yükleme files listeleri, iframe sarmalayıcıları, games/ates-buz ES-modül import'ları, js/lib/stockfish.js) içerik hash'i ?h=<sha256 ilk 10> eklenir; js/css immutable 1 yıl önbelleklenir. Depodaki ?v=N etiketleri isteğe bağlıdır — artık elle artırılmaz, build ne bulursa hash ile değiştirir.
npm ci # Node 20 (CI ile aynı)
npx playwright install chromium # ilk kurulumda bir kez
npm run lint # eslint js/ games/ tools/ — no-undef hata, no-unused-vars uyarı
npm run catalog:check # data/games.json şeması + js/catalog.js ve index.html altbilgisi güncel mi (CI koşar)
npm run sri:check # Firebase SDK (gstatic) integrity hash'leri hâlâ doğru mu (CI koşar); yenileme: node tools/sri-check.js --print
npm run build:check # deploy simülasyonu: kök → .build-check (hash'li), çıktı doğrulanır (?v= kalıntısı/eski hash = hata)
npm run test:build # tools/build.js birim testleri (idempotence, döngü, eksik dosya, --out)
npm run test:smoke # her aktif oyun /?oyun=<slug> ile açılır, 3 sn hatasız çalışmalı (62 test)
npm run test:dialog # js/dialog.js: dört katmanda odak/Tab/Escape/inert + yedek yol + erişilebilirlik ağacı (14 test, B3)
npm run test:edu-kit # 20 eğitsel iframe oyunu: hub iframe + bağımsız açılış + CSP provası (script-src self, satır içi ihlal 0), edu-kit.css token eşitliği (63 test)
npm run test:hub-ia # hub bilgi mimarisi (B2b): yaş rafı, çipler, öğretmen anahtarı, arama, klavye, kart durumları (sahte Firebase adminConfig), /oyunlar/ süzgeci (13 test)
npm run test:balon # Balon Labirenti: 30 labirent × 9 tolerans varyantı deterministik fizikte çözülür (tarayıcısız) + canlı çekiş/ıska/ipucu, klavye, hub'a dönüş sızıntısız (6 test)
npm run test:ates-buz # Ateş & Buz: gerçek fizik modülleri sahte DOM'da 10 seviye × 3 oyun biçimi (+ kapı/rampa zorlaması) oynatılır — gömülme/tünelleme/ışınlanma/kalıcı sıkışma 0, parça/oyuncu/elmas duvarda doğmaz, bulunan kök nedenlerin yapıcı senaryoları (Node, tarayıcısız) + seviye görseli ↔ çarpışma ızgarası eşitliği (tarayıcı)
npm run test:altin-avi # Altın Avı (sahte RTDB, page.clock): şıklar her gösterimde karışır, yanlış = tıklanamayan bekleme (3→5→8 sn) + −10 altın, okuma kilidi, ÇALMA AÇIK/KAPALI, sunucu saati, final sıralaması ve soru bankası uzunluk ipucu (22 test)
npm run test:on-parmak # On Parmak: dizilim + karakterOf (fiziksel tuş = konum), ölçüm (%80 tekrar, yıldız sınırları), içerik kuralları (birikimli öğrenilmiş küme, uzunluk ≤ hedefHiz×10, yasak sözcük), ekran SVG, oyun akışı, Caps Lock / Enter kuralı, odak kaçışı, yerleşim kararlılığı (masaüstü + telefon), Bölüm 1→18 tek akış (iki Balon Vadisi, bir Uçan Baloncuklar ve bir Canavar Saldırısı bölümü dahil), Balon Vadisi, Canavar Saldırısı, Uçan Baloncuklar ve Elma Bekçisi (Elma test fikstürüyle; kazanma, ilk harfle hedef kilidi — yalnız görünen hedef, can/elma kaybı, %80 önceliği, sekme ve Caps Lock duraklatma, rAF/dinleyici sızıntısı, tohum = taraf/şerit planı, normal hareket yolu), dört oyun birlikte yerleşim (sahne üstü eşit, bölüm adı tam, Caps bandı ve "Oyun durdu" şeridi altta; masaüstü + telefon), renk dışı isabet işareti, can kaybı / "Oyun durdu" duyurusu, sonuç şeridi satır bölünmesi, telefonda baloncuk/etiket çakışmasızlığı, bilinmeyen oyun adı, kısım geçişi (gerçek içerik), her kısım tek akış, satır taşması (masaüstü + 375 px), 7 kısımlık içerik kuralları
npm run test:klavye # Klavye Kâşifi: kısım sırası + içerik kapsamı, "35 dakikalık ders" süre bütçesi (tarayıcısız); bölümler düğmesiz geçer, kutlama katmanı yalnız son kısımda, TR Q / İngilizce dizilim, ekran Shift'i, başlangıç seçici (kısım/bölüm → doğru motor seviyesi), çıkınca seçici yeniden, dizilim derin eşitliği (9 test)
SITE_ROOT=.build-check PORT=8766 npm run test:smoke # aynı test hash'li çıktı üzerinde (CI böyle koşar)
python seo/test_build_seo.py # üretici birim testleri
BASE_URL=https://<vercel-önizleme> npm run test:smoke dış ortamda koşar. CI (ci.yml) her PR'da lint + catalog:check + sri:check + SEO üretimi tazelik kontrolü (python seo/build_seo.py && git diff --exit-code -I lastmod …) + test:build + build:check + test:edu-kit + duman, temizlikçi, dialog, hub bilgi mimarisi, Balon Labirenti, Ateş & Buz, Altın Avı, Klavye Kâşifi ve On Parmak testlerini (hash'li çıktı üzerinde) çalıştırır; iş adı eslint + Playwright duman testi master'da required checktir (branch protection, A10b) — kırmızıyken merge edilemez, force-push ve dal silme kapalı.
master'a push → Vercel otomatik deploy. Yapılandırma vercel.json (güvenlik başlıkları, CSP Report-Only, önbellek, trailingSlash; buildCommand: node tools/build.js --check yerinde hash ekler, outputDirectory: ".", install yok); yayın dışı dosyalar .vercelignore (tek kaynak — firebase.json'daki ignore listesi Vercel'de geçersiz; tools/ yayında kalmalı, build oradan koşar). Önbellek: js/css public, max-age=31536000, immutable (URL hash'li), görseller 1 hafta, HTML varsayılan (max-age=0, must-revalidate).database.rules.json → firebase deploy --only database (proje childsplaylogic, .firebaserc). Git Bash'te MSYS_NO_PATHCONV=1 ön eki şart. firebase.json hosting bloğu yalnız isteğe bağlı childsplaylogic.web.app yansısı içindir.plans/bilnetoyun-duzeltme-2026-09-15.md "Değişmezler").js/games/<slug>.js modülü (+ iframe oyunuysa games/<slug>/index.html, css/<slug>.css); modül adı eslint.config.js gameModuleGlobals listesine.data/games.json games dizisine hub sırasında tek kayıt: slug, name, module, section, cat, subject, age [min,max], minutes, levels, teaches, short, about, players, players_range, active, stars, files {js, css}; online sürüm varsa online: { module, order, stars, badge?, files? } (yalnız-online oyunda module: null, section: "online"). Alan sözlüğü: docs/inceleme-2026-09-15/kanit/B2a-veri-notlari.md.npm run catalog → js/catalog.js + index.html altbilgisi yeniden üretilir (şema hatası varsa durur; index.html'e başka etiket eklenmez, dosyalar files ile tembel yüklenir).css/hub.css .game-card[data-game="<slug>"]::before kart şeridi (B1 sonrası var(--kat-<bölüm>)); assets/images/hub/<slug>.svg ikonu; kayıt anahtarları varsa js/auth.js GAME_SAVE_KEYS; yönerge varsa js/i18n.js TR.instructions.python seo/build_seo.py → oyunlar/<slug>/, oyunlar/index.html, sitemap.xml, llms.txt yeniden üretilir (title ≤60 / description ≤150 aşılırsa üretim durur).npm run lint && npm run catalog:check && npm run test:smoke && python seo/test_build_seo.py — duman testi slug listesini JSON'dan türetir, yeni oyun otomatik kapsanır.Oyunu kapatmak: JSON kaydında active: false (tek bayrak: hub'da "Yakında" kartı, landing noindex, sitemap/llms/altbilgi dışı, duman testi atlar) → npm run catalog && python seo/build_seo.py; kapalı oyun listesi seo/test_build_seo.py içinde de güncellenir (sessiz kapanma olmasın). Yalnız-online oyun kapatılınca kart ve /?oyun= derin bağlantısı tamamen düşer (js/app.js mpGameDefs active süzer), "Yakında" kartı çıkmaz. Örnekler: Kelime Madeni 3D (tek kişilik, hâlâ kapalı); On Parmak (Ekim 2026'da yapım aşamasında kapalıydı; Adım 3'te açıldı, seo/test_build_seo.py kapalı listesinden ve test yamasından çıktı); Ateş & Buz (yalnız-online) 30 Eyl 2026'da fizik hataları yüzünden kapatılmış, düzeltme + sahip testinden sonra 1 Eki 2026'da yeniden açılmıştır.
admin.html yalnız Firebase Auth'ta tanımlı yönetici e-postasıyla açılır (js/admin.js ADMIN_EMAIL); sunucu tarafı kapı database.rules.json adminConfig .write kuralıdır — istemci kontrolü yalnız arayüzdür. Sayfa X-Robots-Tag: noindex alır (vercel.json).
.read/.write: false; lobbies, players, rooms/* yalnız anahtar biçimi tutan tekil kayıtlara yazılır (^[A-Z]{5}$, ^[A-Z2-9]{4}$, ^P[a-z0-9]{10,16}$), lobi sayı alanları tip doğrulamalı; users/{uid} yalnız sahibine; leaderboards/* yalnız yeni kayıt, timestamp == now. Lobi/oda verisi tasarım gereği herkese okunur.innerHTML öncesi kaçışlanır (PR #16); yeni kod textContent ya da escapeHTML kullanmalı.vercel.json CSP Report-Only — zorlayıcı moda geçiş B9'da. Satır içi <script> taşıyan iframe sayfası B5 sonrası 6 (bil-ve-fethet, zindan-okcusu, kelime-madeni-3d, hava-hokeyi; kelimelik + son-kart B6); 20 eğitsel oyun script-src 'self' altında ihlalsiz (npm run test:edu-kit CSP provası).integrity="sha384-…" crossorigin="anonymous" ile yüklenir (Karar 5: vendor değil, SRI); hash uyuşmazsa tarayıcı script'i engeller, hub A4 çevrimdışı modunda açılır (tek kişilik oyunlar), CI sri:check kırmızı olur. chess.js ve GLTFLoader js/lib/ altında yerel; unpkg CSP'den düştü, cdnjs yalnız three.min.js için (B6'ya kadar).js/firebase-config.js'teki Firebase web yapılandırması herkese açık istemci anahtarıdır; gizli anahtar, token ya da servis hesabı repoda bulunmaz, eklenmez.js/janitor.js): ücretsiz Spark planında Cloud Functions yok; herkese okunur lobbies ve rooms/* altında çocuk takma adları birikmesin diye temizliği ziyaretçi tarayıcısı yapar — createdAt 24 saatten eski (ya da hiç olmayan) kayıtlar yol başına en çok 60'ar silinir.localStorage bo_janitor_last); js/app.js oturum çözülünce boşta zamanda planlar (requestIdleCallback), oyun başlatma yolunda değil; asla fırlatmaz ([Janitor] console.info/warn).update({k:null}) ile silinir. database.rules.json .indexOn'a createdAt eklendi — firebase deploy --only database yapılana kadar sorgu istemcide süzülür (çalışır, SDK "unspecified index" uyarır). Test: (sahte db, canlıya dokunmaz).docs/inceleme-2026-09-15/00-OZET.md — denetim özeti + "Durum 15 Eylül 2026" · 01-guvenlik … 05-muhendislikplans/bilnetoyun-duzeltme-2026-09-15.md — A1–A12 adım durumu, kararlar, kanıt klasörüEGITSEL-FAZ-DURUM.md (eğitsel seri durumu, "Güncelleme 15 Eylül 2026"), EGITSEL-OYUN-PLANI.md (tasarım), LEGO-WORLD-GAME-SPEC.md (arşiv)Her sayfanın en altında egweblab imza bandı bulunur (css/imza.css, .imza-band — tek bağlantı https://egweblab.com.tr, logo assets/logo-96.png, yazdırmada gizli, yükseklik ≤ %2). Üretici şablonu landing'lere otomatik ekler; yeni statik sayfa eklerken band elle eklenir — eksik sayfa hata sayılır. Durum: 404.html, /oyunlar/ ve 59 landing'de var; hub index.html + admin.html dahil tüm sayfalarda (PR #21 merge).
npm run test:janitor