Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 41 additions & 6 deletions .mesa_data_agent_state.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@
"schema_version": 1,
"project": "MESA_Data",
"workflow": "mesa_data_autonomy",
"branch": "audit/mesa-data-autonomy-final",
"branch": "fix/mesa-data-final-mvp",
"baseline_commit": "84c61db716c10cb4110b673f9a976215afe71cd3",
"current_phase": "post_master_independent_verification",
"overall_status": "completed",
"current_phase": "complete",
"overall_status": "ready",
"phases": {
"prompt_1": {
"status": "completed",
Expand Down Expand Up @@ -366,11 +366,46 @@
"remaining_risks": [
"Live MESA HTTP endpoint remains UNVERIFIED because external network access/live MESA instance is outside repository boundary."
]
},
"final_mvp_blocker_closure": {
"status": "completed",
"started_at": "2026-08-30T00:00:00+03:00",
"completed_at": "2026-08-30T00:43:56+03:00",
"commits": [
"d6a35b7 fix: close final MVP integrity blockers"
],
"migrations": [
"0011_final_mvp_blocker_closure.sql"
],
"findings": [
"Panel confirmation was bound to a mutable live-catalog summary rather than an exact immutable release and target fingerprint.",
"Publisher release reconstruction could join identical logical record IDs and hashes across legal versions without exact version identity.",
"Ambiguous legacy reviews and logical-record issues could contaminate another version.",
"Single-record revision mutation was scoped by logical record_id and could alter sibling versions.",
"String-shaped but impossible calendar dates could enter chronology and approval decisions.",
"Identical artifact bytes could not safely enrich missing authoritative publication metadata.",
"Release payload normalization required separate canonical-record and packaged-payload hashes."
],
"tests": [
"fresh and populated-upgrade migration integrity: passed in test_control_57_and_58_fresh_and_upgrade_database_integrity",
"uv sync --frozen: passed (79 packages audited)",
"uv run ruff format --check .: passed (211 files)",
"uv run ruff check .: passed",
"uv run mypy src: passed (77 source files)",
"uv run pip-audit: passed (0 known vulnerabilities)",
"uv run pytest -m 'not scale' -ra --durations=20: 350 passed, 0 failed, 4 deselected",
"uv run pytest -m 'scale' -ra --durations=20: 4 passed, 0 failed, 350 deselected"
],
"blockers": [],
"remaining_risks": [
"Live MESA HTTP request/response and server-side idempotency semantics remain unverified."
]
}
},
"mesa_contract": {
"status": "unverified",
"source": "explicit_configuration_and_local_mock_contract",
"verified_by_live_http": "LIVE_MESA_NOT_VERIFIED",
"verified_by_live_http": false,
"assumptions": [],
"unknowns": [
"Live MESA health, publish, and mutation-status paths",
Expand All @@ -396,11 +431,11 @@
},
"handoff": {
"next_phase": null,
"summary": "Independent verification and release gate audit complete. All 338 tests pass (334 non-scale + 4 scale), 12 adversarial test cases pass, migration 0010 is verified, all 65 controls verified, and CI gate is 100% green.",
"summary": "Final MVP blocker closure complete. All 354 tests pass (350 non-scale + 4 scale), fresh and populated upgrade migrations through 0011 pass, exact CI gates are green, and no P0/P1 MVP blocker remains.",
"must_verify": [
"Ensure live deployment environment configures MESA_DATA_MESA_API_KEY securely.",
"Configure documented MESA routes and verify health, publish, polling, COMMITTED truth, and server-side idempotency against a live endpoint."
]
},
"last_updated_at": "2026-08-29T23:15:00Z"
"last_updated_at": "2026-08-30T00:43:56+03:00"
}
18 changes: 10 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# MESA Legal Data

MESA Legal Data; MESA hukuk ekosistemi için resmî mevzuat, içtihat ve hukuki atıf verilerini toplayan, ham dosyaları değiştiremez biçimde saklayan, ayrıştıran, kanonikleştiren, doğrulayan ve MESA staging veritabanına aktaran uçtan uca veri platformudur.
MESA Legal Data; resmî mevzuat, içtihat ve hukuki atıf verilerini otomatik toplayan, ham dosyaları değiştiremez biçimde saklayan, kanonikleştiren ve kalite kapılarından geçiren veri platformudur. Güvenli koşulları sağlayan sürümler otomatik onaylanabilir; istisnalar insan incelemesine gider. Gerçek MESA gönderimi yalnız insan başlatınca, otomatik oluşturulup doğrulanan immutable release paketinden yapılır. Yerel staging yalnız development aracıdır ve gerçek MESA değildir.

---

Expand All @@ -15,13 +15,14 @@ Ham Veri Deposu (raw/ — Değişmez Artifact + SHA-256 + Metadata)
Ayrıştırma & Kanonikleştirme Pipeline'ı (parse → canonical JSONL)
Gizlilik Taraması & Hukuki Metadata Doğrulaması (Schema & Privacy)
Kalite Kapıları + Gizlilik + Hukuki Metadata Doğrulaması
İnsan Onayı (Human Review — approve / reject)
Güvenli Otomatik Onay / İnsan İstisna İncelemesi
Release Derleme & Doğrulama (build → verify → publish)
Immutable Release (otomatik build → verify → frozen summary → insan onayı)
MESA Staging DB (Atomik, Idempotent Import & Provenance)
Gerçek MESA Publisher (idempotent, yalnız COMMITTED başarı)
└─ Yerel Development Staging (ayrı, isteğe bağlı)
```

---
Expand Down Expand Up @@ -62,13 +63,14 @@ uv run mesa-data harvest maintenance
### Güvenlik & Politika
- Keşif ve indirmeler yalnızca `config/sources.yaml` ve `config/harvest.yaml` dosyalarında izin verilen resmi kaynaklarda çalışır.
- İndirme işlemleri SSRF, MIME türü, boyut sınırı (~50 MB) ve hız sınırı denetimlerinden geçer.
- Otomatik onay veya yayınlama yapılmaz; tüm veriler insan onayı (`review`) süzgecinden geçer.
- Yalnız sertifikalı kaynak/parser ve PASS kalite koşullarını sağlayan sürümler güvenli biçimde otomatik onaylanabilir; diğerleri insan incelemesine gider.
- MESA'ya gönderim hiçbir zaman otomatik başlamaz.

---

## Web Yönetim Paneli (FastAPI + HTML/CSS/JS)

MESA Legal Data, tüm veri toplama, orkestrasyon, inceleme, release ve staging aktarım işlemlerini yönetebileceğiniz web tabanlı bir arayüze sahiptir.
MESA Legal Data, veri toplama, kalite/istisna incelemesi, immutable release ve insan başlatmalı gerçek MESA gönderimini yönetebileceğiniz web tabanlı bir arayüze sahiptir. Panel normal akışta kullanıcıdan release ID istemez; exact release ve manifest özetini otomatik hazırlar.

### Web Panelini Başlatma
```bash
Expand Down Expand Up @@ -116,7 +118,7 @@ uv run mesa-data release build --release-id release-v1.0
uv run mesa-data release verify --release-id release-v1.0
uv run mesa-data release publish --release-id release-v1.0

# E. MESA Staging DB Import
# E. Yalnız geliştirme amaçlı yerel staging importu (gerçek MESA değildir)
uv run mesa-data release import --release-id release-v1.0

# F. İzlenebilirlik Sorgusu
Expand Down
4 changes: 3 additions & 1 deletion docs/HIZLI_BASLANGIC.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,9 @@ Web arayüzünde herhangi bir teknik terim veya karmaşık ayar bilmenize gerek
### Adım 3: Dışa Aktar
1. Sol menüden **Dışa Aktar** ekranına gidin.
2. **"Dosya olarak indir"**: JSONL (model eğitimi ve veri bilimi için) veya CSV (Excel için) biçimini seçip **"Dışa aktarmayı oluştur"** butonuna tıklayın.
3. **"MESA'ya aktar"**: Tek tıkla doğrulanmış paketi MESA veri havuzuna gönderin.
3. **"MESA'ya gönder"**: Panel uygun güncel sürümlerden immutable release'i otomatik oluşturur ve doğrular. Release ID, manifest SHA-256 ve hedefi gösteren frozen özeti onayladığınızda yalnız o exact paket gerçek MESA publisher'a verilir. Onaydan sonra katalog değişse bile gönderim kapsamı değişmez.

> **Not:** “Yerel Development Staging / Yerel Staging'e Aktar” ayrı bir geliştirme aracıdır; gerçek MESA gönderimi değildir.

---

Expand Down
6 changes: 5 additions & 1 deletion docs/KULLANIM_KILAVUZU.md
Original file line number Diff line number Diff line change
Expand Up @@ -72,13 +72,17 @@ Onaylanmış verileri sistemden çıkarma ve paylaşma ekranıdır:
- **CSV:** Excel ve tablo araçları için uygun format.
- Oluşturulan dosyalar geçmiş tablosundan doğrudan indirilebilir.
- **MESA’ya Aktar:**
- Onaylı verileri doğrulanmış bir paket olarak MESA aktarım havuzuna gönderir.
- Uygun güncel sürümlerden immutable release'i otomatik oluşturur ve kriptografik olarak doğrular.
- Onay penceresi exact release ID, manifest SHA-256 ve MESA hedefini gösterir; kullanıcıdan manuel release ID istenmez.
- İnsan onayından sonra yalnız bu frozen paket gönderilir. Katalogdaki daha yeni bir sürüm aynı gönderime sessizce eklenmez.
- Yalnız tüm gerekli mutation'lar `COMMITTED` olduğunda tam başarı gösterilir; `PARTIAL` ve `AWAITING_MUTATION` ayrı durumlardır.

### 6. Gelişmiş (Yönetim Menüsü)
Teknik kullanıcılar ve sistem yöneticileri için ek araçlar sunar:
- **Kaynaklar:** Resmî kurum erişim limitleri ve kuralları.
- **Veri Gezgini:** Ham kanonik kayıtları ayrıntılı arama ve inceleme.
- **Release Geçmişi:** Oluşturulan sürümlerin doğrulama, yayınlama ve geri alma süreçleri.
- **Yerel Development Staging:** Release paketini yalnız yerel geliştirme veritabanına aktarır; gerçek MESA ile karıştırılmamalıdır.
- **Arka Plan İşlemleri:** Uzun süren sistem görevlerinin durum takibi.
- **İşlem Geçmişi (Audit):** Sistemde yapılan tüm değişikliklerin işlem günlüğü.
- **Sistem:** Sistem sağlık taraması (Doctor) ve veritabanı yedekleme (Backup).
Expand Down
116 changes: 116 additions & 0 deletions migrations/0011_final_mvp_blocker_closure.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
-- Migration 0011: final MVP blocker closure.
-- Preserves ambiguous legacy reviews without guessing a legal version, enforces
-- version-aware release membership for new writes, and binds MESA deliveries to
-- the human-confirmed non-secret target/release fingerprints.

PRAGMA foreign_keys = OFF;

CREATE TABLE record_reviews_v4 (
review_id TEXT NOT NULL PRIMARY KEY UNIQUE,
record_instance_id TEXT NOT NULL,
version_id TEXT NOT NULL,
record_id TEXT NOT NULL,
record_sha256 TEXT NOT NULL,
decision TEXT NOT NULL CHECK (decision IN ('approved', 'rejected')),
reviewer TEXT NOT NULL,
note TEXT,
reviewed_at TEXT NOT NULL
);

INSERT INTO record_reviews_v4 (
review_id, record_instance_id, version_id, record_id, record_sha256,
decision, reviewer, note, reviewed_at
)
SELECT
rr.review_id,
CASE
WHEN rr.reviewed_at >= COALESCE(
(SELECT applied_at FROM schema_migrations WHERE version = '0010_mvp_master_closure.sql'),
'9999-12-31T23:59:59Z'
) AND EXISTS (
SELECT 1 FROM records r
WHERE r.record_instance_id = rr.record_instance_id
AND r.version_id = rr.version_id
AND r.record_id = rr.record_id
AND r.record_sha256 = rr.record_sha256
) THEN rr.record_instance_id
WHEN (SELECT count(*) FROM records r
WHERE r.record_id = rr.record_id AND r.record_sha256 = rr.record_sha256) = 1
THEN (SELECT r.record_instance_id FROM records r
WHERE r.record_id = rr.record_id AND r.record_sha256 = rr.record_sha256)
ELSE 'legacy-ambiguous:' || rr.review_id
END,
CASE
WHEN rr.reviewed_at >= COALESCE(
(SELECT applied_at FROM schema_migrations WHERE version = '0010_mvp_master_closure.sql'),
'9999-12-31T23:59:59Z'
) AND EXISTS (
SELECT 1 FROM records r
WHERE r.record_instance_id = rr.record_instance_id
AND r.version_id = rr.version_id
AND r.record_id = rr.record_id
AND r.record_sha256 = rr.record_sha256
) THEN rr.version_id
WHEN (SELECT count(*) FROM records r
WHERE r.record_id = rr.record_id AND r.record_sha256 = rr.record_sha256) = 1
THEN (SELECT r.version_id FROM records r
WHERE r.record_id = rr.record_id AND r.record_sha256 = rr.record_sha256)
ELSE 'legacy-version-unscoped'
END,
rr.record_id,
rr.record_sha256,
rr.decision,
rr.reviewer,
rr.note,
rr.reviewed_at
FROM record_reviews rr;

DROP TABLE record_reviews;
ALTER TABLE record_reviews_v4 RENAME TO record_reviews;

CREATE INDEX idx_record_reviews_instance ON record_reviews(record_instance_id);
CREATE INDEX idx_record_reviews_version ON record_reviews(version_id);
CREATE INDEX idx_record_reviews_record ON record_reviews(record_id, reviewed_at);

CREATE TRIGGER release_items_version_required_insert
BEFORE INSERT ON release_items
WHEN NEW.version_id IS NULL
BEGIN
SELECT RAISE(ABORT, 'release_items.version_id is required');
END;

CREATE TRIGGER release_items_version_required_update
BEFORE UPDATE OF version_id, record_id, record_sha256 ON release_items
WHEN NEW.version_id IS NULL
BEGIN
SELECT RAISE(ABORT, 'release_items.version_id is required');
END;

CREATE TRIGGER release_items_identity_valid_insert
BEFORE INSERT ON release_items
WHEN NOT EXISTS (
SELECT 1 FROM records r
WHERE r.version_id = NEW.version_id
AND r.record_id = NEW.record_id
AND r.record_sha256 = NEW.record_sha256
)
BEGIN
SELECT RAISE(ABORT, 'release item version identity is invalid');
END;

CREATE TRIGGER release_items_identity_valid_update
BEFORE UPDATE OF version_id, record_id, record_sha256 ON release_items
WHEN NOT EXISTS (
SELECT 1 FROM records r
WHERE r.version_id = NEW.version_id
AND r.record_id = NEW.record_id
AND r.record_sha256 = NEW.record_sha256
)
BEGIN
SELECT RAISE(ABORT, 'release item version identity is invalid');
END;

ALTER TABLE mesa_deliveries ADD COLUMN target_config_sha256 TEXT;
ALTER TABLE mesa_deliveries ADD COLUMN release_manifest_sha256 TEXT;

PRAGMA foreign_keys = ON;
1 change: 1 addition & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ build-backend = "setuptools.build_meta"

[dependency-groups]
dev = [
"httpx2>=0.1.0",
"mypy>=2.3.0",
"pip-audit>=2.10.1",
"pytest>=9.1.1",
Expand Down
Loading
Loading