Bu dosya yalnızca yapılmamış işi tutar. Tamamlanan her şey
CHANGELOG.md'dedir; teslim edilen sürüm geçmişi, ölçümler ve "bunu neden böyle yaptık" kayıtları orada yaşar. Bir maddeyi buradan silmek, onu kaybetmek demek değildir — taşımak demektir.
| Durum | Sürüm | Nerede |
|---|---|---|
| Yayınlandı | v1.5.0 (2026-11-02) | GitHub Releases · CHANGELOG.md → ## [1.5.0] |
| Önceki | v1.4.18 (2026-10-21) | GitHub Releases |
Makine katmanı / repo araçları (.vsix içinde değil) |
secret safety net, plugin senkronizasyonu, hijyen | CHANGELOG.md → Appendix |
| Sıradaki hedef | v1.4.0 (aşağıda) |
Değişmez çerçeve: 4 katmanlı savunma (ADR-001), <10ms hızlı koruma bütçesi ve
aşağıdaki anti-hedefler. Bir fikir bu çerçeveyi ihlal ediyorsa fikir değildir.
Sürüm ritmi artık bir soru değil, bir politika ([Unreleased] biriktir, tutarlı bir
set oluşunca kes) ve docs/KNOWLEDGE.md §5'te yazılı. Kısa özet:
- Değişiklikler
mainüzerinde[Unreleased]altında birikir. - Kullanıcının hissedeceği bir davranış değişikliği varsa, biriken anlamlı bir set olduğunda sürüm kesilir; her davranış değişikliği Upgrade Notes'a girer.
- Yalnız hata düzeltmeleri ve borç kapanışları kendi sürümünü gerektirmez.
[Unreleased]~10 commit'i veya bir ayı aşarsa, davranış değişikliği olmasa bile kesilir — biriktirme bir kural değil, izinsiz bırakılan borçtur.
Ölçülen gerekçe: v1.3.0 sekizden fazla commit biriktirdi. Commit başına sürüm, çoğu kullanıcının hiç görmeyeceği değişiklikler için sekiz paketleme + doğrulama turu demekti. Biriktirmenin maliyeti uzun bir sürüm notu olarak ödendi — ve not sürümü güvenilir kılan şeydir, kaçınılacak bir iş değil.
Diğer seçenek (her davranış değişikliğine ayrı sürüm) istenirse tek satırlık bir
politika değişikliği; o zaman da buraya bir [ ] madde olarak döner.
- 4. mod eklenmeli mi? Aday:
test(yalnızca test yaz/sar, üretim koduna dokunma) veexplain(kod oku, hiçbir şey değiştirme). Karar ölçütü: yönlendirme direktifi gerçekten farklı davranış üretiyor mu, yoksa sadece isim mi değişiyor? Fark üretmiyorsa eklenmemeli — üç moddan fazlası modelin değil prompt'un seçeneğidir. - Kapsam genişletme artık veri ister, tahmin değil. Elle etiketlenmiş korpus
(
tests/fixtures/intent-corpus.txt, 32 madde, %100 gate) regresyonu yakalar ama gerçek kullanımı temsil etmez — canlı log prompt içermiyor. Sinyal eklerken önce korpusa, sonra gerçek bir oturumda gözle doğrulamak gerekiyor; bu yüzden her yeni sinyal için "hangi cümle bunu kandırırdı?" sorusu korpusa girmeli.
Amaç: agent kodu yazmadan önce aktif katman sınırlarını ve mimari kuralları
prompt bağlamına sokmak. Kanal kararı verildi (ARCHITECTURE 3.3.1 → CHANGELOG
[Unreleased]): fısıltı ayrı bir kanal değil, kendi RULE_ID'li bir WARN kuralıdır.
- Kuralı yaz:
ARCH_CONTEXT(WARN). İçerik kaynağı hazır:.gravityguard.json→layers,testEvidence.sourceRoots,complexitybloğu. Fısıltı bu dosyadan okunmalı, hard-code edilmemeli. - Boyut sınırı: fısıltı her tool-call'de tekrar edilirse prompt şişer. Sadece
katman ihlali riski taşıyan hedefler için (yeni dosya, yeni import, hedef dizin
layersiçinde) gönderilmeli. - Kapsam tuzağı: fısıltı hiçbir zaman bir BLOCK kararının tek taşıyıcısı
olamaz (Anti-Goal 5).
G4engellemeye devam ederkenARCH_CONTEXTyalnızca bağlam verir.
Mevcut adaylar: forwarding wrapper katmanı, tek implementasyonlu soyutlama, bağımlılık artışı (dependency creep).
- Süreç kuralı (artık bağlayıcı): her yeni heuristik,
CHANGELOG'daki kalibrasyon yöntemiyle önce gerçel korpusta ölçülmek zorunda — 11 repo, son 400 commit, 6.404 üretim dosya-yazımı — ve ölçülen fire rate'i ile birlikte sevk edilmeli. Fire rate'i bilinmeyen bir heuristik, tahmin değil sitedir. (OE_SPIKE bu yüzden 1,27% ölçümüyle değiştirilmedi.) - Her aday için ayrıca: false-positive örneği (gerçek geçmişten) ve true-positive örneği (gerçek geçmişten) CHANGELOG'da gösterilmeli.
-
dependency creepiçin sınır:package.json/requirements.txtfarkı hook'unadded_textinde görünür, bu yüzden uygulanabilir; ancak yeni bir bağımlılığın "küçük bir fonksiyon için mi" olduğunu bilmek statik olarak mümkün değil — bu kural kaçınılmaz olarak spekülatiftir ve WARN olmalı. - TS/JS
SRP_BOUNDARYdedektörü projeye özgü (activeTab ===+glass-card,scrollToSection(+display: 'grid'); genel, AST tabanlı bir dedektör ertelendi (bkz. Anti-Hedef 2: hook içinde ağır AST yok). Yerinesrp-modularizerskill'i "değişim nedeni" kararını ajana bırakır.
- Dar ön filtre:
Remove-Item,del,rmdir,rm,move,Move-Item,Set-Content,Out-File,Add-Content. - Her terminal komutunu derin analiz etme. Fast-path izin listesi:
git status/diff/log/show,python -c,blender --background --python,npm,pytest. - Bypass'in hâlâ mümkün olduğu açıkça yazılacak:
python x.pyiçindeos.remove,blender --pythonscript'leri. Bu kural gözle görünür yolları kapatır, hepsini değil. Vaat edilenden azını vaat et. - Performans gerçek bir kodlama oturumunda ölçülecek — bu repo'nun log'u
değil: kayıtlı ölçüm, oturumun kendi tanıklığıyla (
git ~%30,7, keyfi Python/Blender çalıştırma ~%28,5, dosya mutasyonu ~%2`) teşhis komutlarıyla kirlenmiş. - Karar noktası:
run_commandhook'taargs.commandolarak mı geliyor, yoksa ayrı mı? Doğrulanmadan yazılmamalı — 1.2.5'te hatırlanıldığı gibi hook'un payload şeması tahminle değil, ölçümle konuşulmalı.
- Kullanıcı bilinçli olarak test bakımını yetkilendirebilecek; yalnızca G2 bu mod aktifken gevşeyecek.
- Yapay zeka bu yetkiyi kendine verememeli. Aksi halde koruma değil, tavsiye olur.
- Geniş bypass olmayacak — sadece test dosyalarında, sadece onay süresince.
- Yetkilendirme mekanizması hâlâ karar bekliyor ve seçenekler daralmış:
-
.gravityguard.json→ teknik olarak kolay ama ajan tarafından yazılabilir (güvenlik sınırı değildir). - Ortam değişkeni → pratikte imkânsız: Antigravity zaten çalışıyor, env değişkenleri süreç başında okunuyor. - Kalan gerçekçi yol: kullanıcının kendi terminalinde çalıştırdığı bir komutun tek seferlik bir jeton yazması ve hook'un o jetonu okuması (kısa ömürlü, tek kullanımlık, kullanıcı komut isteminde görünür). Uygulanabilirliği doğrulanmadan karar verilmeyecek. - Not: G2 şu anda test silme, yeniden adlandırma,
.skipve testiarchive/'a taşımayı engelliyor ve# srp: bypassbenzeri bir çıkış yolu yok.
Kayıtta borç kalmadı. Yedi maddenin akıbeti:
| # | Borç | Kapanış |
|---|---|---|
| 1 | Classifier heuristiği, düşük güvende tahmin | düzeltildi — onay akışı + 32 maddelik korpus |
| 2 | Engine'in iki kopyası, isim ayrışmış, manifestler sürümlenmemiş | düzeltildi — tek isim, plugin/hooks.json + plugin.json depoda, senkron listesi tek yerde |
| 3 | loss-guard'ın web'a özgü kontrolleri |
ölçüldü, hata değil — her kontrol kendi kapısında; Python repo'da [] döner, maliyeti mikrosaniye |
| 4 | Boş .gravityguard/runtime/ dizinleri |
ölçüldü, hata değil — motorun çalışma zamanı durum dizini; silmek hiçbir şey değiştirmiyor |
| 5 | CI yok | düzeltildi — üç platformlu Actions, ilk koşu yeşil |
| 6 | reason kanalı belirsizliği |
karara bağlandı — fısıltı ayrı kanal değil, WARN kuralı |
| 7 | T1'in testsiz projeye sürekli uyarısı | düzeltildi — test altyapısı ön koşulu + kapatma anahtarı |
Kanıtlar ve ölçümler: CHANGELOG.md → [Unreleased]. Yeni borç buraya girmez —
ya düzeltilir ya da (3 ve 4'te olduğu gibi) ölçülüp hata olmadığı kanıtlanır.
To maintain sub-10ms gatekeeping latency and prevent catastrophic scope creep, GravityGuard explicitly rejects the following product directions:
- Why: SonarQube, Semgrep, and CodeQL are heavy, asynchronous, whole-repository static analysis platforms evaluating cognitive complexity, code duplication, CVE vulnerabilities, and deep inter-procedural dataflow taint. Attempting to replicate this inside an AI tool-interception hook introduces massive latency, clutters prompt feedback with low-priority stylistic nits, and duplicates decades of solved compiler engineering.
- Enforcement: Deep static governance belongs strictly to Ring 4 (CI/CD Quality Gates), not GravityGuard.
- Why: The synchronous
PreToolUsefast guard path operates under a strict < 10ms execution budget (measured typical: 0.1ms - 2ms). Running full cross-file dependency graph resolution or global symbol tables in Tier 1 would cause noticeable agent stuttering and prompt developers to bypass the gatekeeper. - Enforcement: Fast guard checks must remain localized to ephemeral tool diffs and lightweight regex/shallow AST checks.
- Why: Line lengths, trailing commas, indentation, and variable naming styles are solved deterministically by existing formatters (
Prettier,Ruff format,Black). GravityGuard must not warn or block on superficial formatting matters.
- Why: Static code inspection (AST/regex) can verify structural presence (e.g. T1 test file existence, T2 assertion counts, T3 symbol names), but can never verify behavioral correctness or runtime contracts. GravityGuard verifies test evidence presence, but defers behavioral proof to native test runners (
vitest,pytest).
- Why: An AI agent must never be permitted to weaken or bypass blocking integrity rules (
G0,G1,G2,G4) autonomously through synthetic escape comments or self-authorizing config flags. A guard that an agent can talk itself out of is not a security boundary. - Consequence for the work in this file:
srp: allow-monolithand thecomplexityblock are deliberately scoped to WARN-only rules. Extending either to a BLOCK rule re-opens this anti-goal and must be argued explicitly, not assumed.
- Why: A local gatekeeper that phones home stops being a boundary, and a heuristic that is delegated to an LLM stops being deterministic. The intent classifier exists because the same prompt instruction was previously the classifier, and the same reasoning applies to every other decision.
- Enforcement: No network call on the Tier 1 path. The prompt enhancer's gateway is optional by design and its offline composer is a first-class path, not a degraded one.