Skip to content
Merged
27 changes: 17 additions & 10 deletions docs/BUILD_STATE.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"scope": "feature_freeze",
"pilot_ready": true,
"external_mesa_ready": false,
"final_audit_status": "master_closed",
"final_audit_status": "comprehensive_repair_verified_contract_only",
"current_task": "CLOSED",
"completed": [
"FREEZE-001",
Expand Down Expand Up @@ -41,23 +41,30 @@
"PROMPT-5-FINAL-ADVERSARIAL-AUDIT",
"MASTER-MVP-CLOSURE",
"POST-MASTER-INDEPENDENT-VERIFICATION",
"P1-RECORD-INSTANCE-NOT-NULL-ENFORCED"
"P1-RECORD-INSTANCE-NOT-NULL-ENFORCED",
"LEGAL-IDENTITY-AND-LOSSLESS-CHUNK-REPAIR",
"AUTHORITATIVE-TEMPORAL-VERSION-REPAIR",
"NATIVE-PUBLISH-AUTHORIZATION-BINDING",
"VERSIONED-CITATION-NATIVE-HANDOFF",
"COMPREHENSIVE-REPAIR-ROUND-2026-10-11"
],
"last_test_command": "uv run pytest -ra",
"last_test_result": "passed (360 passed: 356 non-scale + 4 scale in 72.83s)",
"last_test_command": ".venv/bin/pytest -ra --durations=20 --tb=short",
"last_test_result": "passed (413 passed, 1 cross-repo test skipped in 78.95s)",
"verification_checks": {
"ruff_format": "passed (212 Python files)",
"ruff_format": "passed (217 files)",
"ruff_check": "passed",
"mypy": "passed (77 source files)",
"mypy": "passed (78 source files)",
"pip_audit": "passed (no known vulnerabilities)",
"pytest_not_scale": "passed (356 passed)",
"pytest_scale": "passed (4 passed)",
"pytest_not_scale": "passed (409 passed, 1 cross-repo skipped, 4 scale deselected)",
"pytest_scale": "passed (4 passed; peak RSS 171784 KiB)",
"live_mesa_contract": "LIVE_MESA_NOT_VERIFIED"
},
"blockers": [
"Live MESA HTTP routes, schemas, mutation semantics, and server-side idempotency remain unverified because no endpoint or source access is available."
"Live MESA HTTP routes, schemas, mutation semantics, server-side idempotency and SQL/vector/graph projection remain unverified because no endpoint or MESA source checkout is available.",
"Official Profile B TEST was not run and no certification result is claimed.",
"10-20 GB target capacity is not proven; only bounded synthetic scale tests were run."
],
"polish_status": "completed",
"polish_current_task": "CLOSED",
"updated_at": "2026-08-30T23:30:00Z"
"updated_at": "2026-10-11T12:45:00Z"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# Başlangıç Durumu ve Önceki Bulgular

## Doğrulanmış başlangıç

- Depo: `MESA_Data` (`/storage/data-law/mesa-legal-data`)
- Başlangıç SHA: `38c3fa5d3240cc944e8da611926fd220b7df145c`
- Başlangıç dalı: `main`; çalışma ağacı temizdi.
- Yetkili onarım dalı: `fix/mesa-data-legal-integrity-native-publish`. Yerel/uzak geçmişte birleştirilmemiş ve açıkça devam edilmesi gereken bir onarım dalı bulunmadığı için, talimatta izin verilen adla başlangıç SHA'sından oluşturuldu.
- Denetlenen uygulama ucu: `dfc752a386b9f1287ee42256aa4013b24309ac6c` (rapor ve durum dosyası commit'i hariç).
- Ortam: Linux, Python 3.13.12, pytest 9.1.1, AnyIO 4.15.1, Starlette 1.5.1, FastAPI 0.141.1.

Başlangıçta `reports/` dizini yoktu; dolayısıyla bu dizin altında okunacak ya da korunacak eski rapor bulunmadı. `docs/` altındaki 11 mevcut durum/kullanım/UX belgesi okundu. Bunlar hukuki doğruluk veya canlı MESA sertifikasyonu kanıtı olarak kabul edilmedi. `docs/BUILD_STATE.json` içindeki “360 test geçti” ve `LIVE_MESA_NOT_VERIFIED` kayıtları yalnız tarihsel ipucu olarak ele alındı.

## Önceki iddia uzlaştırma matrisi

| İddia/kaynak | HEAD incelemesi | Kanıt | Sonuç |
|---|---|---|---|
| `docs/BUILD_STATE.json`: MVP kapanmış, testler yeşil | Test sayısı artmıştı; yeşil testler hukuki kimlik uçlarını kapsamıyordu | Ön-fix 6 yeni regresyonun 6'sı başarısız | `CONFIRMED_GAP` |
| Aynı dosya: canlı MESA doğrulanmadı | MESA çalışma kopyası, `MESA_SOURCE_ROOT` ve yetkili DEV uç noktası yok | Çapraz-depo testinin tek skip nedeni | `EXTERNAL` |
| UX kapanış raporları: panel akışları tamam | Panel/operasyon testleri mevcut ve son suite'te geçti | 413/413 test | `ALREADY_FIXED` |
| Prompt'taki tarihsel Profile B sayıları | Resmî TEST/evidence bu depoda çalıştırılmadı ve değiştirilmedi | Bu turda Profile B komutu yok | `UNVERIFIED_EVIDENCE` |
| “Plan raporu” olarak anılan `MESA_Data_Kapsamli_Denetim_Raporu.md` | Çalışma ağacında yok | `find docs`, `find reports` | `UNAVAILABLE` |

## Başlangıçta yeniden üretilen kusurlar

Yeni `tests/unit/test_comprehensive_legal_integrity.py` taslağındaki 6 testin tamamı onarım öncesinde kırmızıydı: mükerrer/harf ekli madde kimliği, yapısal chunk kaybı/örtüşme, chunk yasal üst kimliği, sentaktik atfın yanlış `RESOLVED` olması, edinim zamanının hukuk tarihi yapılması ve etkinlik aralığının atılması. Testler daha sonra kimlik ve zamansal dosyalara ayrıldı; son durumda tamamı yeşildir.

İlk tam onarım-sonrası çalıştırmada 25 test, sentetik releasable fixture'ların hiçbir hukuk tarihi beyan etmemesi nedeniyle beklenen biçimde kapalı kaldı. Gate zayıflatılmadı; yalnız bu sentetik fixture'lara açık `publication_date` eklendi. İlk scale turundaki aynı nedenli 3 hata da aynı yöntemle düzeltildi.
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# Mimari ve Sözleşme Haritası

## Gerçek veri hattı

`resmî/manual kaynak → raw immutable dosya + SHA-256 → artifact/catalog → MIME/encoding çıkarımı → normalize canonical text → legislation/decision parser → version + article + citation JSONL → quality/privacy/validation → insan/otomatik onay → frozen release + manifest + release-index → verified publish authorization → SourceChunk → MESA v4 session/insert/mutation ledger`

Kritik sahiplik sınırı: raw, canonical, kalite, release ve HTTP producer davranışı MESA_Data'ya aittir. MESA'nın SQL/vector/graph tüketici uygulaması ile MESA_E2E_Certification bu çalışma alanında yoktur ve değiştirilmemiştir.

## Alan matrisi

| Aşama | Kimlik/provenance alanları | Koruma |
|---|---|---|
| Artifact | `artifact_id`, `document_id`, `source_id`, `source_url`, `retrieved_at`, `sha256`, `raw_path`, `metadata_json` | dosya SHA ve immutable artifact collision |
| Version | `version_id`, `snapshot_date`, `effective_from/to`, `canonical_sha256`, parser/schema sürümü, onay/kalite | hukuk tarihi edinim zamanından türetilmez |
| Article | kanun ID, version ID, `article_number`, `article_kind`, exact `source_span`, etkinlik | `GEÇİCİ/EK/MÜKERRER/ordinary` ayrımı |
| Citation | source record/version, target law/article/version (doğrulanmamışsa null), exact span, status, relation hint | sentaks tek başına `RESOLVED` yapmaz |
| Release | manifest SHA, payload SHA, release-index'te version/document/record bağları | unmanifested/symlink/tamper reddi |
| Native payload | session/dataset/document/revision/chunk, content=evidence_span, revision, metadata, body idempotency | yalnız terminal `COMMITTED` başarıdır |

## Mevcut MESA producer sözleşmesi

- Sağlık: yapılandırılabilir, varsayılan `/health`
- Oturum: `POST /v4/sessions/start`
- Yazma: `POST /v4/memory/insert`
- Mutasyon: `GET /v4/mutations/{mutation_id}`
- Oturum kapatma: `POST /v4/sessions/{session_id}/end`
- Kimlik doğrulama: ortamdan `X-API-Key`; sır depoya/ledger'a yazılmaz.
- Kapsam: tenant/workspace/dataset/agent; hedef yapılandırma SHA ile insan onayına bağlanır.

Bu rota ve alanlar MESA_Data producer testleriyle doğrulandı. Gerçek MESA consumer kaynağı ve DEV runtime erişilemediği için consumer uyumu `CONTRACT_ONLY` durumundadır.

## Temsil ayrımı

Canonical metin ve SHA release'in otoritesidir. `SourceChunk` MESA'ya taşınan türetilmiş retrieval temsilidir; içerik canonical span'dan gelir, 4.096 karakter evidence sınırına göre bölünür ve canonical dosyayı yeniden yazmaz. Embedding modeli/representation-version ve gerçek re-embed davranışı bu depoda tüketici tarafı olarak doğrulanamamıştır.
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Kusur Kaydı

| ID | Öncelik | Yeniden üretim / kök neden | Onarım | Commit / durum |
|---|---|---|---|---|
| MD-P0-001 | P0 | `MÜKERRER MADDE` ve `MADDE 1/A` parser desenine girmiyor, kimlik çöküyordu | Parser 1.1.0 ve tür-duyarlı ID | `0a5cd5c`, kapalı |
| MD-P0-002 | P0 | Makaleler arasındaki yapısal canonical aralıklar yayın chunk'larından düşüyor; örtüşme kabul ediliyordu | Gap chunk, span sınır/örtüşme reddi, çağıran kayıtlarını mutasyonsuz işleme, parent metadata | `0a5cd5c`, kapalı |
| MD-P0-003 | P0 | `last_modified/retrieved_at`, authoritative hukuk tarihi yerine kullanılıyordu | `unknown-date` + REVIEW + açık error issue; release dışlama | `9500542`, kapalı |
| MD-P0-004 | P0 | `effective_from/to` atılıyor; gelecek sürüm aktif sürümü seçebiliyor; çelişkili bounded aralık sessizdi | Aralık saklama/doğrulama, as-of sıralama, overlap REVIEW, publish filtreleri | `9500542`, kapalı |
| MD-P0-005 | P0 | Parser'ın yalnız fallback “Madde N” üretmesi kalite PASS olabiliyordu | Tümü header-only ise BLOCK, kısmi ise REVIEW | `9500542`, kapalı |
| MD-P0-006 | P0 | Native publish job'u gerçek aktörü kaybetti; operasyon girdisinde manifest ve scope yoktu | Actor + exact manifest + target hash + frozen scope ve audit event | `17ce8f8`, kapalı |
| MD-P1-001 | P1 | Sentaktik bilinen kanun numarası corpus/version kanıtı olmadan `RESOLVED` oluyordu; harfli/türlü madde hedefleri kayıptı | `EXTRACTED`, doğru article identity; target version null kalır | `0a5cd5c`, kapalı/fail-closed |
| MD-P1-002 | P1 | Citation canonical release'te vardı ama native chunk metadata'sına taşınmıyordu | Source/target version alanları ve span-overlap citation metadata | `dfc752a`, kapalı |

Satır örnekleri mevcut checkout içindir: parser `src/mesa_legal_data/parsers/legislation.py:31`; chunk guard `src/mesa_legal_data/publisher/chunker.py:93`; hukuk tarihi `src/mesa_legal_data/pipeline.py:223`; current selection `src/mesa_legal_data/catalog.py:244`; header-only gate `src/mesa_legal_data/quality.py:238`; native authorization `src/mesa_legal_data/web/api.py:2244`; citation handoff `src/mesa_legal_data/publisher/engine.py:338`.

## Dış/kanıtsız kalanlar

- EXTERNAL-P0-001: gerçek MESA tüketici rotası, schema, terminal mutation ve server-side idempotency canlı doğrulanmadı. Sahip: MESA/runtime.
- EXTERNAL-P1-001: corpus-aware citation target-version resolver ve gerçek graph projection tüketimi yok. MESA_Data yanlış çözüm üretmez; doğrulanmış target version olmadan `EXTRACTED` kalır. Sahip: MESA_Data + MESA entegrasyon turu.
- EXTERNAL-P1-002: embedding/FTS representation-version ile gerçek reindex/re-embed geçişi ölçülmedi. Sahip: MESA consumer/runtime.
- CAPACITY-P2-001: 10–20 GB hedef ölçek çalıştırılmadı.
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Hukuki Kaynak, Encoding ve Kapsama

## Doğrulananlar

- Raw artifact SHA uyuşmazlığı pipeline/release'i durdurur; canonical satır SHA'ları release sırasında tekrar okunur.
- UTF-8 ve cp1254 fixture'ları geçti (`tests/unit/test_encoding_cp1254.py`, `tests/integration/test_pipeline_encoding.py`). Null byte/ağır replacement loss BLOCK, mojibake anomalisi REVIEW üretir.
- Sıfır makale legislation için BLOCK; düşük coverage ve büyük açıklanamayan boşluklar REVIEW/BLOCK üretir.
- Tüm madde kayıtları sadece parser fallback başlığından ibaretse PASS değildir.
- Article span'ları canonical koordinatlarında sınır ve içerik tutarlılığıyla denetlenir; publisher ayrıca out-of-range ve overlap'i reddeder.

## Ölçülen sentetik denetim özeti

Bu tur resmî corpus veya Profile B TEST kullanmadı. Yeni bir küçük DEV fixture setinde 5 genişletilmiş madde kimliği (`ordinary`, `EK`, `GEÇİCİ`, `MÜKERRER`, `1/A`), 1 yapısal gap örneği, 1 overlap saldırısı, 1 header-only kaynak ve 2 etkinlik aralığı senaryosu doğrulandı. Sonuçlar `source_quality_summary.csv` içindedir; bu sayılar üretim corpus toplamı değildir.

## Destek/kısıt

Kaynak politikaları `config/sources.yaml` ve MIME/URL güvenlik katmanıyla uygulanır. Erişilemeyen veya hukuken doğrulanmamış kaynak için başarı iddiası yoktur. Eksik orta sayfa gibi fiziksel belge bütünlüğü, kaynağın beklenen sayfa/madde sayısı bilinmiyorsa otomatik olarak ispatlanamaz; mevcut sistem coverage/gap sinyali üretir ve insan incelemesi gerekir.
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# Kanun, Madde, Chunk ve Zamansal Kimlik

## Kimlik

Madde parser'ı artık `MÜKERRER MADDE`, `EK MADDE`, `GEÇİCİ MADDE`, ordinary `MADDE` ve `1/A` benzeri ekli numaraları ayırır. ID örnekleri:

- `...:article:1`
- `...:article:ek-1`
- `...:article:gecici-1`
- `...:article:mukerrer-1`
- `...:article:1-a`

Aynı “Madde 1”, kanun ID'si parent olduğundan 6098 ve 6102 arasında çakışmaz. Chunk metadata'sı law ID/number/title, version kind/date/aralık, article ID/number/kind ve exact char koordinatını taşır. Başlık tekrar etmese bile parent kimlik korunur.

## Span ve reconstruction

Publisher, article span'larını sıralar; negatif/out-of-range/boş/örtüşen span'ı reddeder. Anlamlı preamble, bölüm/kısım gap'i ve annex/trailing metin ayrı chunk olur. Uzun metin 4.096 karakter MESA evidence sınırında deterministik bölünür; mevcut testler parçaların birleşiminin canonical metne eşit olduğunu doğrular. Yalnız whitespace gap'leri retrieval için ayrı junk chunk yapılmaz; hukuki anlam taşıyan gap'ler korunur.

## Zamansal seçim

Authoritative tarih sırası: kaynak metadata'sındaki publication/source/decision/snapshot ve beyan edilmiş effective interval. `retrieved_at` ile `last_modified` hukuki tarih yerine geçmez. Seçim rank'i bugün yürürlükte > süresi bitmiş tarihsel > gelecekte yürürlüğe girecek > tarihi bilinmeyen şeklindedir; böylece gelecek-effective sürüm aktif sürümü erken değiştirmez.

İki farklı içerik açık ve bounded etkinlik aralıklarıyla çakışıyorsa `VERSION_EFFECTIVE_INTERVAL_AMBIGUITY` açılır, version/records pending ve kalite REVIEW yapılır. Aynı authoritative tarihte farklı içerik ve explicit supersession yoksa mevcut current seçimi korunur ve otomatik onay geri alınır.

Kanıt: `tests/unit/test_comprehensive_legal_identity.py` 8/8; `tests/unit/test_comprehensive_temporal_integrity.py` 6/6; tarihsel chronology kontrolleri tam suite içinde geçti.
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Release, Onay ve Değişmezlik

Release builder yalnız current, valid, privacy-clean/approved, quality PASS, version-approved ve record-approved üyeleri seçer. Yeni temporal filtre, gelecekte başlamamış veya sona ermiş explicit aralıkları release dışında bırakır. REVIEW/BLOCK veya açık candidate-scoped error/blocker issue release'e giremez.

## H1 eşdeğeri insan onayı

Panel `prepare` adımında exact frozen release oluşturur ve doğrular; kullanıcıya `release_id`, `manifest_sha256`, `target_config_sha256`, hedef scope ve sayımlar döner. `publish` aynı manifest ve hedef hash'i yeniden karşılaştırır. Onarım sonrası authorization audit olayı gerçek actor, manifest, target hash, delivery/operation ID ve frozen scope'u saklar. Stale veya değiştirilmiş manifest/hedef 409 ile kapanır.

## Değişmezlik ve negatif durumlar

- Manifestte olmayan dosya, symlink/path traversal, payload/index hash veya count değişikliği reddedilir.
- Release-index, record → version → document üyeliğini dondurur; canlı katalog sonradan değişse bile plan frozen sürümden kurulur.
- Release revoked olduğunda devam eden delivery yeni item göndermez.
- HTTP 200/202 başarı sayılmaz; yalnız açık terminal `COMMITTED` ledger başarısıdır.
- Timeout/poll penceresi `AWAITING_MUTATION` olarak korunur; retry önce aynı remote mutation'ı uzlaştırır ve aynı idempotency key'i kullanır.

Kanıt: `tests/integration/test_master_mvp_closure.py`, `test_release_tamper.py`, `test_release_atomicity.py`, `test_mesa_v4_publisher_e2e.py` ve final 413-test koşusu.
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# MESA Native Publish ve Idempotency

## Producer tarafından doğrulanan sözleşme

`MesaClient` yapılandırılabilir v4 session/insert/mutation/end rotalarını kullanır. Payload şu çekirdek bağları taşır: `session_id`, `dataset_id`, `document_id`, `revision_id`, `chunk_id`, `content`, `evidence_span`, `revision_number`, ordinal/finalize/supersedes, metadata ve body içi `idempotency_key`. API anahtarı yalnız environment'tan okunur.

Idempotency anahtarı tenant/workspace/dataset/document/version/chunk/content hash üzerinden deterministiktir. Ledger item gönderilmeden önce yazılır. Yanıt kaybı ve crash-window testleri aynı key ve varsa aynı mutation ID ile uzlaştırır; cross-release aynı mantıksal chunk `SKIPPED` olur.

Durum normalizasyonu yalnız bilinen açık state'leri kabul eder. 200/201/202 içinde state veya gerekli mutation ID yoksa FAIL'dir. `QUEUED/PROCESSING` poll edilir; pencere biterse `AWAITING_MUTATION`; `COMMITTED`, `FAILED`, `REJECTED` terminaldir. 401/403, 429/503, bilinmeyen endpoint/state ve target güvenlik kontrolleri fail-closed test edilmiştir.

## Kanıt düzeyi

- Mock/stateful adapter: doğrulandı (`tests/integration/test_mesa_v4_publisher_e2e.py`, 3/3; post-master publisher kontrolleri).
- Frozen release, actor/manifest/target/scope bağlama: doğrulandı.
- Gerçek MESA source/runtime: yok.
- Canlı mutation ID, gerçek SQL/vector/graph projection ve restart-sonrası server idempotency: `UNVERIFIED_ENV`.

Sonuç: `NATIVE_MESA_INTEGRATION=CONTRACT_ONLY`. Mock başarı canlı entegrasyon başarısı olarak raporlanmamıştır.
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# İlişkisel Atıflar ve Temsil

## Atıf doğruluğu

Parser numbered law ve alias referanslarını exact Unicode span ile çıkarır. `amends`, `repeals`, `adds` fiilleri relation hint üretir. `1/A` article suffix olarak korunur; `27/2` ve `25/II` article 27/25 içindeki alt bölüm olarak parent article ID'ye bağlanır. `EK/GEÇİCİ/MÜKERRER` türleri farklı hedef kimliği üretir.

Sentaktik hedef hiçbir zaman corpus varlığı veya doğru tarihsel version kanıtı değildir. Bu nedenle bilinen kanunlar da `EXTRACTED`, belirsiz genel atıflar `UNRESOLVED` kalır. Yeni kayıtlar `source_version_id` ve nullable `target_version_id` taşır; doğrulanmamış target version uydurulmaz.

Native plan artık release-owned citation kaydını, exact source span ile örtüşen chunk'ın metadata'sına taşır. Alanlar citation/source record/source version/target law/article/version/status/relation/span ve `fully_contained` bilgisidir. Publisher metinden yeniden graph edge tahmin etmez.

## Kalan tüketici bağımlılığı

MESA graph projection kodu yoktur. Metadata'nın gerçek graph edge'e dönüştürülmesi, target version corpus resolver'ı ve version-as-of graph sorgusu canlı consumer ile doğrulanmalıdır. Bu nedenle kabul kapısı G producer tarafında fail-closed `VERIFIED_PASS`, gerçek graph consumption için `UNVERIFIED_ENV` olarak ayrılmıştır.

Canonical metin immutable kalır; retrieval chunk ve gelecekteki embedding/FTS representation türetilmiştir. Bu depoda embedding model/version alanının tüketici tarafından nasıl kullanıldığı görülemediğinden gerçek reindex/re-embed `EMBEDDING_DEPENDENCY_BLOCKED` durumundadır.
Loading
Loading