Στατιστικοί δείκτες ρίσκου διαδικασιών — όχι διαπιστώσεις παρανομίας.Μεθοδολογία · Δικαίωμα απάντησης

Το «πώς»: πηγές δεδομένων, ορισμοί και φόρμουλες των δεικτών, κατώφλια δημοσίευσης, γνωστά κενά. Για το «τι (δεν) ισχυριζόμαστε» και το δικαίωμα απάντησης, δείτε την Αποποίηση.

Μεθοδολογία

Έκδοση: 0.8 · Τελευταία ενημέρωση: 2026-07-13 · Άδεια: CC BY 4.0

Κεντρική αρχή — διαβάστε πρώτα αυτό: Οι δείκτες που δημοσιεύονται εδώ είναι στατιστικοί δείκτες ρίσκου διαδικασιών, όχι διαπιστώσεις παρανομίας, διαφθοράς ή κακοδιαχείρισης. Ένας υψηλός δείκτης σημαίνει «μοτίβο που, σύμφωνα με τη διεθνή βιβλιογραφία, δικαιολογεί περαιτέρω διερεύνηση» — τίποτα περισσότερο. Όπως το διατυπώνει το Red Flags Project (Ουγγαρία): «risky does not mean corrupt». Πολλά flags έχουν απολύτως νόμιμες εξηγήσεις (επείγουσες ανάγκες, εξειδικευμένες αγορές με έναν προμηθευτή, μικρά δείγματα, νησιωτικότητα κ.ά.).


1. Σκοπός

Η πλατφόρμα συγκεντρώνει, κανονικοποιεί και οπτικοποιεί δημόσια, ανοιχτά δεδομένα δημοσίων συμβάσεων της Ελλάδας, και υπολογίζει πάνω σε αυτά επικυρωμένους από τη βιβλιογραφία δείκτες ακεραιότητας διαδικασιών (procurement integrity indicators). Στόχοι:

  1. Να μπορεί κάθε πολίτης να δει τι αγοράζει ο δήμος, η περιφέρεια ή το υπουργείο του, από ποιον και με ποια διαδικασία.
  2. Να αναδεικνύονται μοτίβα που η διεθνής έρευνα συσχετίζει με αυξημένο ρίσκο μειωμένου ανταγωνισμού — πάντα με πλήρη πρόσβαση στα πρωτογενή δεδομένα και στη μεθοδολογία υπολογισμού.
  3. Να παρέχεται στους φορείς και τις εταιρείες δικαίωμα απάντησης/διόρθωσης (βλ. DISCLAIMER.md).

Ό,τι δημοσιεύεται συνοδεύεται από: (α) τα raw δεδομένα από τα οποία προέκυψε, (β) link στο πρωτότυπο ΑΔΑΜ/ΑΔΑ, (γ) την ακριβή φόρμουλα υπολογισμού, (δ) τους περιορισμούς της.


2. Πηγές δεδομένων

2.1 ΚΗΜΔΗΣ Open Data API (κύρια πηγή)

Το Κεντρικό Ηλεκτρονικό Μητρώο Δημοσίων Συμβάσεων (ΚΗΜΔΗΣ) είναι το επίσημο μητρώο στο οποίο οι αναθέτουσες αρχές υποχρεούνται εκ του νόμου (ν. 4412/2016) να καταχωρίζουν τις πράξεις τους. Οντότητες που αντλούμε:

Οντότητα Endpoint Πρόθεμα ΑΔΑΜ Περιεχόμενο
Αιτήματα POST /request REQ Πρωτογενή αιτήματα δαπάνης
Προσκλήσεις/Προκηρύξεις/Διακηρύξεις POST /notice PROC Δημοσίευση πρόθεσης σύναψης σύμβασης
Αναθέσεις POST /auction AWRD Αποφάσεις ανάθεσης (κατακύρωσης)
Συμβάσεις POST /contract SYMV Υπογεγραμμένες συμβάσεις
Εντολές Πληρωμών POST /payment PAY Εντολές πληρωμής
Συνδεδεμένες Πράξεις GET /adamChain/{ΑΔΑΜ} Η αλυσίδα REQ→PROC→AWRD→SYMV→PAY

Κρίσιμα πεδία κάθε εγγραφής (επιβεβαιωμένα από το API):

2.2 Μελλοντικές/συμπληρωματικές πηγές (δεν χρησιμοποιούνται ακόμα)

Κάθε νέα πηγή θα τεκμηριώνεται εδώ πριν χρησιμοποιηθεί σε δημοσιευμένο δείκτη.


3. Συλλογή & επεξεργασία δεδομένων

  1. Άντληση: μέσω του open-source client μας (src/kimdis/client.py): σελιδοποίηση 50 εγγραφών/σελίδα, χρονικά παράθυρα ≤180 ημερών, όριο <350 αιτήματα/λεπτό, αυτόματη επανάληψη σε προσωρινά σφάλματα. Τα δεδομένα αποθηκεύονται ως έχουν (raw) σε μορφή Parquet.
  2. Έλεγχοι πληρότητας: για κάθε batch μετράμε % εγγραφών με έγκυρο ΑΔΑΜ, ημερομηνία, ποσό, CPV, και ΑΦΜ σε δύο επίπεδα: μορφή (9 ψηφία μετά την κανονικοποίηση, pct_org_vat) και checksum mod-11 (pct_org_vat_checksum, is_valid_vat_checksum() στο kimdis_data.py). Το keying/entity-resolution χρησιμοποιεί μόνο τον έλεγχο μορφής (κάποια ΑΦΜ δημοσίων φορέων στο ΚΗΜΔΗΣ δεν ακολουθούν πάντα το τυπικό checksum)· το checksum δημοσιεύεται ως ξεχωριστό ποιοτικό μέτρο, όχι ως φίλτρο αποδοχής. Τα reports πληρότητας δημοσιεύονται.
  3. Κανονικοποίηση: ενιαίος πίνακας φορέων (ΑΦΜ → όνομα → τύπος → NUTS) και αναδόχων. Στη Φάση 2 προστίθεται entity resolution (deduplication παραλλαγών ονομάτων) με μετρημένη ακρίβεια σε χειροκίνητο δείγμα.
  4. Αποπληθωρισμός: όπου συγκρίνονται ποσά μεταξύ ετών, μετατρέπονται σε σταθερές τιμές έτους βάσης με τον ΔΤΚ της ΕΛΣΤΑΤ. Ονομαστικά και αποπληθωρισμένα ποσά εμφανίζονται και τα δύο.
  5. Καμία χειροκίνητη παρέμβαση σε τιμές: δεν διορθώνουμε, δεν συμπληρώνουμε και δεν «καθαρίζουμε» ποσά ή ονόματα πέρα από τεκμηριωμένους, αναπαραγώγιμους κανόνες που ζουν στον κώδικα αυτού του repo.

4. Δείκτες (v1)

Όλοι οι δείκτες v1 υπολογίζονται αποκλειστικά από πεδία ΚΗΜΔΗΣ και στηρίζονται σε επικυρωμένη βιβλιογραφία (βλ. §8). Κάθε δείκτης δημοσιεύεται μαζί με: το N (μέγεθος δείγματος), την περίοδο αναφοράς, και τα επιμέρους στοιχεία από τα οποία υπολογίστηκε.

4.1 Ποσοστό απευθείας αναθέσεων

4.2 Συγκέντρωση αναδόχων (HHI & top-1 μερίδιο)

4.3 Single-bid rate

4.4 Έλεγχος Benford (1ο & 2ο ψηφίο)

4.5 Κατακερματισμός συμβάσεων (bid-splitting)

4.6 Ποσοστό έκπτωσης προκήρυξης → σύμβασης

4.7 Σύντομες προθεσμίες υποβολής

4.8 Σύνθετος δείκτης (τύπου CRI)

4.9 Κάλυψη δεδομένων (γνωστά κενά)

4.10 Δείκτες δικτύου

Blocking gate: καμία κάρτα «Δίκτυο» δεν εμφανίζεται στο site πριν δημοσιευτεί αυτή η ενότητα (§4.10) μαζί με το αντίστοιχο DISCLAIMER.md update. Ισχύει από 2026-07-13.

Τι είναι: ανάλυση του δικτύου φορέας↔ανάδοχος (γράφημα Neo4j, offline, τοπικό) πάνω στο ίδιο ΚΗΜΔΗΣ dataset, όχι νέα πηγή δεδομένων. Το γράφημα χτίζεται από το ίδιο vat_resolver.csv/entities.csv με το υπόλοιπο pipeline — καμία δική του κανονικοποίηση/keying.

Δημοσιευμένα components:

Ρητά ΜΗ δημοσιευμένα (μένουν εσωτερικά, μέχρι να ολοκληρωθεί νομικός έλεγχος):

Παγίδες/περιορισμοί (διαβάστε πριν ερμηνεύσετε οποιονδήποτε αριθμό εδώ):

  1. WINS_AGAINST δεν υπολογίζεται. Το ΚΗΜΔΗΣ δημοσιεύει μόνο τον νικητή κάθε διαγωνισμού, ποτέ τους ηττημένους προσφέροντες. Το δίκτυο εδώ δείχνει ποιος κέρδισε από ποιον, όχι «ποιος ανταγωνίζεται ποιον» — καμία σχέση ανταγωνισμού/συμφωνίας δεν μπορεί να συναχθεί από αυτά τα δεδομένα.
  2. Community detection (Louvain) = δομικές ομαδοποιήσεις, ΟΧΙ κατηγορίες συμπαιγνίας. Οι «κοινότητες» που υπολογίζει ο αλγόριθμος Louvain (βλ. scripts/graph/run_gds.py) είναι στατιστική ομαδοποίηση κόμβων με πυκνές συνδέσεις μεταξύ τους — τυπικό αποτέλεσμα ενός δικτύου φορέας-ανάδοχος είναι ομάδες ανά γεωγραφική περιοχή, κλάδο αγοράς ή μέγεθος φορέα. Καμία κοινότητα δεν ερμηνεύεται ή παρουσιάζεται ως ένδειξη συμφωνίας/συμπαιγνίας.
  3. Batch/offline, όχι real-time. Ο γράφος δεν ανανεώνεται από το καθημερινό nightly pipeline — υπολογίζεται χειροκίνητα, περιοδικά (στόχος ~1×/μήνα). Κάθε export φέρει snapshot_date (P2-07, scripts/graph/snapshot.py) και το site το εμφανίζει ρητά δίπλα στην κάρτα «Δίκτυο» ώστε να μην υπάρχει σύγχυση με τη φρεσκάδα των υπόλοιπων δεικτών.
  4. Κάλυψη ταυτόσημη με το υπόλοιπο dataset (§4.9) — τα ίδια 2 μόνιμα κενά μηνών (auction_2021_02, auction_2025_08) υποεκτιμούν ελαφρώς τα δίκτυα των ετών 2021/2025.
  5. Multi-member συμβάσεις: όπως και στο HHI (§4.2), όλη η αξία μιας κοινοπραξίας πιστώνεται στο πρώτο καταχωρημένο μέλος — το ίδιο μεθοδολογικό όριο ισχύει και στο δίκτυο (υποεκτιμά ελαφρώς τη σύνδεση των υπόλοιπων μελών).
  6. New-winner-rate: left-censoring στο πρώτο ενεργό έτος κάθε φορέα. Το «πρώτη φορά κερδίζει» υπολογίζεται μόνο μέσα στο παράθυρο δεδομένων (2020-εξής) — για το πρώτο έτος που εμφανίζεται καθόλου δραστηριότητα ενός φορέα στο dataset, ΟΛΟΙ οι ανάδοχοί του είναι τετριμμένα «νέοι» (100%), όχι επειδή είναι πράγματι πρωτοεμφανιζόμενοι αλλά επειδή δεν υπάρχει ιστορικό πριν το 2020 (ή πριν την πρώτη καταγεγραμμένη δραστηριότητα του φορέα) για να συγκριθούν. Αυτές οι γραμμές σημειώνονται εσωτερικά ως left_censored και δεν επιλέγονται ως το προεπιλεγμένο (τελευταίο) έτος που εμφανίζει η κάρτα «Δίκτυο» — αν το πιο πρόσφατο έτος ενός φορέα είναι και το πρώτο του ενεργό έτος, η κάρτα δείχνει «ανεπαρκή δεδομένα» αντί για ένα τεχνητό 100%.
  7. Ακυρωμένες αναθέσεις: πολιτική ενοποιήθηκε 2026-07-13. Όλα τα δημοσιευμένα components του δικτύου (top γείτονες, new-winner-rate) περιλαμβάνουν ακυρωμένες αναθέσεις (4,25% του συνόλου) — ίδια πολιτική με το ήδη δημοσιευμένο «Από ποιον» top-10 του προφίλ φορέα, το οποίο επίσης δεν φιλτράρει ακυρωμένες. Πριν από αυτή την ενοποίηση, η new-winner-rate (Query C) εξαιρούσε ακυρωμένες ενώ οι top γείτονες (Query D) όχι — η ασυνέπεια διορθώθηκε αφαιρώντας το φίλτρο από το Query C (και το αντίστοιχο Query E, εσωτερικό).

5. Κατώφλια δημοσίευσης & στατιστική προστασία

6. Τι ΔΕΝ ισχυριζόμαστε

  1. Δεν ισχυριζόμαστε ότι οποιοσδήποτε φορέας, εταιρεία ή πρόσωπο έχει διαπράξει παρανομία. Αυτό μπορεί να το κρίνει μόνο δικαστήριο ή αρμόδια ελεγκτική αρχή.
  2. Δεν υπολογίζουμε «πραγματικό κόστος αγοράς» ή «υπερτιμολόγηση» συγκεκριμένης σύμβασης — δεν υπάρχουν τα δεδομένα για κάτι τέτοιο. Ό,τι συγκρίσεις τιμών γίνουν (Φάση 3) θα είναι σχετικές συγκρίσεις εντός του ίδιου dataset (π.χ. απόσταση από τη διάμεση τιμή μονάδας ίδιου CPV/έτους), με δημοσιευμένη φόρμουλα.
  3. Δεν δημοσιεύουμε δεδομένα φυσικών προσώπων στη v1. Μόνο φορείς και νομικά πρόσωπα.
  4. Συγκεντρωτικές εκτιμήσεις «δυνητικής εξοικονόμησης» (Φάση 3) θα παρουσιάζονται μόνο ως εύρος σε εθνικό/κλαδικό επίπεδο με ρητές παραδοχές, ποτέ ως ποσό που αποδίδεται σε συγκεκριμένο φορέα.

7. Διαφάνεια, αναπαραγωγιμότητα & changelog

8. Βιβλιογραφία & πρότυπα

9. Changelog μεθοδολογίας

Ημερομηνία Έκδοση Αλλαγή
2026-07-08 0.1 Αρχική έκδοση: ορισμοί δεικτών v1, πηγές, αρχές δημοσίευσης. Κανένας δείκτης δεν έχει δημοσιευθεί ακόμα.
2026-07-08 0.2 Πρώτη υλοποίηση §4.5 (bid-splitting) και §4.6 (discount rate) σε scripts/compute_indicators_v1.py, επί δεδομένων 2020-2021 + 2025-05. §4.5: πίνακας ορίων απευθείας ανάθεσης ανά περίοδο – πριν 1/6/2021: 20.000€ (όλες οι κατηγορίες)· από 1/6/2021 (ν. 4782/2021): 30.000€ προμήθειες/υπηρεσίες, 60.000€ έργα/μελέτες/τεχνικές υπηρεσίες (κατηγοριοποίηση βάσει contractType.value). Χρειάζεται νομική επιβεβαίωση πριν οριστική δημοσίευση (πρώτο πέρασμα βάσει δημόσιας δευτερογενούς πηγής, όχι πρωτογενούς νομικού κειμένου). §4.6: η σύνδεση notice↔contract μέσω contract.noticeReferenceNumber είναι σχεδόν κενή στα δεδομένα (<0.1%, ελέγχθηκε επί 2020-01)· χρησιμοποιείται αντ’ αυτής η σύνδεση notice.referenceNumberauction.noticeRefNo (κάλυψη: μόνο ~10-18% των auctions έχουν καν noticeRefNo – αναμενόμενο, αφού οι απευθείας αναθέσεις δεν προηγούνται notice) και η τιμή κατακύρωσης (auction) ως proxy της τελικής τιμής σύμβασης αντί της υπογεγραμμένης σύμβασης. Το ποσοστό κάλυψης δημοσιεύεται πάντα δίπλα στον δείκτη. Προστέθηκε επίσης πίνακας κανονικοποίησης φορέων (scripts/build_entity_table.pydata/processed/entities.csv, ΑΦΜ→όνομα/τύπος/NUTS) και static dashboard v1 σκελετός (site/, χωρίς build step, τροφοδοτείται από scripts/build_site_data.py).
2026-07-09 0.3 Pre-release: εφαρμόστηκε το πλάνο του εσωτερικού τεχνικού ελέγχου. Ενιαίος persisted VAT resolver (A3): build_entity_table.py γράφει πλέον data/processed/vat_resolver.csv (name→ΑΦΜ, χτισμένο από auction+contract+notice)· compute_indicators_v1.py και build_foreas_data.py τον διαβάζουν αντί να χτίζουν ο καθένας δικό του (πριν, το build_foreas_data.py χτίζε resolver μόνο από auctions, ~25% ΑΦΜ fill, με αποτέλεσμα ασύμφωνα κλειδιά ΑΦΜ ανάμεσα σε δείκτες και σελίδες προφίλ φορέα). Έλεγχος πληρότητας pagination (A1): το backfill πλέον επαληθεύει totalElements έναντι των πραγματικά κατεβασμένων εγγραφών· ελλιπείς μήνες δεν γράφονται καθόλου (αντί να γράφονται ως “πλήρεις” με λιγότερες γραμμές) και καταγράφονται σε data/raw/_backfill_failures.json για επανάληψη. Η αναδρομική επαλήθευση/διόρθωση του ήδη κατεβασμένου 2020-2023 dataset (audit A1 + γνωστά κενά auction_2020_08, auction_2021_02) εκκρεμεί ακόμα – θα εκτελεστεί σε επόμενο run του backfill_historical.py και οι αριθμοί των δεικτών θα ενημερωθούν τότε αν αλλάξουν.
2026-07-10 0.4 Sanity-check έναντι δημοσιευμένων εθνικών ποσοστών (EU Single Market Scoreboard ~58,2% single-bidding, Vouliwatch 62,4% απευθείας σε συμβουλευτικές): το εθνικό da_count_pct (75-84% ανά έτος 2020-2026) αποκλίνει αλλά αναμενόμενα – διαφορετικός πληθυσμός (όλες οι αναθέσεις έναντι μόνο ανταγωνιστικών/άνω ενωσιακού ορίου διαδικασιών). Το da_value_pct όμως ταλαντευόταν χωρίς λογική έτος προς έτος (33%→97%→41%→98%→46%→70%→6%), λόγω 20 εγγραφών totalCostWithVAT/totalCostWithoutVAT >1 δισ. ευρώ (έως €600 δισ.) με fingerprint φθαρμένης πηγής (π.χ. ΑΦΜ “11111111111” με ποσό ακριβώς 111.111.111.111€· Δήμος Αγίας Παρασκευής €600.030.600.000 σε μία ανάθεση με μέσο όρο υπόλοιπων 802 αναθέσεών του €13.600). Προστέθηκε VALUE_SANITY_CAP = 10 δισ. ευρώ σε scripts/kimdis_data.py (sanitize_value()), εφαρμοσμένο σε όλα τα σημεία παραγωγής value από τα πεδία κόστους σε compute_indicators_v1.py και build_foreas_data.py (και στο per-εγγραφή amount_with_vat της προβολής “πρόσφατη δραστηριότητα”). Τιμές πάνω από το όριο μηδενίζονται (όχι clip) ώστε να μη διαστρεβλώνουν sums/rankings/terciles μεγέθους. Το όριο χωρίζει καθαρά τις 9 εγγραφές-σκουπίδια από τις μεγαλύτερες αλλά εύλογες τιμές που μένουν (π.χ. ΑΔΜΗΕ €2,06δισ., Υπ. Εθνικής Άμυνας €4,26δισ.).
2026-07-10 0.4 Ολοκλήρωση Sprint C backfill re-run (η εκκρεμότητα της v0.3): 238 parquet αρχεία, 1,9 GB raw (2020-01→2026-06, auction+contract+notice)· βρέθηκαν+διορθώθηκαν 2 μη καταγεγραμμένα κενά (auction_2025_04, auction_2020_08) και επιβεβαιώθηκαν 2 μόνιμα κενά (auction_2021_02, auction_2025_08, server-side timeout – βλ. νέα §4.9 «Κάλυψη δεδομένων»). Το pipeline re-run μετατόπισε ουσιωδώς τους εθνικούς αριθμούς: 8.647→12.827 ΑΦΜ φορέων, 3.217→6.191 προφίλ /foreas/· το εθνικό DA% παρέμεινε σταθερό (75-84%/έτος) πριν/μετά, καμία ένδειξη ότι το audit/repair αλλοίωσε κατανομές. Τεκμηριώθηκαν επίσης δύο αποφάσεις που είχαν μείνει ανεκτέλεστες (εσωτερικός τεχνικός έλεγχος v2, B2/B3): §4.2 πλέον δηλώνει ρητά την παραδοχή πίστωσης όλης της αξίας συμβάσεων-κοινοπραξιών στον πρώτο καταχωρημένο ανάδοχο και ο δείκτης pct_multi_member δημοσιεύεται δίπλα στο HHI/top1· §3.2 διακρίνει πλέον ρητά μορφή (pct_org_vat) από mod-11 checksum (pct_org_vat_checksum, νέα is_valid_vat_checksum() στο kimdis_data.py) αντί να τα συγχέει σε μία υπόσχεση που δεν τηρούνταν στον κώδικα.
2026-07-12 0.6 E3: ολοκλήρωση backfill payment entity (2020-01→2026-06, 78/78 μήνες, 0 μόνιμες αποτυχίες – υπερκάλυψη του στόχου ≥74/78). Το payment προστέθηκε στο COMPLETENESS_ENTITIES του scripts/build_site_data.py (εμφανίζεται πλέον στον πίνακα πληρότητας /dedomena/) και ξεκλείδωσε πλήρη κάλυψη για το §4.4 Benford (30.944 γραμμές, 4.685 με N≥300). Δεδομένα ανέβηκαν στο R2 (data/raw/payment_*.parquet, 1,6 GB).
2026-07-10 0.5 D2: πρώτη υλοποίηση §4.7 (σύντομες προθεσμίες υποβολής) σε scripts/compute_indicators_v1.py::deadline_indicator()data/processed/indicator_deadlines.csv (10.435 γραμμές φορέα/έτους, vat, year, n_notices, median_deadline_days, pct_short_deadline, coverage_pct, note). Οριστικοποιήθηκε: days = finalSubmissionDate − submissionDate (ημερολογιακή ανάλυση), αποκλεισμός απευθείας αναθέσεων (84% των notice, μη-ανταγωνιστική ημερομηνιακή σημασιολογία), ελάχιστο N=5, guard σε NaT/αρνητικές διάρκειες με δημοσιευμένο coverage_pct. Συνειδητή απόφαση χρήστη: το pct_short_deadline (% σύντομων προθεσμιών) δεν υλοποιείται σε αυτό το πέρασμα – απαιτεί πίνακα ελάχιστων νόμιμων προθεσμιών ανά τύπο διαδικασίας που δεν υπάρχει τεκμηριωμένος και χρειάζεται νομική επιβεβαίωση, ίδιο άνοιχτο ζήτημα με τα όρια bid-splitting (§4.5). Η στήλη δημοσιεύεται με τιμή null προς το παρόν. Ενσωματώθηκε στο downstream pipeline (build_site_data.py, build_foreas_data.py) και νέα κάρτα «Διάμεση προθεσμία υποβολής» στο /foreas/<vat>/ (build-time inline SVG, ουδέτερη μπλε κλίμακα, badge «Ανεπαρκή δεδομένα» κάτω από N=5).
2026-07-10 0.6 D13: επέκταση εξαίρεσης διαδικασιών στο §4.7: το deadline_indicator() εξαιρεί πλέον, πέρα από typeOfProcedure.key == "6", και key == "12" / value = "Διαπραγμάτευση χωρίς προηγούμενη δημοσίευση" (άρθρο 32 ν.4412/2016, επιβεβαιωμένο ως ειδική διαδικασία μέσω εγκυκλίου ΓΓ Εμπορίου 99864/2025) καθώς και key == "18" / value = "Διαδικασία άρθρου 128 του ν.4412/16" (πιθανή ειδική διαδικασία χωρίς ενιαίο χρονοδιάγραμμα, βλ. research note). Στόχος: να μη χαμηλώνουν τεχνητά τη δημοσιευμένη median_deadline_days. Το pct_short_deadline παραμένει null και μη δημοσιευμένο ως flag.
2026-07-10 0.6 D3: πρώτη υλοποίηση §4.3 single-bid rate σε scripts/compute_indicators_v1.py::single_bid_rate()data/processed/indicator_single_bid.csv (cutover 2025-04, πρώτος πλήρης μήνας με διαθέσιμο bidsSubmitted). Ο δείκτης χρησιμοποιεί μόνο ανταγωνιστικές διαδικασίες με το ίδιο φίλτρο του §4.7, ελάχιστο N=5, δημοσιεύει coverage_pct, και εξαιρεί τιμές bidsSubmitted < 1 ή >100 ως data errors με μετρητή n_bids_outliers (εντοπίστηκαν 1.573 outliers στο τρέχον run).
2026-07-10 0.6 D8: πρώτη υλοποίηση §4.8 σύνθετου δείκτη σε data/processed/indicator_composite.csv: μη σταθμισμένος μέσος των διαθέσιμων δημοσιευμένων flags (DA_count, DA_value, HHI, pct_near_zero_discount, median_deadline_days ως ανεστραμμένο ετήσιο percentile, single_bid_pct). Εξαιρούνται ρητά §4.5 bid-splitting και §4.7 pct_short_deadline, επειδή δεν δημοσιεύονται πριν τη νομική επιβεβαίωση.
2026-07-12 0.7 E6: downstream wiring §4.4 Benford ολοκληρώθηκε (ο δείκτης ήταν ήδη υπολογισμένος από session 27). build_site_data.py::merge_indicators ενώνει τις ετήσιες γραμμές (period != "all") στο indicators.json· build_foreas_data.py::attach_indicators περνά και τα δύο επίπεδα περιόδου (έτος + all) στα foreas_pages.json, με fallback στο all όταν κανένα έτος δεν πιάνει N=300. Νέα κάρτα «Έλεγχος Benford» στο /foreas/<vat>/ (MAD 1ου ψηφίου + ζώνη Nigrini + N + περίοδος, badge «Ανεπαρκή δεδομένα»)· νέα σελίδα /deiktes/benford/ (status pendingpublished στο site/src/lib/indicators.ts). Παραμένει εκτός §4.8 (κλειδωμένα components).
2026-07-13 0.9 Review M2/M3 (review.md, sessions 29-36 review): §4.10 ενοποίηση/διόρθωση. Αφαιρέθηκε το φίλτρο ακυρωμένων αναθέσεων από τα Query C/E (scripts/graph/queries.py) και το snapshot GDS projection (scripts/graph/run_gds.py) — τα δημοσιευμένα components της κάρτας «Δίκτυο» μετράνε πλέον τον ίδιο πληθυσμό (παγίδα #7, βλ. παραπάνω για την αιτιολόγηση της επιλογής). Το Query C επιστρέφει πλέον και left_censored flag ανά (φορέα, έτος) για το πρώτο ενεργό έτος κάθε φορέα· το attach_network() (build_foreas_data.py) και η κάρτα «Δίκτυο» (/foreas/<vat>/) δεν επιλέγουν πλέον left-censored έτος ως προεπιλογή (παγίδα #6). Απαιτεί επόμενο χειροκίνητο refresh του γράφου (scripts/graph/queries.py + run_gds.py) για να ενημερωθούν τα ήδη εξαγμένα graph_features_org.csv/GDS αποτελέσματα.
2026-07-13 0.8 P2-12: νέα §4.10 «Δείκτες δικτύου» (blocking gate για κάθε δημόσια κάρτα «Δίκτυο»). Δημοσιεύονται: top-30 ego-network γείτονες ανά φορέα, new-winner-rate ανά φορέα/έτος (N≥5). Ρητά ΕΣΩΤΕΡΙΚΑ/μη δημοσιευμένα: Query A αποκλειστικές σχέσεις, Query B market bridges (CSV μόνο, καμία θέση στο site ακόμα), Query E ύποπτη εναλλαγή, Query #4 κοινοί διευθυντές ΓΕΜΗ. Ρητές παγίδες: WINS_AGAINST δεν υπολογίζεται, Louvain communities = δομικές ομαδοποιήσεις όχι συμπαιγνία, batch/offline με snapshot_date, ίδια κενά κάλυψης §4.9, ίδια παραδοχή multi-member με §4.2. DISCLAIMER.md ενημερώθηκε παράλληλα (§4α). Υλοποίηση: scripts/graph/queries.py (Queries A-E πάνω στο ήδη φορτωμένο Neo4j γράφημα), build_foreas_data.py::attach_network, νέα κάρτα «Δίκτυο» στο /foreas/<vat>/.