d1/pano — kaynak51963 bayt ← review
<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>hart artifact</title><script>window.HART_DATA={};</script></head><body><!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="robots" content="noindex">
<title>Artifacts-D1 — Proje Panosu</title>
<style>
:root{--bg:#f6f7f9;--card:#fff;--ink:#17202a;--mut:#5b6774;--line:#dfe4ea;
--ok:#1a7f37;--run:#0969da;--wait:#8a6d00;--blk:#b3261e;--chip:#eef2f6}
@media(prefers-color-scheme:dark){:root{--bg:#0e1116;--card:#161b22;--ink:#e6edf3;
--mut:#8d99a6;--line:#2b3440;--chip:#212a35}}
*{box-sizing:border-box}body{margin:0;background:var(--bg);color:var(--ink);
font:15px/1.55 system-ui,-apple-system,"Segoe UI",sans-serif}
main{max-width:1100px;margin:0 auto;padding:24px 16px 64px}
h1{font-size:22px;margin:0 0 4px}h2{font-size:16px;margin:28px 0 10px;
border-bottom:1px solid var(--line);padding-bottom:6px}
.sub{color:var(--mut);font-size:13px}
.tur{display:inline-block;background:var(--chip);border:1px solid var(--line);
border-radius:999px;padding:2px 12px;font-weight:600;font-size:13px;
font-variant-numeric:tabular-nums}
.grid{display:grid;gap:12px}
@media(min-width:760px){.grid.cols2{grid-template-columns:1fr 1fr}
.grid.cols4{grid-template-columns:repeat(4,1fr)}}
.card{background:var(--card);border:1px solid var(--line);border-radius:10px;
padding:12px 14px}
.card h3{margin:0 0 6px;font-size:14px}
.badge{display:inline-block;border-radius:5px;padding:1px 8px;font-size:12px;
font-weight:600}
.b-done{background:#dafbe1;color:var(--ok)}
.b-run{background:#ddf4ff;color:var(--run)}
.b-wait{background:#fff8c5;color:var(--wait)}
.b-blk{background:#ffebe9;color:var(--blk)}
@media(prefers-color-scheme:dark){.b-done{background:#0c2b17}.b-run{background:#0a2b4d}
.b-wait{background:#332e00}.b-blk{background:#3d0f0c}}
table{width:100%;border-collapse:collapse;font-size:13px}
th,td{text-align:left;padding:6px 8px;border-bottom:1px solid var(--line);
vertical-align:top}
th{color:var(--mut);font-weight:600}
code,pre{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;
font-size:12.5px}
pre{background:var(--chip);border:1px solid var(--line);border-radius:8px;
padding:10px;overflow:auto;white-space:pre-wrap}
ul{margin:6px 0;padding-left:20px}li{margin:3px 0}
.rail{display:flex;gap:6px;flex-wrap:wrap}
.rail .s{border:1px solid var(--line);border-radius:8px;padding:6px 10px;
font-size:13px;background:var(--card)}
.rail .s.now{border-color:var(--run);outline:2px solid var(--run)}
.mut{color:var(--mut)}a{color:var(--run)}
.kpi{font-size:26px;font-weight:700}
footer{margin-top:32px;color:var(--mut);font-size:12px}
</style>
</head>
<body>
<main>
<header>
<h1>Artifacts-D1 <span class="tur">TUR 29</span> <span class="badge b-done">PROD · review-1.3 CANLI · iframe srcdoc fix (ARTF-029)</span></h1>
<p class="sub">Claude-Artifacts eşdeğeri self-hosted servis — cx53 + Coolify ·
servis: <code>hart</code> v0.4.3 ·
<a href="https://artifacts.gonet.com.tr/a/d1/pano"><b>artifacts.gonet.com.tr/a/d1/pano</b> CANLI</a> ·
son güncelleme: <b>2026-09-28</b></p>
</header>

<h2>Hedef · Kapsam · Sınır<a class="ai-i" target="_top" href="/asistan/d1/pano?s=Hedef%20%C2%B7%20Kapsam%20%C2%B7%20S%C4%B1n%C4%B1r" data-s="Hedef · Kapsam · Sınır" title="Bu bolumu sor" aria-label="asistan">i</a></h2>
<div class="grid cols2">
<div class="card"><h3>Hedef</h3>Ajan/insan üretimi self-contained HTML'leri
kalıcı, sürümlü, <b>public linkli</b> 7/24 servis etmek — vendor bağımsız.
Claude Artifacts'ın işlev eşdeğeri.</div>
<div class="card"><h3>Sınır (DEĞİLDİR)</h3>Servis kodu bu repo'da yaşamaz
(ayrı repo: <code>Guru35/artifacts-*</code>) · production deploy bu
planda değil (kapılı, ayrı tur) · claude.ai klonu değil.</div>
</div>

<h2>Sprint rayı<a class="ai-i" target="_top" href="/asistan/d1/pano?s=Sprint%20ray%C4%B1&amp;expl=S0%20do%C4%9Fum%2Bara%C5%9Ft%C4%B1rma%2Bplan%2Bpano%20%E2%9C%94%20S1%20mimari%20karar%3A%20hart%20%E2%9C%94%20S2%20servis%20MVP%20staging%27de%20CANLI%20%E2%9C%94%20S3%20s%C3%BCr%C3%BCm%2Bpayla%C5%9F%C4%B1m%2Bsandbox%20%E2%9C%94%20%28private/parola%20%2B%20limitler%20kan%C4%B1tl%C4%B1%29%20S4%20ajan%20" data-s="Sprint rayı" title="Bu bolumu sor" aria-label="asistan">i</a></h2>
<div class="rail">
<div class="s"><b>S0</b> doğum+araştırma+plan+pano ✔</div>
<div class="s"><b>S1</b> mimari karar: <b>hart</b> ✔</div>
<div class="s"><b>S2</b> servis MVP staging'de CANLI ✔</div>
<div class="s"><b>S3</b> sürüm+paylaşım+sandbox ✔ (private/parola + limitler kanıtlı)</div>
<div class="s"><b>S4</b> ajan arabirimi: artifact-publish skill ✔</div>
<div class="s"><b>S5</b> işletim+prod: Coolify kaydı ✔ · PROD ilanı ✔ — plan tamam</div>
<div class="s"><b>F0</b> Claude-parity araştırma + PLAN-ARTF-002 ✔</div>
<div class="s"><b>F1</b> viewer: galeri + sürüm seçici ✔ CANLI (review-0.6)</div>
<div class="s"><b>F2</b> md aracı + jsx runtime ✔ CANLI</div>
<div class="s"><b>F3</b> window.arti köprüsü + KV store ✔ CANLI (review-0.7)</div>
<div class="s"><b>F4</b> sürüm bandı + kaynak/remix + olay günlüğü ✔ CANLI (review-0.8)</div>
</div>

<h2>İş paketleri (PLAN-ARTF-001)<a class="ai-i" target="_top" href="/asistan/d1/pano?s=%C4%B0%C5%9F%20paketleri%20%28PLAN-ARTF-001%29&amp;expl=Paket%20Sprint%20%C4%B0%C3%A7erik%20Kan%C4%B1t%20testi%20Durum%20Ba%C4%9Fl%C4%B1%20ARTF-001%20S0%20Vault%20do%C4%9Fumu%2C%20kimlik%2C%207%20raw%20derlemesi%2C%20wiki%20katman%C4%B1%2C%20plan%2C%20pano%20v0%20kap%C4%B1%20YE%C5%9E%C4%B0L%20%2B%20remote%20kan%C4%B1t%C4%B1%20%2844731ca%29%20" data-s="İş paketleri (PLAN-ARTF-001)" title="Bu bolumu sor" aria-label="asistan">i</a></h2>
<table>
<tr><th>Paket</th><th>Sprint</th><th>İçerik</th><th>Kanıt testi</th><th>Durum</th><th>Bağlı</th></tr>
<tr><td><b>ARTF-001</b></td><td>S0</td><td>Vault doğumu, kimlik, 7 raw derlemesi, wiki katmanı, plan, pano v0</td><td>kapı YEŞİL + remote kanıtı (44731ca)</td><td><span class="badge b-done">bitti</span></td><td>—</td></tr>
<tr><td><b>ARTF-002</b></td><td>S1</td><td>Mimari karar → <b>hart</b> (operatör delegasyonu; tek-origin+CSP, token)</td><td>matris §Karar kaydı + geri-dönüş koşulu</td><td><span class="badge b-done">bitti</span></td><td>—</td></tr>
<tr><td><b>ARTF-003</b></td><td>S2</td><td>Servis MVP staging: publish→public URL; repo Guru35/artifacts-d1-service</td><td>POST→v1, GET→200, restart→200, TLS+LE</td><td><span class="badge b-done">bitti</span></td><td>—</td></tr>
<tr><td><b>ARTF-004</b></td><td>S3</td><td>Immutable sürümler + /v&lt;n&gt; + unlisted/private katmanı</td><td>private: 401 unlock · X-Hart-Read-Key 200 · yanlış 401 · geçiş kanıtlı</td><td><span class="badge b-done">bitti</span></td><td>—</td></tr>
<tr><td><b>ARTF-005</b></td><td>S3</td><td>CSP 'none' + linter 422 + limitler</td><td>429 (~10/dk) · 5MB kabul · owner cap 30MB · nosniff/noindex</td><td><span class="badge b-done">bitti</span></td><td>—</td></tr>
<tr><td><b>ARTF-006</b></td><td>S4</td><td>.devin/skills/artifact-publish (kanıtlı sözleşme) + doğrulama publish'i</td><td>skill'den publish → /a/d1/skill-dogrulama 200</td><td><span class="badge b-done">bitti</span></td><td>—</td></tr>
<tr><td><b>ARTF-007</b></td><td>S5</td><td>Coolify service kaydı + prod ilanı + backup/restore</td><td>service uuid 5w76… · 13 artifact korundu · pano 200 · volume-rename tuzağı aşıldı</td><td><span class="badge b-done">bitti</span></td><td>—</td></tr>
<tr><td><b>ARTF-008</b></td><td>T7-T8</td><td>Yorum/review katmanı CANLI — <a href="https://artifacts.gonet.com.tr/review/d1/pano">/review/&lt;id&gt;</a> iframe+yorum paneli (ayrı SQLite, volume review-data)</td><td>healthz 200 · wrapper+iframe · POST→GET roundtrip (id=1) · 404 yabancı · hart 200'ler etkilenmedi</td><td><span class="badge b-done">bitti</span></td><td>—</td></tr>
<tr><td><b>ARTF-008b</b></td><td>T10</td><td>Parity eksikleri: resolve toggle ucu+UI · pin ekle modu (overlay %x/%y + marker katmanı) · artifact_version passthrough</td><td>test 16/16 · canlı: pin POST id=2 (anchor+sürüm) · resolve 1→0 toggle · 404 olmayan · review-0.2 deploy'lu</td><td><span class="badge b-done">bitti</span></td><td>—</td></tr>
<tr><td><b>ARTF-009</b></td><td>—</td><td>Sablon-V3-D1 şablonu (Sablon-D1 çatalı + servisli-vault katmanı)</td><td>sandbox doğum YEŞİL · Guru35/Sablon-V3-D1 push'lu</td><td><span class="badge b-done">bitti</span></td><td>—</td></tr>
<tr><td><b>ARTF-010</b></td><td>F0</td><td>Claude-Artifacts parity derin araştırması + PLAN-ARTF-002 (F1-F5 fazları)</td><td>wiki'de: web-claude-artifacts-2026 + PLAN-ARTF-002</td><td><span class="badge b-done">bitti</span></td><td>—</td></tr>
<tr><td><b>ARTF-011</b></td><td>F1</td><td>Galeri: /review/galeri public liste (hart /v1 admin okuması sunucuda; private+gizli elenir) + admin gizle ucu</td><td>test T17-T19,T22-T24 · CANLI: /review/galeri 200, d1/pano listede · repo 8d77e9c</td><td><span class="badge b-done">bitti</span></td><td>—</td></tr>
<tr><td><b>ARTF-012</b></td><td>F1</td><td>Sürüm seçici: /review/{o}/{n}/versions ucu + sayfada seçici/pin/latest linkleri</td><td>test T20-T21 · CANLI: /versions → 30 sürüm JSON, seçici render · repo 8d77e9c</td><td><span class="badge b-done">bitti</span></td><td>—</td></tr>
<tr><td><b>ARTF-013</b></td><td>F2</td><td>.md → styled page: publish-time conversion <code>tools/md-publish.py</code> (markdown-it + inline-CSS şablon; frontmatter soyma, harici-ref uyarısı, --dry-run)</td><td>md-test v3 canlı 200, h1/table render doğrulandı · temizlik DELETE</td><td><span class="badge b-done">bitti</span></td><td>—</td></tr>
<tr><td><b>ARTF-014</b></td><td>F2</td><td>JSX doğrulama: format=jsx + HART_RUNTIME_DIR=/data/runtime (envs API) + redeploy → runtime canlı</td><td>/_hart/runtime/* 3/3 → 200 · jsx-test wrapper+#root OK · regresyon 5/5 → 200</td><td><span class="badge b-done">bitti</span></td><td>—</td></tr>
<tr><td><b>ARTF-016</b></td><td>F3</td><td>window.arti köprüsü: artifact shim'i (postMessage arti.req/res) → review sayfası dispatch (declare-meta + origin/source kapısı) → /arti/api/complete + download parent'ta Blob</td><td>test T36-T42 · CANLI: complete → {"text":"Merhaba!"} gerçek LLM · 422 uzun prompt · 404 yok artifact · sayfada arti.req/res+declare · repo 0c9abe7</td><td><span class="badge b-done">bitti</span></td><td>—</td></tr>
<tr><td><b>ARTF-017</b></td><td>F3</td><td>Storage KV: artifact_store tablosu + /arti/api/store (GET/POST/DELETE) — key≤64 · value≤32KB · ≤50 key · ≤256KB/artifact · 30 yazım/dk</td><td>test T25-T35 · CANLI: store set→get→list→del→404 roundtrip /review/arti/api/* altında · repo 0c9abe7</td><td><span class="badge b-done">bitti</span></td><td>—</td></tr>
<tr><td><b>ARTF-022</b></td><td>F6</td><td>Metadata: hart <code>?title=</code> (tek kaynak — served title + galeri + review barı) + review <code>artifact_meta</code> iconu (admin PUT / public GET /review/{o}/{n}/meta) + md-publish --title/--icon (emoji data: favicon)</td><td>test T56-T61+T63 · CANLI: meta roundtrip · galeri "📋 Artifacts-D1 Pano" · served &lt;title&gt; doğrulandı</td><td><span class="badge b-done">bitti</span></td><td>—</td></tr>
<tr><td><b>ARTF-025</b></td><td>F6</td><td>Stale-publish guard: <code>md-publish.py --expect N</code> — publish öncesi /v1/artifacts okunur, güncel≠N ise kesilir (hart binary server-side guard desteklemez; araç-seviyesi eşdeğer)</td><td>CANLI: --expect 5 → "stale base" ile kesildi; --expect 1 → v3 publish 200</td><td><span class="badge b-done">bitti</span></td><td>—</td></tr>
<tr><td><b>ARTF-026</b></td><td>F6</td><td>Yorum→asistan köprüsü: yorum kartında "asistana sor" linki → /asistan?s=yorum#id·ad:metin (yorum LLM'e bolum bağlamı olarak girer)</td><td>test T62 marker · CANLI: sayfada link render doğrulandı</td><td><span class="badge b-done">bitti</span></td><td>—</td></tr>
<tr><td><b>ARTF-023</b></td><td>F7</td><td>Embed + allowed-domains: <code>/review/{o}/{n}/embed</code> sarıcısı (frame-ancestors meta'dan, boşsa 'self') + review barında "embed kodu" butonu (PUBLIC_BASE ile https üretir)</td><td>test T70-T77 · CANLI: embed 200 + CSP doğru · sınır kayıtlı (ham /a/… bypass edilebilir)</td><td><span class="badge b-done">bitti</span></td><td>—</td></tr>
<tr><td><b>ARTF-024</b></td><td>F7</td><td>Sahip sürüm pin'i: <code>artifact_meta.published_version</code> — admin PUT, varolmayan sürüm 422; review+embed iframe varsayılanı pin'li sürüme döner</td><td>test T64-T69 · CANLI: pin set→/v1 iframe→temizle roundtrip</td><td><span class="badge b-done">bitti</span></td><td>—</td></tr>
<tr><td><b>ARTF-027</b></td><td>F7</td><td>Retention süpürgesi: <code>tools/retention.py</code> — dry-run varsayılan, silme <code>--uygula --onay EVET</code> çift kapılı (HART_ADMIN liste + HART_TOKEN silme)</td><td>test T1-T9 · CANLI dry-run: aday=0 esik=90g</td><td><span class="badge b-done">bitti</span></td><td>—</td></tr>
<tr><td><b>ARTF-028</b></td><td>F7</td><td>Connector eşdeğeri fizibilite raporu: outputs/artf-028-connector-fizibilite.md — O1 (tam parity) hesap katmanı ister; O2 (küratörlü cap'ler) uygulanabilir yol; öneri O3-kapat</td><td>rapor yazıldı, kod yok (karar notu kayıtlı)</td><td><span class="badge b-done">bitti</span></td><td>—</td></tr>
</table>

<h2>Emsal matrisi (S1 karar tabanı)<a class="ai-i" target="_top" href="/asistan/d1/pano?s=Emsal%20matrisi%20%28S1%20karar%20taban%C4%B1%29&amp;expl=Aday%20cx53%20S%C3%BCr%C3%BCm%20Payla%C5%9F%C4%B1m%20Sandbox%20Sinyal%20artifact-server%20%28plannotator%29%20%E2%9C%94%20Compact%20Compose%20immutable%20%2B%20review%20link%20WorkOS/OIDC%2C%20private/public%20iki-origin%20%28en%20g%C3%BC%C3%A7l%C3%BC" data-s="Emsal matrisi (S1 karar tabanı)" title="Bu bolumu sor" aria-label="asistan">i</a></h2>
<table>
<tr><th>Aday</th><th>cx53</th><th>Sürüm</th><th>Paylaşım</th><th>Sandbox</th><th>Sinyal</th></tr>
<tr><td><b>artifact-server</b> (plannotator)</td><td>✔ Compact Compose</td><td>immutable + review link</td><td>WorkOS/OIDC, private/public</td><td>iki-origin (en güçlü)</td><td>184★, conformance ledger</td></tr>
<tr><td><b>Stela</b> (kdowding)</td><td>✔ container+SQLite</td><td>immutable, aynı URL</td><td>header-trust; 3 katman + pinned comment</td><td>iframe + CSP 'none'</td><td>0★, 1 commit — genç</td></tr>
<tr><td><b>hart</b> (javimosch)</td><td>✔ tek binary+SQLite</td><td>immutable + rollback</td><td>token + public link + custom domain</td><td>CSP skeleton + 422 linter</td><td>canlı demo hart.intrane.fr</td></tr>
<tr><td><b>open-artifacts</b> (coda0)</td><td>✘ CF Workers</td><td>?v=N immutable</td><td>unguessable id + writeToken + ZK</td><td>CSP sandbox 'none'</td><td>60★ — kalıp kaynağı</td></tr>
<tr><td><b>hushdrop</b> (maxtechera)</td><td>✘ Vercel Blob</td><td>update-in-place</td><td>ZK parola + expire/burn + email-gate</td><td>CSP + noindex</td><td>kalıp kaynağı</td></tr>
</table>
<p class="sub">Kaynak: <code>raw/web-*.md</code> derlemeleri ·
detay: <code>wiki/concepts/oss-emsal-karsilastirmasi.md</code></p>

<h2>Kararlar<a class="ai-i" target="_top" href="/asistan/d1/pano?s=Kararlar&amp;expl=Tarih%20Karar%20Kim%202026-09-27%20Tek%20turda%20do%C4%9Fum%2Bara%C5%9Ft%C4%B1rma%2Bplan%2Bpano%20operat%C3%B6r%202026-09-27%20Servis%20kodu%20ayr%C4%B1%20repo%20%2B%20Coolify%20deploy%20operat%C3%B6r%202026-09-27%20Sablon-V3-D1%20ertel" data-s="Kararlar" title="Bu bolumu sor" aria-label="asistan">i</a></h2>
<table>
<tr><th>Tarih</th><th>Karar</th><th>Kim</th></tr>
<tr><td>2026-09-27</td><td>Tek turda doğum+araştırma+plan+pano</td><td>operatör</td></tr>
<tr><td>2026-09-27</td><td>Servis kodu ayrı repo + Coolify deploy</td><td>operatör</td></tr>
<tr><td>2026-09-27</td><td>Sablon-V3-D1 ertelendi — desen önce kanıtlansın</td><td>operatör</td></tr>
<tr><td>2026-09-27</td><td>Uzak repo + public domain hedefi evet</td><td>operatör</td></tr>
<tr><td>2026-09-27</td><td>Mimari: <b>hart</b> (operatör "sen seç" → ajan; geri-dönüş koşulu matriste)</td><td>ajan (delegasyon)</td></tr>
<tr><td>2026-09-27</td><td>"ikisini de yap, doğru sırayla" → önce review araştırması, sonra V3 inşası (erteleme kararı geçildi)</td><td>operatör</td></tr>
<tr><td>2026-09-27</td><td>Review katmanı yönü: <b>ince companion</b> önerildi — karar implementasyon turunda</td><td>ajan (öneri)</td></tr>
</table>

<h2>Tuzaklar<a class="ai-i" target="_top" href="/asistan/d1/pano?s=Tuzaklar&amp;expl=stored-XSS%3A%20untrusted%20HTML%20app%20origin%27inde%20sunulursa%20oturum%20s%C4%B1zar%20%E2%86%92%20iki-origin%20veya%20CSP%20%27none%27%20zorunlu.%20token%20kayb%C4%B1%20%3D%20kontrol%20kayb%C4%B1%3A%20hesaps%C4%B1z%20sahiplikte%20writeTo" data-s="Tuzaklar" title="Bu bolumu sor" aria-label="asistan">i</a></h2>
<ul>
<li><b>stored-XSS:</b> untrusted HTML app origin'inde sunulursa oturum sızar → iki-origin veya CSP 'none' zorunlu.</li>
<li><b>token kaybı = kontrol kaybı:</b> hesapsız sahiplikte writeToken saklama yeri sözleşmede.</li>
<li><b>public link ≠ public sunucu:</b> publish/auth ucu ayrı korunur.</li>
<li><b>tek-arıza cx53:</b> backup rutini + restore tatbikatı kanıtı şart.</li>
<li><b>genç repo:</b> Stela 1 commit → pin+audit ya da kalıp kopyası.</li>
<li><b>deploy kapılı:</b> sunucuya dokunuş yalnız operatör-onaylı turda.</li>
</ul>

<h2>Kanıt kayıtları<a class="ai-i" target="_top" href="/asistan/d1/pano?s=Kan%C4%B1t%20kay%C4%B1tlar%C4%B1&amp;expl=Tur%20Kan%C4%B1t%20Sonu%C3%A7%20T1%20dogur-vault-d1.sh%20%C3%A7%C4%B1kt%C4%B1s%C4%B1%3A%20TUR%20KAPISI%20YESIL%2C%2048%E2%86%9262%20sayfa%2C%20ara%C3%A7lar%207/7%20ye%C5%9Fil%20T1%20uzak-repo-kur.sh%3A%20ls-remote%20HEAD%20a8ca00e%20%28Guru35/Artifacts-D1%29" data-s="Kanıt kayıtları" title="Bu bolumu sor" aria-label="asistan">i</a></h2>
<table>
<tr><th>Tur</th><th>Kanıt</th><th>Sonuç</th></tr>
<tr><td>T1</td><td>dogur-vault-d1.sh çıktısı: TUR KAPISI YESIL, 48→62 sayfa, araçlar 7/7</td><td><span class="badge b-done">yeşil</span></td></tr>
<tr><td>T1</td><td>uzak-repo-kur.sh: ls-remote HEAD a8ca00e (Guru35/Artifacts-D1)</td><td><span class="badge b-done">yeşil</span></td></tr>
<tr><td>T1</td><td>ortak-yazim.py: vault-haritasi.md sha 334de2b4→8a26dfe4 + kök commit 7b4e531</td><td><span class="badge b-done">yeşil</span></td></tr>
<tr><td>T2</td><td>POST /v1/publish (token'lı) → {"url":"…/a/d1/pano","version":1}; tokensız → 401</td><td><span class="badge b-done">yeşil</span></td></tr>
<tr><td>T2</td><td>GET /a/d1/pano → 200; republish → v2; /a/d1/pano/v1 → 200 (immutable)</td><td><span class="badge b-done">yeşil</span></td></tr>
<tr><td>T2</td><td>dış-script'li HTML → 422 linter "external-script"; CSP header: default-src 'none', nosniff, frame-ancestors 'self'</td><td><span class="badge b-done">yeşil</span></td></tr>
<tr><td>T2</td><td>docker restart → aynı URL 200 (SQLite volume kalıcı); http→https 302; LE cert YR2 → 2026-12-26</td><td><span class="badge b-done">yeşil</span></td></tr>
<tr><td>T3</td><td>private publish (read_key) → keysiz 401+unlock sayfası · X-Hart-Read-Key → 200 · yanlış key → 401</td><td><span class="badge b-done">yeşil</span></td></tr>
<tr><td>T3</td><td>visibility unlisted + clear_read_key → 200; clear'sız gate SÜRER (read-key kalıcı)</td><td><span class="badge b-done">yeşil</span></td></tr>
<tr><td>T3</td><td>rate limit: ~10 publish/dk → 429; 5MB tek dosya → 200 (owner cap 30MB)</td><td><span class="badge b-done">yeşil</span></td></tr>
<tr><td>T3</td><td>backup: stop→tar.gz+sha256→up; restore: ayrı volume'e extract + geçici instance → 13 artifact 200</td><td><span class="badge b-done">yeşil</span></td></tr>
<tr><td>T3</td><td>artifact-publish skill sözleşmesi → /a/d1/skill-dogrulama 200</td><td><span class="badge b-done">yeşil</span></td></tr>
<tr><td>T4</td><td>Coolify service kaydı: POST /services (compose base64) → deploy → container hart-5w76… up</td><td><span class="badge b-done">yeşil</span></td></tr>
<tr><td>T4</td><td>geçiş kanıtı: pano 200 · 13 artifact · TLS + http→https 302 · COOLIFY_RESOURCE_UUID env var</td><td><span class="badge b-done">yeşil</span></td></tr>
<tr><td>T4</td><td>tuzak yakalandı: Coolify volume rename (external yutuldu) → cp -a ile veri kopyası → 13/13</td><td><span class="badge b-done">yeşil</span></td></tr>
<tr><td>T4d</td><td>bağımsız doğrulama: service DB'de (uuid 5w76, fqdn doğru) · hart-5w76 up · kök+pano 200 · iki repo ls-remote==HEAD</td><td><span class="badge b-done">yeşil</span></td></tr>
<tr><td>T4d</td><td>künye kapanışı: PLAN-ARTF-001 frontmatter bitti+kapanis+kanit (bdcffc6) — gövde "tamam" yazarken künye "suruyor" kalmıştı</td><td><span class="badge b-done">yeşil</span></td></tr>
<tr><td>T4d</td><td>tools/pano-yayinla.sh: tek komut publish → pano v6 (bu sayfa) — "her tur sonunda" republish prosedüre bağlandı</td><td><span class="badge b-done">yeşil</span></td></tr>
<tr><td>T5</td><td>kök sayfa: HART_LANDING=/data/landing.html → https://artifacts.gonet.com.tr/ "Artifacts-D1" giriş sayfası (stok yerine)</td><td><span class="badge b-done">yeşil</span></td></tr>
<tr><td>T5</td><td>HART_TOKEN rotasyonu (transkript sızıntısı): eski token publish → 401 · yeni token → v7 publish yeşil</td><td><span class="badge b-done">yeşil</span></td></tr>
<tr><td>T5</td><td>tuzak: Service-level envs/bulk dockercompose container'a enjekte OLMAZ — çözüm docker_compose_raw PATCH (environment bloğu)</td><td><span class="badge b-done">yeşil</span></td></tr>
<tr><td>T5</td><td>admin token envs-API + redeploy → container'da set · DELETE /v1/artifacts → 7/7 artık silindi, yalnız d1/pano kaldı</td><td><span class="badge b-done">yeşil</span></td></tr>
<tr><td>T5</td><td>backup.sh elle koşu → tar.gz+SHA256SUMS → servis geri 200 · crontab 35 3 * * * kuruldu (14 gün retention)</td><td><span class="badge b-done">yeşil</span></td></tr>
<tr><td>T5</td><td>bulgu: envs-API değeri compose literal'ını ezer · listeleme sahibesiz sorguda publish tokenla [] döner (admin/cross-owner) · silme admin'siz de çalışır</td><td><span class="badge b-done">yeşil</span></td></tr>
<tr><td>T6</td><td>kok-neden: paralel işçi Hetzner-D1 köklü Claude oturumu (565c465e — jsonl kanıtı, "çift Devin" düzeltildi) · aktif-ajan-kilit sinyali oturum kökü ölçüyor → sınır-ötesi yazar görünmez</td><td><span class="badge b-done">yeşil</span></td></tr>
<tr><td>T8</td><td>deploy: /review/healthz 200 · /review/d1/pano 200+iframe src=/a/d1/pano · yorum POST→201 + GET listede (id=1) · /review/yok-boyle 404 · / ve /a/d1/pano 200 (hart etkilenmedi)</td><td><span class="badge b-done">yeşil</span></td></tr>
<tr><td>T8</td><td>backup.sh canli koşu: hart 36K + review 4.0K, code=200 review_code=200 (cift volume kapsamda)</td><td><span class="badge b-done">yeşil</span></td></tr>
<tr><td>T8</td><td>tuzak: compose_raw PATCH base64 ister · app PATCH alanı <code>url</code> (fqdn değil) · <code>is_stripprefix_enabled:false</code> şart (true = Traefik /review'i yer → 404)</td><td><span class="badge b-done">yeşil</span></td></tr>
<tr><td>T10</td><td>ARTF-008b: test 16/16 (resolve toggle, anchor+sürüm roundtrip, pin katmanı, 404'ler) · image artifacts-d1:review-0.2</td><td><span class="badge b-done">yeşil</span></td></tr>
<tr><td>T10</td><td>deploy: compose_raw PATCH (image tag) → deploy → review-0.2 up · canlı: pin POST id=2 (anchor .5/.3, v11) · resolve 1→0 · olmayan 404 · /a/d1/pano 200</td><td><span class="badge b-done">yeşil</span></td></tr>
<tr><td>T10</td><td>bulgu: /v1/artifacts?owner=d1 iç ağda bile tokensuz 401 → artifact_version opsiyonel passthrough (token review'a geçirilmedi)</td><td><span class="badge b-done">yeşil</span></td></tr>
<tr><td>T6</td><td>çözüm: aktif-ajan-kilit v1.2.0-aday (tools/) — sınır-ötesi jsonl taraması + filo satırı · test 11/11 + regresyon 47/47 · canlı prova: 565c465e SINIR-ÖTESİ yakalandı</td><td><span class="badge b-done">yeşil</span></td></tr>
<tr><td>T6</td><td>kanıtlı patch Loops/raw bildirim-20260927-1308 ile iletildi — kanonik değişim+senkron Loops'ta · ders: wiki/system/dersler/sinir-otesi-ajan-kor-noktasi.md</td><td><span class="badge b-done">yeşil</span></td></tr>
<tr><td>T7</td><td>ARTF-008 iskelet: review/ FastAPI+SQLite (iframe /a/&lt;id&gt; + comments API, honeypot, 30/dk) — 11/11 test · repo commit 82929eb · deploy YOK (bayrak'ta onay)</td><td><span class="badge b-done">yeşil</span></td></tr>
<tr><td>T7</td><td>review araştırması: hart'ta public yazma ucu YOK (feedback=operatör, stats=sayaç) → gerçek yorum harici servis ister; Stela 1 commit/0★ ölü; öneri ince companion</td><td><span class="badge b-done">yeşil</span></td></tr>
<tr><td>T7</td><td>Sablon-V3-D1 kuruldu: 6 V3 dosyası · sandbox doğum (--hedef-koku) kapı YEŞİL · push e8e30d5 · harita SBLNV3D1 (3825814)</td><td><span class="badge b-done">yeşil</span></td></tr>
<tr><td>T7</td><td>saha bulgusu: doğurma yer-tutucu turu yalnız *.md tarar → pano.html tutucuları ilk güncellemede dolar (SKILL §Nasıl-0, V3-NOTU)</td><td><span class="badge b-done">yeşil</span></td></tr>
<tr><td>T21</td><td>ARTF-011/012 kodu: pytest test_app.py → <b>24/24 OK</b> (T17-T24 yeni: galeri/private-eleme/unverified bandı/versions ucu/seçici render/gizle 403+admin) · docker image artifacts-d1:review-0.6 build OK · repo commit 8d77e9c (yerel — push+deploy kapılı)</td><td><span class="badge b-done">yeşil</span></td></tr>
<tr><td>T21</td><td>canlı prob: /v1/artifacts/d1/pano → sürüm listesi · /a/d1/pano/v1 ≠ /v29 (farklı gövde) · ?v= sürüm SEÇMİYOR (hepsi latest) → seçici path-tabanlı /a/o/n/vN</td><td><span class="badge b-done">yeşil</span></td></tr>
<tr><td>T22</td><td>md ölçümü: format=md KABUL ediliyor ama render YOK (ham metin skeleton'da) → publish-time conversion kararı; tools/md-publish.py → md-test v3 canlı 200 (h1/table/styled), DELETE temiz</td><td><span class="badge b-done">yeşil</span></td></tr>
<tr><td>T22</td><td>jsx: HART_RUNTIME_DIR=/data/runtime envs-API ile yazıldı + redeploy → /_hart/runtime/* 3/3 → 200 · jsx-test publish wrapper+#root kanıtlı · regresyon 5/5 200 · DELETE temiz</td><td><span class="badge b-done">yeşil</span></td></tr>
<tr><td>T23</td><td>ARTF-016/017 kodu: <code>review/arti.py</code> + köprü JS → python test_app.py → <b>46/46 OK</b> (T25-T42 yeni: store roundtrip/upsert/kota sınırları/izolasyon/404'ler · complete mock/prompt sınırları/günlük tavan 429/store rate 429/sayfa markerları) · test_asistan.py A1-A21 regresyon yeşil · repo bc16ecb</td><td><span class="badge b-done">yeşil</span></td></tr>
<tr><td>T23</td><td><b>DEPLOY TAMAM</b>: compose_raw PATCH image→review-0.7 + Coolify deploy · CANLI kanıt: store roundtrip (set→get→list→del→404) · complete → {"text":"Merhaba!"} (gerçek LLM) · 422/404 sınırları · regresyon 8/8 200 · bind mount korundu. İki deploy bulgusu düzeltildi: (1) uçlar /review/arti/api/* altına taşındı — Traefik review'e yalnız /review+/asistan path'lerini yönlendirir; (2) Dockerfile COPY listesine arti.py eklendi — ilk image'da yoktu, route kayıtsızdı</td><td><span class="badge b-done">yeşil</span></td></tr>
<tr><td>T24</td><td>ARTF-018/019/020 kodu: python test_app.py → <b>54/54 OK</b> (T43-T48 yeni: kaynak mock+escape+remix şablonu+404 · olay satırları yorum+store.set+complete · admin 403 fail-closed · complete detail'de prompt yok · sayfa markerları) · repo 4db8524 (yerel — push+deploy kapılı)</td><td><span class="badge b-done">yeşil</span></td></tr>
<tr><td>T25</td><td>ARTF-021 iki-origin: <code>ARTI_HOST</code> env → iframe+linkler a.gonet.com.tr · iframe <code>sandbox="allow-scripts"</code> + arti v2 hello protokolü · review-0.9→<b>review-1.0 CANLI</b> · repo 379347b+3a16d69 · PLAN-ARTF-002 kapandı</td><td><span class="badge b-done">yeşil</span></td></tr>
<tr><td>T26</td><td>Hasat (Mod C): Tur-2 kaynak taraması işlendi (raw bölüm + source özeti + artifact-servis-modeli güncellemesi) · PLAN-ARTF-003 doğdu (ARTF-022..028; küçük paket 022+025+026 onaylı) · kaynakça +7 kayıt · seyir kaydı · devir notu eki · TUR KAPISI yeşil</td><td><span class="badge b-done">yeşil</span></td></tr>
<tr><td>T27</td><td>F6 küçük paket CANLI: review-1.1 (ARTF-022 meta + ARTF-026 asistan-köprüsü) · test <b>74/74</b> (T56-T63c) + asistan A1-A21 · canlı: meta PUT/GET roundtrip · galeri+bar "📋 Artifacts-D1 Pano" · served title · regresyon 10/10 200 · md-publish --expect guard + --title/--icon (v3 smoke kanıtlı) · repo 6abdbb1 push'lu</td><td><span class="badge b-done">yeşil</span></td></tr>
<tr><td>T29</td><td>ARTF-029 srcdoc mimarisi CANLI (review-1.3): iframe cift katmanli CSP kirilimi (frame-src + frame-ancestors) duzeltildi — govde ic agdan + base/meta-CSP inject → srcdoc; review+embed+asistan uc yuzeyde headless Chrome render kanitli · test 99+21+9 yesil · repo fb9dc33</td><td><span class="badge b-done">yeşil</span></td></tr>
<tr><td>T28</td><td>F7 orta paket + fizibilite CANLI: review-1.2 (ARTF-023 embed+allowed-domains · ARTF-024 sahip pin'i · ARTF-027 retention aracı) + ARTF-028 raporu · test T64-T77 + retention T1-T9 yeşil · canlı: pin/embed roundtrip + 7/7 uç 200 + retention dry-run aday=0 · repo a85af39+c4a5b4c · <b>PLAN-ARTF-003 kapandı</b></td><td><span class="badge b-done">yeşil</span></td></tr>
</table>

<h2>Servis durumu (PROD)<a class="ai-i" target="_top" href="/asistan/d1/pano?s=Servis%20durumu%20%28PROD%29&amp;expl=Kalem%20De%C4%9Fer%20URL%20artifacts.gonet.com.tr%20%28Traefik%2BLE%2C%20http%E2%86%92https%29%20Stack%20hart%20v0.4.3%20%28pin%2Bsha256%29%20%C2%B7%20Coolify%20service%20%28uuid%20container%29%20%C2%B7%20SQLite%20Coolify-volume%20%C2%B7%20Trae" data-s="Servis durumu (PROD)" title="Bu bolumu sor" aria-label="asistan">i</a></h2>
<table>
<tr><th>Kalem</th><th>Değer</th></tr>
<tr><td>URL</td><td><a href="https://artifacts.gonet.com.tr">artifacts.gonet.com.tr</a> (Traefik+LE, http→https)</td></tr>
<tr><td>Stack</td><td>hart v0.4.3 (pin+sha256) · Coolify service (uuid container) · SQLite Coolify-volume · Traefik+LE</td></tr>
<tr><td>Repo</td><td><code>Guru35/artifacts-d1-service</code> (private) · <code>~/Code/artifacts-d1</code></td></tr>
<tr><td>Publish</td><td><code>POST /v1/publish</code> + <code>Authorization: Bearer $HART_TOKEN</code> (env'de, yazdırılmaz)</td></tr>
<tr><td>Görünürlük</td><td>unlisted (varsayılan) · public · private (read-key/parola)</td></tr>
<tr><td>Keşif</td><td><code>HART_EXPLORE=0</code> → /explore kapalı (link-only)</td></tr>
<tr><td>Backup</td><td>~/artifacts-d1-backup/2026-09-27/hart-data.tar.gz (sha256:8076f764…) — restore tatbikatı kanıtlı</td></tr>
<tr><td>İşletim</td><td>Coolify: proje artifacts (zlhfs6…) · service 5w76wyoipamcklcpg2snu6v5 · API localhost:8000/api/v1 · token ~/.coolify/token-artifacts-d1</td></tr>
<tr><td>Backup</td><td>günlük cron 03:35 (~/srv/artifacts-d1/backup.sh, 14 gün retention) + elle kanıtlı arşiv</td></tr>
<tr><td>Bilinen artıklar</td><td>yok — 7 test artığı T5'te silindi (DELETE /v1/artifacts, publish token) · envanter: yalnız d1/pano · eski volume artifacts-d1_hart-data diskte ek yedek</td></tr>
</table>

<h2>Tur kayıtları<a class="ai-i" target="_top" href="/asistan/d1/pano?s=Tur%20kay%C4%B1tlar%C4%B1&amp;expl=Tur%20Tarih%20%C3%96zet%20T1%202026-09-27%20Do%C4%9Fum%20%28Sablon-D1%E2%86%92ARTFD1%29%20%C2%B7%20kimlik%20dolumu%20%C2%B7%20harita%20sat%C4%B1r%C4%B1%20%C2%B7%20uzak%20repo%20Guru35/Artifacts-D1%20%C2%B7%206%20raw%20derleme%20%285%20emsal%2BClaude%20docs%2BCooli" data-s="Tur kayıtları" title="Bu bolumu sor" aria-label="asistan">i</a></h2>
<table>
<tr><th>Tur</th><th>Tarih</th><th>Özet</th></tr>
<tr><td>T1</td><td>2026-09-27</td><td>Doğum (Sablon-D1→ARTFD1) · kimlik dolumu · harita satırı · uzak repo Guru35/Artifacts-D1 · 6 raw derleme (5 emsal+Claude docs+Coolify) · 2 kavram+3 entity+7 source+MOC+PLAN-ARTF-001 · pano v0</td></tr>
<tr><td>T2</td><td>2026-09-27</td><td>ARTF-002 karar: hart (delegasyon) · repo Guru35/artifacts-d1-service · staging container (coolify net, Traefik+LE) · DNS artifacts.gonet.com.tr · 8 kanıt yeşil (401/201/v2/422/restart/CSP/TLS/302) · <b>servis CANLI</b></td></tr>
<tr><td>T3</td><td>2026-09-27</td><td>ARTF-004 private/read-key kanıtlı (401 unlock · read-key 200 · clear_read_key geçişi) · ARTF-005 limitler (429 ~10/dk, 5MB kabul) · ARTF-006 artifact-publish skill + doğrulama 200 · backup/restore tatbikatı (tar.gz + geçici instance'ta 13 artifact) · kalan: Coolify kaydı + prod kararı</td></tr>
<tr><td>T4</td><td>2026-09-27</td><td>ARTF-007: Coolify service kaydı (tinker token mint → POST /services base64 compose → deploy) · volume-rename tuzağı aşıldı · 13 artifact korundu · <b>PROD ilanı — PLAN-ARTF-001'in 7 paketi tamam</b></td></tr>
<tr><td>T4d</td><td>2026-09-27</td><td>Paralel-oturum doğrulaması (iş tekrarı yapılmadı) · LLMWKD1'e bilgi mektubu · harita PROD satırı · bayrak: posta-kuyruk kalıntısı + çift-oturum notu · plan künyesi kapatıldı · <b>pano-yayinla.sh → v6</b></td></tr>
<tr><td>T5</td><td>2026-09-27</td><td>Kök sayfa "çalışmıyor" ihbarı → teşhis: stok landing (kesinti yok) · HART_LANDING ile özel giriş sayfası · HART_TOKEN rotasyonu aynı restart'ta (eski 401) · landing.html repo'da · <b>pano v7</b></td></tr>
<tr><td>T5</td><td>2026-09-27</td><td>admin token + 7/7 artık silindi (yalnız d1/pano) · günlük backup cron'u (03:35, 14 gün) · Sablon-V3 değerlendirme raporu + Sablon-D1'e tohum mektubu · envs-API>compose + DELETE bulguları</td></tr>
<tr><td>T6</td><td>2026-09-27</td><td>derin kök-neden: paralel el = sınır-ötesi Claude (Hetzner-D1, 565c465e) · aktif-ajan-kilit v1.1.0 körlüğü (sinyal=oturum kökü) · v1.2.0-aday patch testli (11/11+47/47) · Loops'a kanıtlı bildirim · bayrak düzeltildi</td></tr>
<tr><td>T7</td><td>2026-09-27</td><td>ARTF-008: paralel oturumun yorum araştırması iskelete döndü — review/ servisi (iframe+panel, ayrı SQLite) 11/11 test, repo 82929eb · deploy onayı bayrak'ta · kök-ötesi devin yazımı canlı kanıtlandı (luxuriant-flig)</td></tr>
<tr><td>T8</td><td>2026-09-27</td><td>ARTF-008 CANLI ("yapılsın"): review companion Coolify'da — <a href="https://artifacts.gonet.com.tr/review/d1/pano">/review/d1/pano</a> çalışıyor, yorum roundtrip kanıtlı · strip-false + url-alanı tuzakları çözüldü · backup.sh cift-volume · bayrak KAPALI</td></tr>
<tr><td>T9</td><td>2026-09-27</td><td>Bakım + karar temizliği: durum.md bayatı düzeltildi · posta-kuyruk.json Sablon-D1 kalıntısı operatör onayıyla silindi (bayrak KAPALI) · servis sağlık: hart+review up, /review/healthz 200</td></tr>
<tr><td>T10</td><td>2026-09-28</td><td>ARTF-008b parity tamamlandı: resolve toggle + pin ekle (overlay %x/%y + marker) + sürüm passthrough · review-0.2 Coolify deploy · test 16/16 + canlı kanıt bataryası yeşil · repo e6947d3</td></tr>
<tr><td>T7</td><td>2026-09-27</td><td>yorum katmanı araştırması (4 seçenek matrisi, öneri: ince companion — karar operatörde) · <b>Sablon-V3-D1 kuruldu</b> + sandbox doğum testi YEŞİL + GitHub push · harita satırı + Sablon-D1 karşılama mektubu · V3 saha bulgusu: yer-tutucu turu *.md-only</td></tr>
<tr><td>T11</td><td>2026-09-28</td><td><b>Maraton8</b> (gözetimsiz bakım koşusu): 6 bug kanıtlanıp düzeltildi — anchor 0..1 · esc() quote/XSS · sayfa CSP+nosniff · XFF rate-kovası · created_at offset · comments artifact-var koruması; +bozuk-JSON→400, WAL, admin-delete (fail-closed). <b>Olay:</b> compose_raw PATCH Coolify volume adını çift-uuid yaptı → boş volume, pano 404 → kalıcı fix: host bind mount (~/srv/artifacts-d1/*-data), backup.sh uyarlama. Bakım: watchdog */10 + aylık restore tatbikatı cron. Test: test_maraton8.py M1–M12 yeşil (suite toplam 38). review-0.4 canlı (asistan dahil — paralel tur). Repo d22815c.</td></tr>
<tr><td>T12</td><td>2026-09-28</td><td><b>ARTF-009 "(i) asistan" CANLI</b>: <a href="https://artifacts.gonet.com.tr/asistan/d1/pano">/asistan/d1/pano</a> 200 — postMessage balon + chat API + statik açıklamalar (pano v17'de 9 ikon enjekte). Coolify fqdn virgül-listesiyle /asistan Traefik router'ı üretti; pigme ağı cross-connect ile LiteLLM'e ulaşıldı. Test: enjekte 13/13 + A1-A10. Repo b845f08. <b>Eksik:</b> chat upstream API anahtarı bekliyor (pigme env'leri boş) — statik açıklamalar çalışıyor, chat 502 zarif.</td></tr>
<tr><td>T13</td><td>2026-09-28</td><td>Sıradakiler paketi: cross-network <b>kalıcılaştı</b> (pigme compose'a external <code>artfd1</code> ağı — recreate'te düşmez) · landing'e <a href="/asistan/d1/pano">asistanlı görünüm</a> linki · watchdog'a /asistan alarm-only kontrol · 2 standard sayfaya stale_after · tek kalan: OPENAI_API_KEY operatörde</td></tr>
<tr><td>T14</td><td>2026-09-28</td><td><b>ARTF-009 TAM CANLI</b>: anahtar panodan `litellm.env`'e (transkriptsiz, 600) → /opt/pigme'nin IDE-buffer ezmesi + root izinleri yüzünden <b>rota değişimi: direkt api.openai.com</b> (LiteLLM yolu opsiyonel kaldı) → canlı kanıt: POST /asistan/api/chat → <b>200 gerçek cevap</b>. Bayrak kapandı.</td></tr>
<tr><td>T15</td><td>2026-09-28</td><td><b>/asistan/ayar CANLI</b>: operatör self-servis key yönetimi — admin-token korumalı formdan OpenAI key kaydet/test et/sil (db'de, sayfada sk-…son4 maskeli); db-key varsa chat direkt api.openai.com, yoksa env yolu yedek. Harcama freni: ASISTAN_DAILY_TOKENS=200k/gün → aşımda 429. Canlı kanıt: 403/403/200 · save→maske · test→gerçek upstream 401 · clear→env'e dönüş → chat yine 200. Test A11–A21 (suite 49/49) · review-0.5 deploy'lu · repo f11e634.</td></tr>
<tr><td>T16</td><td>2026-09-28</td><td><b>ARTF-009 tıklama sağlamlaştırma</b>: (i) ikonları <code>&lt;a href="/asistan/…?s=…"&gt;</code> — JS'siz bile çalışır (progresif geliştirme); iframe'de postMessage→balon, standalone'da yerel balon→location.href (window.open kalktı). <b>Kök neden bulgusu:</b> review script'i v0.2'den beri SyntaxError'le TAMAMEN ölüydü (üç-tırnaklı Python şablonunda \' yenir → çıplak ' → script parse olamaz) — düzeltildi, node --check temiz. /review'a ai→asistan nav eklendi. Yayın: pano v23, review-0.5.2; headless E2E 4/4; canlı chat 200. Repo a2e93a0+ad887ed.</td></tr>
<tr><td>T17</td><td>2026-09-28</td><td><b>Watchdog→posta köprüsü</b>: ALARM/AKSIYON/KRITIK satırları artık vault'un kendi <code>raw/bildirim-*</code> kutusuna düşer (6sa dedup, <code>--posta-test</code> kanıt ucu; sonraki oturum posta-uyari ile görür) · yazilacaklar 2 sayfa yazıldı (tam-hucre-dogrulama, fact-prosedur-ayrimi → kuyruk boş) · pano skill'e çip-senkron notu · rutinler ölçüldü: backup 03:35 otomatik koştu (200/200, 36K+4K), watchdog 8/8 OK · repo d63a1da</td></tr>
<tr><td>T18</td><td>2026-09-28</td><td><b>Bayrak+posta toplu turu</b>: posta araçları Sablon-D1'den kuruldu (13 dosya — skill §0 ARAC-EKSIK kapandı) · kendi kutum TEMIZ (0 işlenmemiş) · iki giden mektup karşıda bekliyor (Loops kilit 1308 + LLM-Wiki servis 1211, ~1g &lt; 3g uyku eşiği) · <b>karar-kuyrugu.md açıldı</b>: K1 Sablon-V3 + K2 filo posta birikimi (1246 işlenmemiş bildirim / ~110 vault — filo sağlığı bizim işimiz değil) · <b>operatör cevapları:</b> K1 "şimdilik hayır", K2 "CNNCT'ye bildir" → mektup push'landı (CNNCT ~11g uykuda, kuyrukta) · kuyruk boş</td></tr>
<tr><td>T19</td><td>2026-09-28</td><td><b>Hasat + devir kapanışı</b>: 2 yeni ders (bayat-yukleme-raporu · ezilen-duzeltme-sahiplik-katmani) · artifact-servis-modeli güncellendi · PLAN-ARTF-001'e ARTF-008/009 kapanışları işlendi · devir-20260928.md yazıldı · iki alici-uykuda sinyali islendi (CNNCT ~11g · Sablon ~3g, ikisi de bilgi sınıfı)</td></tr>
<tr><td>T20</td><td>2026-09-28</td><td><b>Rutin işletim kontrolü — tüm yüzeyler yeşil</b>: 4 uç 200 (/, /a/d1/pano, /review/healthz, /asistan/d1/pano) · watchdog temiz (fails=0, disk 38%, tls 88g) · backup 03:35 yeşil (36K+4K, 200/200) · kutu temiz (posta-var rc=0) · hart+review container up · pano çipi bayatı düzeltildi (TUR 17→20)</td></tr>
<tr><td>T21</td><td>2026-09-28</td><td><b>Claude-parity F1 kodlandı (ARTF-011/012)</b>: <code>/review/galeri</code> public artifact listesi (hart /v1 admin okuması sunucuda kalır; unauth probe ile private/read_key'liler + admin gizli bayraklılar elenir) · <code>/review/{o}/{n}/versions</code> sürüm ucu · review sayfasında sürüm seçici (iframe <code>/a/o/n/vN</code>'e döner — ?v= sürüm seçmiyor, kanıtlı) + pin/latest link kopyalama + unverified bandı · admin gizle ucu fail-closed · compose review-0.6 + HART_ADMIN_TOKEN env · test 24/24 yeşil · repo 8d77e9c · <b>DEPLOY TAMAM</b>: compose_raw PATCH (base64) + env enjeksiyonu + Coolify deploy → review-0.6 canlı; 6 uç 200, galeri'de d1/pano, versions ucu 30 sürüm dönüyor, bind mount korundu. Olay-notu: ilk deploy bayat image'la crash-loop'a girdi (~4dk review kesintisi) — image test-fix'ten ÖNCE build edilmişti; rebuild + redeploy ile çözüldü. Ders: image kod-finalden sonra build edilir, redeploy öncesi image içeriği doğrulanır</td></tr>
<tr><td>T22</td><td>2026-09-28</td><td><b>Claude-parity F2</b>: <b>ARTF-013 tamam</b> — <code>tools/md-publish.py</code> (md→styled HTML publish-time conversion; hart format=md'nin render ETMEDİĞİ ölçüldü, ham metin dönüyor) → md-test v3 canlı kanıt · <b>ARTF-014 kısmi</b> — format=jsx publish+wrapper çalışıyor ama <code>/_hart/runtime/*</code> 404: HART_RUNTIME_DIR env'i compose'da yok → react/react-dom/babel /data/runtime'a seed'lendi (bind mount, kalıcı), env+redeploy <b>aşıldı</b> (T22-ek: envs API + redeploy → runtime 3/3 200) · artifact-publish skill'e formatlar bölümü · README eki · test artifact'ları DELETE'lendi</td></tr>
<tr><td>T23</td><td>2026-09-28</td><td><b>Claude-parity F3 kodlandı (ARTF-016/017)</b>: <code>window.arti</code> köprüsü — artifact'a gömülen shim postMessage ile review wrapper'ına ulaşır (<code>arti.req</code>/<code>arti.res</code>, declare-meta + origin+source kapısı, CSP postMessage'ı engellemez); wrapper <code>/arti/api/*</code> uçlarını çağırır. Yeni <code>review/arti.py</code>: <code>POST /arti/api/complete/{o}/{n}</code> (serbest LLM tamamlama — asistan'la ORTAK IP rate + 200k/gün token sayacı) · <code>GET|POST|DELETE /arti/api/store/{o}/{n}</code> (artifact-özel KV: key≤64 regex · value≤32KB · ≤50 key · ≤256KB toplam · 30 yazım/dk) · download parent'ta Blob. Sınırlar kanıtlı: 46/46 test yeşil + asistan regresyon · non-string key/prompt → 422 (500 değil, self-review bulgusu düzeltildi). Sözleşme: artifact-publish skill'e "window.arti köprüsü" bölümü (declare meta + shim snippet) · compose review-0.7 · repo bc16ecb+0c9abe7 — <b>DEPLOY TAMAM</b>: uçlar /review/arti/api/* altına taşındı (Traefik yalnız /review+/asistan yönlendirir — ilk deploy 404'ledi) + Dockerfile'a arti.py eklendi; canlı: store roundtrip + complete→{"text":"Merhaba!"} + 8/8 regresyon</td></tr>
<tr><td>T24</td><td>2026-09-28</td><td><b>Claude-parity F4 kodlandı (ARTF-018/019/020)</b>: yeni-sürüm bandı (15sn versions poll, latest artınca "v{N} yayında" → tıkla latest) · <code>/review/{o}/{n}/kaynak</code> view-source+remix sayfası (escaped pre + kopyala + curl şablonu, 200KB kesim — view-source: linki tıklanamaz) · olay günlüğü: <code>events</code> tablosu + log_event yorum/resolve/store/complete/gizle uçlarına bağlandı, admin <code>GET /review/admin/olaylar</code> (x-review-admin fail-closed) — detail'e prompt/secret asla yazılmaz. Test 54/54 + bir bulgu düzeltildi (T46: d1/pano 50-key doluydu, store testi ayrı artifact'a taşındı) · repo 4db8524 — <b>push+deploy ayrı onayda</b></td></tr>
<tr><td>T25</td><td>2026-09-28</td><td><b>F4 DEPLOY + ARTF-021 iki-origin CANLI</b>: review-0.8 (F4 deploy kapanışı) → ARTF-021 fizibilite (iki-origin) → C-adımı iframe sandbox + arti v2 hello (review-0.9) → A-adımı ARTI_HOST env (review-1.0) · ikinci origin a.gonet.com.tr ayakta · repo 379347b+3a16d69 · <b>PLAN-ARTF-002 tamamlandı</b> (11 paket, 5 faz)</td></tr>
<tr><td>T26</td><td>2026-09-28</td><td><b>Tur-2 derin kaynak taraması + PLAN-ARTF-003 + hasat</b>: code.claude.com docs + changelog + 4 destek makalesi + Compliance API + topluluk CLI + GH #70254 → raw Tur-2 bölümü · kaynak sayfası özeti · artifact-servis-modeli güncellendi · <b>PLAN-ARTF-003</b> (durum matrisi + ARTF-022..028; operatör kararı: küçük paket = ARTF-022+025+026) · F6 küçük paket mühürlendi ama kodlanmadı → sonraki oturuma · kaynakça +7, seyir +1 kayıt</td></tr>
<tr><td>T27</td><td>2026-09-28</td><td><b>F6 küçük paket CANLI (review-1.1)</b>: ARTF-022 metadata (artifact_meta icon + hart ?title= tek kaynak + md-publish --title/--icon emoji favicon) · ARTF-025 stale-publish guard (md-publish --expect N → uyumsuzsa keser; hart binary server-side desteklemez) · ARTF-026 yorum→asistan köprüsü (yorum kartında "asistana sor" → /asistan?s=) · test 74/74 + asistan regresyonu · canlı doğrulama: meta roundtrip + galeri/bar icon+title + 10/10 uç 200 · md-publish private-verify bug'ı düzeltildi (read-key header eksikti) · repo 6abdbb1 push'lu · pano v41+ republish</td></tr>
<tr><td>T29</td><td>2026-09-29</td><td><b>ARTF-029 srcdoc CANLI (review-1.3)</b>: iki-origin sonrası önizleme iframe'i tarayıcıda kırıktı (sayfa CSP frame-src 'self' + hart sabit frame-ancestors/XFO — headless Chrome'la doğrulandı). Gövde iç ağdan çekilip <code>&lt;base&gt;</code>+meta-CSP inject'le <code>srcdoc</code>'a gömüldü; sandbox opaque origin korunur, embed allowed_domains artık gerçekten bağlayıcı. TDD T53 kırmızı→yeşil, T78-T87 yeni, 99+21+9 test; canlıda üç yüzeyde gerçek render (CSP hatası sıfır) · repo fb9dc33 · ders: tarayıcı davranışı tarayıcıyla sınanır (dersler/)</td></tr>
<tr><td>T28</td><td>2026-09-28</td><td><b>F7 orta paket CANLI (review-1.2) — PLAN-ARTF-003 KAPANDI</b>: ARTF-023 embed sarıcısı (<code>/review/{o}/{n}/embed</code>, CSP frame-ancestors allowed_domains'ten) + "embed kodu" butonu · ARTF-024 sahip pin'i (<code>artifact_meta.published_version</code>, admin PUT, varolmayan sürüm 422; iframe pin'li sürüme döner) · ARTF-027 <code>tools/retention.py</code> (dry-run varsayılan, --uygula+--onay EVET çift kapı) · ARTF-028 fizibilite raporu (O3 kapat / O2 tetiklenirse) · test T64-T77 + retention T1-T9 + maraton8/asistan regresyonları yeşil · <b>DEPLOY</b>: compose_raw PATCH review-1.2 + restart + PUBLIC_BASE env (embed kodu https üretir — Traefik TLS tuzağı) · canlı kanıt: pin set→/v1→temizle roundtrip, embed CSP, 7/7 uç 200, retention dry-run aday=0 · repo a85af39+c4a5b4c push'lu</td></tr>

</table>

<footer>
Pano prosedürü: <code>.devin/skills/pano/SKILL.md</code> — her tur/görev
kapanışında güncelle + commit + push. Bu dosya gelecekte servisin ilk
test artifact'ıdır (self-hosted publish → kendi public linki).
</footer>
</main>
<!-- ai-asistan --><style>
a.ai-i{display:inline-block;min-width:18px;height:18px;padding:0 4px;margin-left:6px;
 border:1px solid #2563eb;border-radius:50%;background:#fff;color:#2563eb;
 font:700 11px/16px system-ui;cursor:pointer;vertical-align:2px;
 text-decoration:none;text-align:center;line-height:17px}
a.ai-i:hover{background:#2563eb;color:#fff}
#ai-bal{position:fixed;right:14px;bottom:14px;z-index:9999;width:340px;max-width:90vw;
 background:#fff;border:1px solid #bbb;border-radius:12px;box-shadow:0 8px 30px #0003;
 padding:10px 12px;font:14px/1.5 system-ui;display:none}
#ai-bal.ac{display:block}
#ai-bal h4{margin:0 0 6px;font-size:14px}
#ai-bal .ex{color:#555;font-size:13px;margin:4px 0 8px}
#ai-bal .x{float:right;cursor:pointer;color:#888}
#ai-bal a{display:inline-block;margin-top:6px;padding:6px 12px;background:#2563eb;
 color:#fff;border-radius:8px;text-decoration:none;font-size:13px}
</style>
<div id="ai-bal"><span class=x onclick="document.getElementById('ai-bal').classList.remove('ac')">✕</span>
<h4 id="ai-bt"></h4><div class="ex" id="ai-ex"></div>
<div style="display:flex;gap:6px"><input id="ai-q" placeholder="AI'a sor…" style="flex:1;padding:6px;border:1px solid #ccc;border-radius:6px;font:inherit">
<a id="ai-go" href="#">sor</a></div>
<div style="font-size:11px;color:#999;margin-top:6px">AI sohbeti asistan sayfasinda acilir</div></div><script>
var __AI_EXPL={"Hedef · Kapsam · Sınır": "", "Sprint rayı": "S0 doğum+araştırma+plan+pano ✔ S1 mimari karar: hart ✔ S2 servis MVP staging'de CANLI ✔ S3 sürüm+paylaşım+sandbox ✔ (private/parola + limitler kanıtlı) S4 ajan ", "İş paketleri (PLAN-ARTF-001)": "Paket Sprint İçerik Kanıt testi Durum Bağlı ARTF-001 S0 Vault doğumu, kimlik, 7 raw derlemesi, wiki katmanı, plan, pano v0 kapı YEŞİL + remote kanıtı (44731ca) ", "Emsal matrisi (S1 karar tabanı)": "Aday cx53 Sürüm Paylaşım Sandbox Sinyal artifact-server (plannotator) ✔ Compact Compose immutable + review link WorkOS/OIDC, private/public iki-origin (en güçlü", "Kararlar": "Tarih Karar Kim 2026-09-27 Tek turda doğum+araştırma+plan+pano operatör 2026-09-27 Servis kodu ayrı repo + Coolify deploy operatör 2026-09-27 Sablon-V3-D1 ertel", "Tuzaklar": "stored-XSS: untrusted HTML app origin'inde sunulursa oturum sızar → iki-origin veya CSP 'none' zorunlu. token kaybı = kontrol kaybı: hesapsız sahiplikte writeTo", "Kanıt kayıtları": "Tur Kanıt Sonuç T1 dogur-vault-d1.sh çıktısı: TUR KAPISI YESIL, 48→62 sayfa, araçlar 7/7 yeşil T1 uzak-repo-kur.sh: ls-remote HEAD a8ca00e (Guru35/Artifacts-D1)", "Servis durumu (PROD)": "Kalem Değer URL artifacts.gonet.com.tr (Traefik+LE, http→https) Stack hart v0.4.3 (pin+sha256) · Coolify service (uuid container) · SQLite Coolify-volume · Trae", "Tur kayıtları": "Tur Tarih Özet T1 2026-09-27 Doğum (Sablon-D1→ARTFD1) · kimlik dolumu · harita satırı · uzak repo Guru35/Artifacts-D1 · 6 raw derleme (5 emsal+Claude docs+Cooli"};
(function(){var EXPL=__AI_EXPL||{},AI_ART='/asistan/d1/pano';
document.addEventListener('click',function(e){
 var b=e.target.closest?e.target.closest('a.ai-i'):null;if(!b)return;
 e.preventDefault();
 var s=b.getAttribute('data-s')||'',ex=EXPL[s]||b.getAttribute('data-e')||'';
 if(window.parent!==window.self){window.parent.postMessage({type:'ai',baslik:s,aciklama:ex},'*');return;}
 var bal=document.getElementById('ai-bal');if(!bal){location.href=b.href;return;}
 document.getElementById('ai-bt').textContent=s;
 document.getElementById('ai-ex').textContent=ex;
 var q=document.getElementById('ai-q');
 var go=function(){var url=AI_ART+'?s='+encodeURIComponent(s)+(ex?'&expl='+encodeURIComponent(ex):'');
  if(q.value)url+='&q='+encodeURIComponent(q.value);location.href=url};
 document.getElementById('ai-go').onclick=function(ev){ev.preventDefault();go()};
 q.onkeydown=function(ev){if(ev.key==='Enter')go()};
 bal.classList.add('ac');});
})();
</script><!-- /ai-asistan --></body>
</html>
</body></html>
remix: kaynağı kopyala → düzenle → yeni artifact olarak publish et: TOKEN=$(grep '^HART_TOKEN=' ~/Code/artifacts-d1/.env | cut -d= -f2) curl -X POST "https://artifacts.gonet.com.tr/v1/publish?owner=d1&artifact=YENI-SLUG&visibility=unlisted" -H "Authorization: Bearer $TOKEN" -H 'content-type: text/html' --data-binary @duzenlenmis.html (remix publish tokenı ister — HART_TOKEN .env'de; hesapsız modelde çatal link ile değil bu komutla olur)