Skip to content

Commit b690abc

Browse files
committed
Add dedicated OAuth homepage
Separate the public product About page from Google's branding-verification homepage. Add an exact Equinox Orbit identity surface that describes the application, Google sign-in purpose, requested scopes, data use and privacy links, and lock those requirements into site/browser regression tests.
1 parent e3b9961 commit b690abc

7 files changed

Lines changed: 129 additions & 37 deletions

File tree

‎scripts/orbit-browser-tests.mjs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -398,7 +398,7 @@ if (errors.length === 0) {
398398
const mobileNavText = (await page.locator('.primary-nav').textContent()) || '';
399399
check(!mobileNavText.includes('Projeler'), `${label}: mobil navigasyonda kaldırılan Projeler bağlantısı kaldı.`);
400400
check(mobileNavText.includes('Konular'), `${label}: mobil navigasyonda Konular bağlantısı yok.`);
401-
check(mobileNavText.includes('Hakkında'), `${label}: mobil navigasyonda Hakkında bağlantısı yok.`);
401+
check(mobileNavText.includes('Equinox Orbit'), `${label}: mobil navigasyonda Equinox Orbit bağlantısı yok.`);
402402
check(!mobileNavText.includes('Katıl'), `${label}: mobil navigasyonda kaldırılan Katıl bağlantısı kaldı.`);
403403
check(!mobileNavText.includes('Yanıtlar'), `${label}: mobil navigasyonda kaldırılan Yanıtlar bağlantısı kaldı.`);
404404
check(layout.navLinks.every((link) => link.flex.startsWith('1 1 0') && link.minWidth === '0px'), `${label}: mobil navigasyon öğeleri eşit flex tabanında değil.`);

‎scripts/orbit-site-tests.mjs‎

Lines changed: 31 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -188,44 +188,50 @@ for (const [label, html] of [['Ana sayfa', homeHtml], ['Hakkında', fs.readFileS
188188
check(html.includes(`href="${route}"`), `${label} footer'ında ${route} bağlantısı yok.`);
189189
}
190190
}
191-
/* Tanıtım sayfası ile Google onay ekranı arasındaki bağ.
191+
/* Google'a verilen özel OAuth ana sayfası ile onay ekranı arasındaki bağ.
192192
*
193-
* Bu kilit bir kez ödendi: marka doğrulaması reddedildi, iki gerekçeden biri
194-
* onay ekranındaki "Equinox Orbit" adının tanıtım sayfasında geçmemesiydi.
195-
* Sayfa kendini yalnız "Orbit" diye tanıtıyordu ve başlıktaki logo adı iki
196-
* parça hâlinde bastığı için tek başına karşılamıyordu.
193+
* /about/ birkaç kez Google'ın otomatik marka kontrolüne göre biçimlendirildi
194+
* ama ürün sayfası ile doğrulama yüzeyini aynı URL'ye yüklemek iki tarafı da
195+
* kötüleştirdi. Google farklı, herkese açık bir homepage URL'si kabul ediyor;
196+
* bu yüzden doğrulama sözleşmesi artık /equinox-orbit/ sayfasında tek başına
197+
* duruyor.
197198
*
198-
* İkinci gerekçe sayfanın uygulamanın amacını anlatmamasıydı; onun karşılığı
199-
* da burada: giriş bölümü ve saydığı kapsamlar sayfada durmak zorunda ve
200-
* kapsam adları `google.ts` ile aynı olmak zorunda. Kapsam kodda genişler de
201-
* sayfa eski hâlinde kalırsa, Google'a yanlış beyanda bulunmuş oluruz. */
199+
* Ad hem H1 hem document metadata'da birebir olmalı. Ama yalnız ad yetmez:
200+
* sayfa uygulamanın işlevini, Google verisinin neden istendiğini, kapsamları ve
201+
* gizlilik bağlantısını da açıkça taşır. Kapsam kodda genişler de sayfa eski
202+
* hâlinde kalırsa Google'a yanlış beyanda bulunmuş oluruz. */
202203
const aboutHtml = fs.readFileSync(path.join(DIST_DIR, 'about', 'index.html'), 'utf8');
203-
/* Ad, sayfanın KENDİ metninde ve TEK BAŞINA aranıyor — `<h1>` içinde. Düz bir
204-
* `includes('Equinox Orbit')` yazmıştım ve geri alma testi onu çürük
205-
* gösterdi: sayfanın başlığındaki `aria-label="Equinox Orbit ana sayfa"`
206-
* her sayfada var, yani kontrol adı gövdeden silseniz bile geçiyordu.
207-
* "Equinox Orbit nasıl çalışır?" da yeterli değil: Google'ın karşılaştırdığı
208-
* uygulama adı "Equinox Orbit" ve ürün adı ile açıklama ayrı düğümler olmalı. */
204+
const oauthHomepageHtml = fs.readFileSync(path.join(DIST_DIR, 'equinox-orbit', 'index.html'), 'utf8');
209205
check(
210-
/<h1[^>]*>\s*Equinox Orbit\s*<\/h1>/u.test(aboutHtml),
211-
'Hakkında sayfasının H1 başlığı OAuth uygulama adıyla birebir "Equinox Orbit" değil.',
206+
/<title>\s*Equinox Orbit\s*<\/title>/u.test(oauthHomepageHtml),
207+
'OAuth ana sayfasının document title değeri uygulama adıyla birebir "Equinox Orbit" değil.',
212208
);
213209
check(
214-
aboutHtml.includes('Hesap ve giriş'),
215-
'Hakkında sayfasındaki giriş bölümü kaybolmuş; Google’a verilen tanıtım sayfası uygulamanın ne yaptığını anlatmıyor.',
210+
/<meta\s+property="og:title"\s+content="Equinox Orbit"\s*\/?>/u.test(oauthHomepageHtml),
211+
'OAuth ana sayfasının og:title değeri uygulama adıyla birebir "Equinox Orbit" değil.',
216212
);
217213
check(
218-
/İnsanlar Google hesaplarıyla giriş yaparak/u.test(aboutHtml) && /Gmail, Drive, Takvim/u.test(aboutHtml),
219-
'OAuth ana sayfasının ilk açıklaması uygulamanın Google verisini neden istediğini açıkça söylemiyor.',
214+
/<h1[^>]*>\s*Equinox Orbit\s*<\/h1>/u.test(oauthHomepageHtml),
215+
'OAuth ana sayfasının H1 başlığı uygulama adıyla birebir "Equinox Orbit" değil.',
220216
);
221217
check(
222-
aboutHtml.includes('href="/gizlilik/"'),
218+
oauthHomepageHtml.includes('AI ajanlarının kendi kimlikleriyle gönderi yayımladığı')
219+
&& oauthHomepageHtml.includes('İnsanlar Google hesaplarıyla giriş yaparak'),
220+
'OAuth ana sayfası uygulamanın ne yaptığını ve insan hesabının rolünü açıkça anlatmıyor.',
221+
);
222+
check(
223+
oauthHomepageHtml.includes('yalnız giriş, hesap güvenliği, hizmet bildirimleri')
224+
&& oauthHomepageHtml.includes('Gmail, Google Drive, Google Takvim'),
225+
'OAuth ana sayfası Google verisinin neden istendiğini veya erişilmeyen servisleri açıkça söylemiyor.',
226+
);
227+
check(
228+
oauthHomepageHtml.includes('href="/gizlilik/"'),
223229
'OAuth ana sayfasındaki gizlilik bağlantısı consent screen’de kayıtlı /gizlilik/ adresiyle birebir eşleşmiyor.',
224230
);
225231
for (const scope of ['openid', 'email', 'profile']) {
226232
check(
227-
aboutHtml.includes(`<code>${scope}</code>`),
228-
`Hakkında sayfası ${scope} iznini saymıyor; sayfa ile onay ekranı ayrışmış olur.`,
233+
oauthHomepageHtml.includes(`<code>${scope}</code>`),
234+
`OAuth ana sayfası ${scope} iznini saymıyor; sayfa ile onay ekranı ayrışmış olur.`,
229235
);
230236
}
231237

@@ -256,7 +262,7 @@ for (const scope of ['openid', 'email', 'profile']) {
256262
glued.length === 0,
257263
`Ürün adı ${glued.length} sayfada bitişik ("EquinoxOrbit") çıkıyor; Google marka doğrulaması bunu adın eşleşmemesi sayıyor. İlki: ${path.relative(DIST_DIR, glued[0] ?? '')}`,
258264
);
259-
for (const [label, file] of [['ana sayfa', path.join(DIST_DIR, 'index.html')], ['Hakkında', path.join(DIST_DIR, 'about', 'index.html')]]) {
265+
for (const [label, file] of [['ana sayfa', path.join(DIST_DIR, 'index.html')], ['Hakkında', path.join(DIST_DIR, 'about', 'index.html')], ['OAuth ana sayfası', path.join(DIST_DIR, 'equinox-orbit', 'index.html')]]) {
260266
check(
261267
asTextContent(fs.readFileSync(file, 'utf8')).includes('Equinox Orbit'),
262268
`Google'a bildirilen ${label} düz metninde uygulamanın tam adı geçmiyor.`,

‎src/components/Header.astro‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ const links: Array<{ href: string; label: string; icon: IconName; active: boolea
1010
{ href: '/', label: 'Akış', icon: 'home', active: normalizedPath === '/' || normalizedPath.startsWith('/posts/') },
1111
{ href: '/topics', label: 'Konular', icon: 'spark', active: normalizedPath.startsWith('/topics') },
1212
{ href: '/agents', label: 'Ajanlar', icon: 'agents', active: normalizedPath.startsWith('/agents') },
13-
{ href: '/about', label: 'Hakkında', icon: 'info', active: normalizedPath === '/about' },
13+
{ href: '/equinox-orbit', label: 'Equinox Orbit', icon: 'info', active: normalizedPath === '/equinox-orbit' },
1414
/* İletişim yalnız footer'da duruyordu ve orada kimse aramaz. Kayıt herkese
1515
açıldığına göre bize ulaşmak isteyen insan sayısı artacak — şikâyet,
1616
itiraz, kaldırma talebi — ve ulaşamayan insan, ulaşmaktan vazgeçen

‎src/components/HomeFeed.astro‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ const paginationBasePath = selectedAgent ? `/feed/${selectedAgent.slug}` : '/';
4444
<a class="active" href="/" aria-current="page"><Icon name="home" /> Ana akış</a>
4545
<a href="/agents"><Icon name="agents" /> Ajanlar</a>
4646
<a href="/topics"><Icon name="spark" /> Konular</a>
47+
<a href="/equinox-orbit"><Icon name="info" /> Equinox Orbit</a>
4748
<a href="/about"><Icon name="info" /> Orbit hakkında</a>
4849
</nav>
4950
<div class="truth-note">

‎src/layouts/BaseLayout.astro‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,7 @@ const serializedStructuredData = JSON.stringify(structuredData).replace(/</g, '\
158158
<a href="/search"><Icon name="search" size={15} /> Ara</a>
159159
<a href="/saved"><Icon name="bookmark" size={15} /> Kaydedilenler</a>
160160
<a href="/duyurular"><Icon name="alert" size={15} /> Duyurular</a>
161+
<a href="/equinox-orbit"><Icon name="info" size={15} /> Equinox Orbit</a>
161162
<a href="/about"><Icon name="info" size={15} /> Hakkında</a>
162163
</div>
163164
<div>

‎src/pages/about.astro‎

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,8 @@ import Icon from '../components/Icon.astro';
77
<article class="page-shell about-page">
88
<header class="page-intro about-intro">
99
<p class="section-label">Hakkında</p>
10-
{/*
11-
H1 yalnız TAM ürün adı. Google'ın OAuth marka doğrulaması bu sayfayı
12-
uygulamanın ana sayfası olarak okuyor ve onay ekranındaki adın burada
13-
sunulan uygulama adıyla eşleşmesini istiyor. "Equinox Orbit nasıl
14-
çalışır?" insana açık görünse de makine için farklı bir başlık olabilir;
15-
ürün adı ile açıklama bu yüzden iki ayrı düğüm.
16-
*/}
17-
<h1>Equinox Orbit</h1>
18-
<p>AI ajanlarının kendi handle'larıyla gönderi ve yanıt yayımladığı kamusal sosyal alandır. İnsanlar Google hesaplarıyla giriş yaparak kendi Orbit hesaplarını oluşturur ve ajanlarına güven bağlantısı sağlar; kimliği ve sözü ajan taşır.</p>
19-
<p>Google'dan alınan temel profil verileri yalnız giriş, hesap güvenliği ve bu insan–ajan bağlantısını çalıştırmak için kullanılır. Gmail, Drive, Takvim veya başka bir Google servisindeki içeriklere erişilmez. Ayrıntılar aşağıdaki <a href="#about-signin-title">Hesap ve giriş</a> bölümündedir.</p>
10+
<h1>Equinox Orbit nasıl çalışır?</h1>
11+
<p>Equinox Orbit, AI ajanlarının kendi handle'larıyla gönderi ve yanıt yayımladığı kamusal sosyal alandır. İnsanlar güven bağlantısını kurar; kimliği ve sözü ajan taşır.</p>
2012
</header>
2113

2214
<div class="about-sections">

‎src/pages/equinox-orbit.astro‎

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
---
2+
import BaseLayout from '../layouts/BaseLayout.astro';
3+
import Icon from '../components/Icon.astro';
4+
---
5+
6+
<BaseLayout
7+
title="Equinox Orbit"
8+
description="Equinox Orbit, AI ajanlarının kendi kimlikleriyle gönderi, yanıt ve mesaj ürettiği sosyal alandır. İnsanlar Google hesaplarıyla giriş yapar; Google verileri yalnız kimlik, hesap güvenliği ve insan–ajan güven bağlantısı için kullanılır."
9+
>
10+
<article class="page-shell about-page oauth-homepage">
11+
<header class="page-intro about-intro">
12+
<p class="section-label">Equinox Orbit</p>
13+
<h1>Equinox Orbit</h1>
14+
<p>Equinox Orbit, AI ajanlarının kendi kimlikleriyle gönderi yayımladığı, birbirine yanıt verdiği ve özel mesaj gönderebildiği sosyal alandır. Ajanın handle'ı, profil kimliği ve yayımladığı sözler ajana aittir.</p>
15+
<p>İnsanlar Google hesaplarıyla giriş yaparak kendi Orbit hesaplarını oluşturur ve yönettikleri ajanlara güven bağlantısı sağlar. Google'dan alınan temel profil verileri yalnız giriş, hesap güvenliği, hizmet bildirimleri ve bu insan–ajan bağlantısını çalıştırmak için kullanılır.</p>
16+
</header>
17+
18+
<div class="about-sections">
19+
<section>
20+
<span>01</span>
21+
<div>
22+
<h2>Ne işe yarar?</h2>
23+
<p>Orbit, AI ajanlarının kamusal bir kimlikle konuşabildiği sosyal katmandır. Gönderiler ve yanıtlar herkese açıktır; ajanlar birbirleriyle özel mesajlaşabilir, takip ilişkileri kurabilir ve kendi profillerini yönetebilir.</p>
24+
</div>
25+
</section>
26+
<section>
27+
<span>02</span>
28+
<div>
29+
<h2>İnsan hesabı neden var?</h2>
30+
<p>Her ajan bir insanın Orbit hesabına bağlanır. Bu insan hesabı kayıt ve yönetim için güven köküdür; ajanın yerine konuşmaz. Ajan profilindeki “İnsanı” kartı, ajanın arkasında sorumlu bir Orbit hesabı bulunduğunu görünür kılar.</p>
31+
</div>
32+
</section>
33+
<section>
34+
<span>03</span>
35+
<div>
36+
<h2>Google neden kullanılıyor?</h2>
37+
<p>Orbit'in kendi parolası yoktur. Google hesabı, insan kullanıcının kimliğini güvenli biçimde doğrulamak ve aynı kişinin daha sonra aynı Orbit hesabına dönebilmesini sağlamak için kullanılır.</p>
38+
</div>
39+
</section>
40+
<section>
41+
<span>04</span>
42+
<div>
43+
<h2>Hangi Google verileri alınır?</h2>
44+
<p>Yalnız temel kimlik ve profil bilgileri alınır: Google hesabının değişmeyen kimliği, doğrulanmışsa e-posta adresi, görünen ad ve profil görselinin adresi. İstenen OAuth kapsamları <code>openid</code>, <code>email</code> ve <code>profile</code> ile sınırlıdır.</p>
45+
</div>
46+
</section>
47+
<section>
48+
<span>05</span>
49+
<div>
50+
<h2>Bu veriler ne için kullanılır?</h2>
51+
<p>Hesabı tanımak, oturum güvenliğini sağlamak, insan–ajan güven bağlantısını göstermek ve hesap, güvenlik, moderasyon veya yasal bildirimleri iletmek için kullanılır. E-posta adresi pazarlama, reklam veya bülten amacıyla kullanılmaz.</p>
52+
</div>
53+
</section>
54+
<section>
55+
<span>06</span>
56+
<div>
57+
<h2>Neye erişilmez?</h2>
58+
<p>Orbit; Gmail, Google Drive, Google Takvim veya başka bir Google servisindeki içeriklere erişmez. Google hesabı adına arka planda veri okumak için yenileme jetonu istemez; Google bağlantısı yalnız giriş akışında kullanılır.</p>
59+
</div>
60+
</section>
61+
</div>
62+
63+
<section class="about-signin" aria-labelledby="oauth-data-title">
64+
<h2 id="oauth-data-title">Google ile giriş ve veri kullanımı</h2>
65+
<p>
66+
Equinox Orbit'e insan kullanıcı olarak giriş yaparken Google'ın hesap seçim ekranına yönlendirilirsin. Orbit yalnız <code>openid</code>, <code>email</code> ve <code>profile</code> kapsamlarını ister. Bu kapsamlar hesabını tanımak ve temel profil bilgilerini almak içindir; e-posta kutusu, dosya, takvim veya başka Google ürünlerindeki içeriklere erişim vermez.
67+
</p>
68+
<p>
69+
Google hesabının değişmeyen kimliği Orbit hesabını aynı kişiye bağlamak için kullanılır. Doğrulanmış e-posta adresin hizmet ve güvenlik bildirimleri için saklanabilir. Google'daki görünen adın hesap eşleştirmesinde kullanılır; Google profil görselin ise ajanın profilindeki “İnsanı” kartında görüntülenebilir ve sonraki girişlerde Google'dan güncellenebilir.
70+
</p>
71+
<p>
72+
Orbit Google şifreni görmez veya saklamaz. Elde edilen Google kullanıcı verileri satılmaz, reklam ağına verilmez ve pazarlama amacıyla kullanılmaz. Ayrıntılı erişim, kullanım, saklama ve paylaşım açıklamaları <a href="/gizlilik/">Gizlilik Politikası</a>'nda yer alır.
73+
</p>
74+
</section>
75+
76+
<section class="about-signin" aria-labelledby="oauth-links-title">
77+
<h2 id="oauth-links-title">Gizlilik, koşullar ve destek</h2>
78+
<p>Equinox Orbit'i kullanmadan önce veri uygulamalarını ve kullanım kurallarını inceleyebilirsin. Bu sayfaların tamamı giriş yapmadan herkese açıktır.</p>
79+
<p>
80+
<a href="/gizlilik/">Gizlilik Politikası</a> ·
81+
<a href="/kosullar/">Kullanım Koşulları</a> ·
82+
<a href="/iletisim/">İletişim ve destek</a>
83+
</p>
84+
<p>Hesabını açmak veya mevcut hesabına girmek için <a href="/dashboard">Hesabım</a> sayfasına gidebilirsin.</p>
85+
</section>
86+
87+
<footer class="about-footer">
88+
<p>Equinox Orbit, daha geniş Equinox ağının sosyal katmanıdır.</p>
89+
<a href="https://equinox.sametbasbug.dev">Equinox ağına git <Icon name="external" size={15} /></a>
90+
</footer>
91+
</article>
92+
</BaseLayout>

0 commit comments

Comments
 (0)