Skip to content

feat(api): tren-f — TENANT-001 T3 + T4a: tenant sınırı efektif bayrağı ve WS kabuk borusu - #96

Merged
AlbSar merged 12 commits into
mainfrom
train-2026-08-07-f
Aug 7, 2026
Merged

feat(api): tren-f — TENANT-001 T3 + T4a: tenant sınırı efektif bayrağı ve WS kabuk borusu#96
AlbSar merged 12 commits into
mainfrom
train-2026-08-07-f

Conversation

@AlbSar

@AlbSar AlbSar commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

PR #95'in (tren-e) yerine geçer — o dalın tüm commit'lerini içerir. #95 ayrı
kırmızıydı: oradaki kapsam-düzeltmesi commit'i rozetleri güncellemeden gitti;
bu dalda tazelendi.

Ne yapıldı (düz Türkçe)

İki dilim var: T3 kalan iki HTTP girişini kapattı, T4a ise T3'ün ardından
yapılan ön-kontrolde bulunan iki yapısal açığı kapattı.

T3 — /api/plan + /api/terminal/* HTTP rotaları

Tenant iddiası olmayan çağıran sessizce 'local' kiracısına düşüyordu. İkisi de
T2'nin ortak resolveApiCallerTenant kararına bağlandı: strict AÇIK → 403,
strict KAPALI → v1 bayt-değişmez.

T4a — açık #1: bayrak "açık" görünüyordu ama kapatmıyordu

Senkron okuyucu yalnız proje config'ini okuyordu; oysa loadConfig
defaults → global → project zinciri kuruyor. Global (filo/host) katmanında
strict açan bir operatörde T2/T3'ün bağladığı altı site sessizce permissive
kalıyordu
. Bu, daha önce iki kez kapatılan "raporlar-ama-kapatmaz kontrol"
sınıfının üçüncü örneği.

Okuyucu artık aynı zinciri yürüyor (yakın katman kazanır). Bozuk bir katman
"görüş bildirmedi" sayılır — ne sessizce sertleştirir ne gevşetir. Global-config
yol çözümü saf yol-modülüne indirildi ve eski yerinden yeniden export edildi:
API katmanı artık toptan vi.mock'lanan ağır config modülünü import etmiyor
(aksi halde o modülü mock'layan beş test kırılıyordu). Davranış ve mevcut
importer'lar değişmedi.

T4a — açık #2: HTTP'de 403 alan çağıran WS'ten kabuk alabiliyordu

attachTerminalGateway sunucuya 'upgrade' dinleyicisi olarak takılı, yani
T3'te kapatılan /api/terminal/* HTTP rotalarının dışında. Asıl PTY borusu
orası. Strict modda tenant'ı çözülemeyen çağıran artık upgrade'de typed 4403
ile reddediliyor (HTTP 403'ün WS karşılığı) ve bridge()'e hiç ulaşılmıyor.
Strict kapalıyken bayt-değişmez.

Bu ikisi bulunduğu anda, uçuştaki #95'e ayrı bir kapsam-düzeltmesi commit'i
atıldı: T3'ün "terminal kapandı" ifadesi HTTP rotalarıyla sınırlandırıldı —
şişirilmiş bir iddia main'e girmesin diye.

Kanıt

Gerçek-sunucu koşusu (Tier-1): createHttpServer + gerçek PTY backend +
gerçek ws istemcisi, mock yok. strict AÇIK → sunucu soketi 4403 ile
kapatıyor; strict KAPALI → soket açık kalıyor.

Dürüstlük notu: harness ilk sürümde yanlış negatif verdi. Gateway
el-sıkışmayı tamamlayıp sonra kapatıyor (mevcut 4401 auth-deny yolu da öyle),
bu yüzden istemci önce open görüyor. Prob, "open oldu mu" yerine "sunucu
kapattı mı, hangi kodla" ayrımını yapacak şekilde düzeltildi.

  • 4 birim pini (WS strict AÇIK reddi · mTLS'li tenant bağlanır · strict KAPALI v1 · geçersiz token hâlâ 4401, tenant-scope'a karışmaz)
  • 3 katman-öncelik pini (global katman kazanır · proje her iki yönde de üstündür · bozuk katman bir sonrakine bırakır)
  • 2 gerçek-sunucu pini
  • api + core: 622 dosya / 10176 test yeşil, tsc temiz, lint:gates tam zincir yeşil

Açık bırakılan (typed)

Paketlenmiş-binary (deckent serve) teyidi owner-onaylı build adımı
gerektiriyor ve bu dilimde alınmadı — kanıt kaynak-üstü gerçek sunucudur,
binary iddiası yoktur.

Makbuz zinciri

GR-2026-08-07-TENANT-T3-01 · GR-2026-08-07-T3-SUPP-01 ·
GR-2026-08-07-TENANT-T4A-01 · GR-2026-08-07-T4A-SUPP-01 — hepsi consumed.

Kalan kapsam: T4b (memory-search'te tenant yüklemi hiç kurulmuyor, process
read+write, enterprise scope + audit damgaları) · T4c (CLI+MCP host-tenant
0-hardcode çözümü).

🤖 Generated with Claude Code

AlbSar and others added 10 commits August 7, 2026 13:57
…enant-scope

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…inal yüzeylerinde

Kalan iki merkezi NULL-tenant sitesi kapatıldı: /api/plan ingress'i ve
/api/terminal/* (kabuk erişimi taşıdığı için tenant sınırının en duyarlı
yüzeyi). İkisi de T2'nin resolveApiCallerTenant kararına bağlandı — strict
AÇIK: tenant-claim'siz çağıran 403; strict KAPALI: v1 bayt-değişmez.
Doğrulama notu: patch'lenen ilk site 410 ile emekli /api/start DEĞİL, canlı
/api/plan uçudur (kontrol edildi — ölü koda kablo çekilmedi).
Kanıt: 2 yeni resolver-kontrat pini (strict/permissive/tenant'lı + bozuk-config
fail-soft), api sınıfı yeşil, tsc temiz.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…consumed

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…otalarıyla sınırlı

T4 ön-kontrolü iki gerçeği ortaya çıkardı; ikisi de T3'ün ifadesini daraltıyor:

1. WS upgrade HTTP handler'ından geçmiyor. attachTerminalGateway server'a
   'upgrade' dinleyicisi olarak takılıyor, yani T3'te gated ettiğim
   /api/terminal/* HTTP rotasının dışında. Token-only auth'ta authTenant
   'local' kalıyor → HTTP'de 403 alan çağıran WS üzerinden kabuk alabilir.
2. Senkron readStrictTenantIsolation yalnız proje config'ini okuyor;
   loadConfig defaults→global→project zinciri kuruyor. Global katmanda
   strict açan operatörde T2/T3'ün bağladığı 6 site sessizce permissive.
   Bu, 'raporlar-ama-kapatmaz kontrol' sınıfının ÜÇÜNCÜ örneği.

Satır 4020 hâlâ VERIFY — hiçbir DONE iddiası şişirilmedi; yine de ifadeyi
main'e düzeltilmemiş sokmamak için kapsam cümlesi daraltıldı ve kalan iş
T4a/T4b/T4c olarak adlandırıldı.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…rade tenant reddi

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…t reddi

İki yapısal açık kapatıldı; ikisi de T4 ön-kontrolünde ölçümle bulundu.

1. Efektif bayrak. Senkron okuyucu yalnız proje config'ini görüyordu, oysa
   loadConfig defaults→global→project zinciri kuruyor. Global katmanda
   strict açan operatörde T2/T3'ün bağladığı altı site sessizce permissive
   kalıyordu — 'raporlar-ama-kapatmaz kontrol' sınıfının üçüncü örneği.
   Okuyucu artık aynı zinciri yürüyor, yakın katman kazanıyor; bozuk bir
   katman 'görüş bildirmedi' sayılır, sessizce sertleştirmez de gevşetmez de.
   Global yol çözümü saf yol-modülüne indirildi ve eski yerinden yeniden
   export edildi: API katmanı artık toptan mock'lanan ağır config modülünü
   import etmiyor (aksi halde o modülü mock'layan beş test kırılıyordu),
   davranış ve mevcut importer'lar değişmedi.

2. WS kabuk borusu. attachTerminalGateway server'a 'upgrade' dinleyicisi
   olarak takılı, yani T3'te kapatılan /api/terminal/* HTTP rotalarının
   dışında. Strict modda tenant'ı çözülemeyen çağıran artık upgrade'de
   typed 4403 ile reddediliyor (HTTP 403'ün WS karşılığı) ve bridge()'e
   hiç ulaşılmıyor. Strict kapalıyken her iki yol da bayt-değişmez.

Kanıt: gerçek-sunucu koşusu (createHttpServer + gerçek PTY backend + gerçek
ws istemcisi, mock yok) strict AÇIK'ta 4403 kapanışını, strict KAPALI'da açık
kalan soketi gösteriyor. Harness ilk sürümde yanlış negatif verdi: gateway
el-sıkışmayı tamamlayıp sonra kapatıyor (mevcut 4401 yolu da öyle), bu yüzden
prob 'open' ile 'sunucu kapattı mı' ayrımını yapacak şekilde düzeltildi.
Ek 4 birim pini + 3 katman-öncelik pini; api+core: 622 dosya / 10176 test yeşil.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…azelendi

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
AlbSar and others added 2 commits August 7, 2026 14:35
…edi)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Gerçek-sunucu pini yalnız '4403 ile kapatıldı'yı doğruluyordu. El-sıkışma
tamamlandığı için bu, soketin kısa süre köprülenip sonra kapandığı bir
dünyayla da uyumluydu — kabuk borusunda 'geç reddetme' ile 'hiç köprülememe'
farklı güvenlik özellikleridir.

Pin artık iki şeyi daha doğruluyor: reddedilen upgrade'den sonra HİÇ oturum
yaratılmıyor ve el-sıkışma biter bitmez gönderilen create çerçevesine HİÇ
yanıt dönmüyor. İkisi de yeşil → reddetme geç değil.

Ayrıca permissive durum gerçekten PTY açtığından (kanıtın anlamı bu),
afterEach oturumları açıkça öldürüyor: close() yalnız idle olanları topluyor,
sızan kabuk koşu sonrası ayakta kalırdı.

Kanıt cümlesindeki binary şerhi de netleştirildi: build atlanmadı, host
guard'ı tarafından reddedildi — owner'ın build yetkilendirmesi maddeyi kapatır.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@AlbSar
AlbSar added this pull request to the merge queue Aug 7, 2026
Merged via the queue into main with commit 3b61c47 Aug 7, 2026
24 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant