{
  "schema": "measurement-rules-v1",
  "version": "rules-2026-10-v2",
  "writtenOn": "2026-10-09",
  "appliesFrom": "2026-10",
  "supersedes": {
    "version": "rules-2026-10-v1",
    "file": "/research/prices/rules-2026-10-v1.json",
    "sha256": "089137ae933e8cf229ad13320e20741b655f402e3588b7f2e37d004cf9be8ae2",
    "changedRules": [11],
    "el": "Αλλάζει μόνο ο κανόνας 11. Το bootstrap της διαμέσου πόλης δεν έδειχνε την αβεβαιότητα με λίγες επιχειρήσεις ή ισοπαλίες τιμών: τον Σεπτέμβριο 22 από τις 78 πόλεις είχαν διάστημα ένα σημείο, ανάμεσά τους η Λάρισα με 18 επιχειρήσεις.",
    "en": "Only rule 11 changes. The bootstrap of the city median did not show the uncertainty with few businesses or tied prices: in September 22 of the 78 cities had a single-point interval, Larisa with 18 businesses among them."
  },
  "writtenBeforeData": {
    "el": "Γράφτηκε πριν από την ανάγνωση του Οκτωβρίου 2026, που γίνεται 26 ή 27.10, με απόφαση χρήστη της 9.10.2026. Αντικαθιστά το rules-2026-10-v1 μόνο στον κανόνα 11, το διάστημα της διαμέσου πόλης. Οι άλλοι κανόνες μένουν κατά λέξη, με την αρχική ημερομηνία τους, και το v1 μένει δημόσιο και αμετάβλητο. Κανένα αποτέλεσμα του Οκτωβρίου δεν επιλέγει τον κανόνα που το ερμηνεύει. Το αρχείο δεν ξαναγράφεται: αλλαγή κανόνα σημαίνει νέο αρχείο με νέα έκδοση και ημερομηνία.",
    "en": "Written before the October 2026 reading, which takes place on 26 or 27 October, by user decision of 9 October 2026. It replaces rules-2026-10-v1 in rule 11 only, the interval of the city median. The other rules are copied word for word with their original date, and v1 stays public and unchanged. No October result chooses the rule that interprets it. This file is never rewritten: a rule change means a new file with a new version and date."
  },
  "indexChanged": false,
  "rules": [
    {
      "id": 1,
      "writtenOn": "2026-09-25",
      "el": "Ο επίσημος μηνιαίος ρυθμός συγκρίνει κάθε καταχώριση με τον εαυτό της απέναντι στον προηγούμενο κανονικό μήνα, στα ζεύγη με βασική ταυτότητα: ίδια πόλη, ίδιο είδος και όνομα τυλιχτού, ίδιο και μοναδικό αναγνωριστικό προϊόντος, τιμή και στις δύο αναγνώσεις, και κανένα καταγεγραμμένο πεδίο αλλαγμένο ή παρόν στη μία μόνο.",
      "en": "The official monthly rate compares each listing with itself against the previous regular month, on pairs with basic identity: same city, same wrap kind and name, same unique product id, a price in both readings, and no recorded field changed or present in one reading only."
    },
    {
      "id": 2,
      "writtenOn": "2026-09-25",
      "el": "Δομικές απουσίες δεν αποκλείουν ζεύγος: περιγραφή, λεπτομέρειες διαμόρφωσης και πεδία επιλογών όταν λείπουν και στις δύο αναγνώσεις, και αρχική τιμή κάτω από την πληρωτέα, σε μία ή και στις δύο αναγνώσεις (διευκρίνιση 9.10.2026, βλ. κανόνα 8). Κάθε άλλη ένδειξη αποκλείει: αλλαγμένο ή ελλιπές αναγνωριστικό, αμφίσημη επιλογή προϊόντος, αλλαγή διαθεσιμότητας ή ονόματος, περιγραφή που εμφανίστηκε ή χάθηκε.",
      "en": "Structural absences do not exclude a pair: description, configuration detail and option fields when missing in both readings, and an original price below the paid price in one reading or both (clarified 9 October 2026, see rule 8). Every other sign excludes: a changed or missing id, an ambiguous product choice, a change in availability or name, a description that appeared or disappeared."
    },
    {
      "id": 3,
      "writtenOn": "2026-09-25",
      "el": "Δημοσιεύονται μαζί η διάμεσος και ο γεωμετρικός μέσος των λόγων, το ποσοστό αμετάβλητων, πόσα ανέβηκαν και πόσα κατέβηκαν, συνολικά και ανά πλατφόρμα.",
      "en": "The median and the geometric mean of the ratios are published together with the unchanged share and the counts of rises and falls, overall and per platform."
    },
    {
      "id": 4,
      "writtenOn": "2026-09-25",
      "el": "Κάτω από 100 ζεύγη βασικής ταυτότητας συνολικά δεν δημοσιεύεται ρυθμός, με τον λόγο και το πλήθος. Κάτω από 30 σε μια πλατφόρμα, αυτή δεν δίνει δικό της ρυθμό.",
      "en": "Below 100 basic-identity pairs overall no rate is published, with the reason and the count. Below 30 on a platform, that platform gives no rate of its own."
    },
    {
      "id": 5,
      "writtenOn": "2026-09-25",
      "el": "Δίπλα δημοσιεύεται ο ρυθμός πλήρους ταυτότητας, με όλα τα πεδία παρόντα και ίδια. Διαφορά από τον επίσημο πάνω από 1 ποσοστιαία μονάδα γράφεται ως εύρημα με το νούμερο.",
      "en": "The full-identity rate, with every field present and equal, is published beside it. A gap above 1 percentage point from the official rate is recorded as a finding with the number."
    },
    {
      "id": 6,
      "writtenOn": "2026-09-25",
      "el": "Μόνο η πλατφόρμα B δίνει κανονική τιμή δίπλα στην πληρωτέα. Στις A και C μια προσφορά περνά για τιμή. Ποσοστό αμετάβλητων κάτω από 80% γράφεται ως προειδοποίηση.",
      "en": "Only platform B gives a regular price next to the paid one. On A and C an offer passes for the price. An unchanged share below 80% is recorded as a warning."
    },
    {
      "id": 7,
      "writtenOn": "2026-09-25",
      "el": "Το επίπεδο δημοσιεύεται ως διάμεσος ανά πόλη με τον παρονομαστή της σε καταχωρίσεις, χωρίς εθνικό άθροισμα. Ο Δείκτης δεν αλλάζει από τη μηνιαία μέτρηση.",
      "en": "The level is published as a median per city with its denominator in listings, with no national aggregate. The Index does not change from the monthly measurement."
    },
    {
      "id": 8,
      "writtenOn": "2026-10-09",
      "el": "Τιμή του ρυθμού: η τιμή που πληρώνει ο πελάτης, όπως στο επίπεδο. Η αρχική τιμή της B μετρά μόνο όταν είναι ψηλότερη από την πληρωτέα κατά τουλάχιστον μισό λεπτό, δηλαδή όταν τρέχει πραγματική προσφορά. Αρχική κάτω από την πληρωτέα αγνοείται, είτε εμφανίζεται στη μία ανάγνωση είτε και στις δύο. Συνέπεια: αν η αρχική ανέβει πάνω από αμετάβλητη πληρωτέα, ο ρυθμός διαβάζει άνοδο της κανονικής τιμής με προσφορά από πάνω.",
      "en": "Price of the rate: the price the customer pays, as in the level. Platform B's original price counts only when it is higher than the paid price by at least half a cent, that is when a real offer is running. An original price below the paid price is ignored, whether it appears in one reading or both. Consequence: if the original rises above an unchanged paid price, the rate reads a rise of the regular price with an offer on top."
    },
    {
      "id": 9,
      "writtenOn": "2026-10-09",
      "el": "Διάστημα: 95% bootstrap για τον γεωμετρικό μέσο, συνολικά και ανά πλατφόρμα, με 2.000 επαναλήψεις και δηλωμένο σπόρο. Συστάδα είναι πόλη × κανονικοποιημένο όνομα καταστήματος, ώσπου να γραφτεί κανόνας ταύτισης επιχείρησης, ώστε η ίδια επιχείρηση σε δύο πλατφόρμες να μη μετρά ως δύο ανεξάρτητες παρατηρήσεις. Στρώματα οι πλατφόρμες: κάθε συστάδα ανήκει στο στρώμα του συνδυασμού πλατφορμών όπου εμφανίζεται (A, B, C, AB, AC, BC, ABC) και ξαναδιαλέγεται με επανάθεση μέσα σε αυτό. Ανά πλατφόρμα το στρώμα είναι ένα.",
      "en": "Interval: a 95% bootstrap for the geometric mean, overall and per platform, with 2,000 replicates and a declared seed. A cluster is city × normalised shop name, until a business-identity rule is written, so that the same business on two platforms does not count as two independent observations. Strata are the platforms: each cluster belongs to the stratum of the combination of platforms it appears on (A, B, C, AB, AC, BC, ABC) and is resampled with replacement within it. Per platform there is a single stratum."
    },
    {
      "id": 10,
      "writtenOn": "2026-10-09",
      "el": "Διατύπωση: «αύξηση» ή «μείωση» γράφεται μόνο όταν το διάστημα αποκλείει το μηδέν. Αλλιώς γράφεται «δεν διακρίνεται από το μηδέν». Τα όρια δημοσιεύονται με 5 δεκαδικά, και η λέξη αποφασίζεται πάνω στα δημοσιευμένα όρια. Η διάμεσος των λόγων δημοσιεύεται πάντα μαζί με το ποσοστό αμετάβλητων, γιατί όταν δεν αλλάζει πάνω από το μισό των τιμών είναι εκ κατασκευής μηδέν.",
      "en": "Wording: “increase” or “decrease” is written only when the interval excludes zero. Otherwise it reads “not distinguishable from zero”. The bounds are published to 5 decimals, and the word is decided on the published bounds. The median of the ratios is always published with the unchanged share, because when more than half of the prices do not change it is zero by construction."
    },
    {
      "id": 11,
      "writtenOn": "2026-10-09",
      "el": "Οι διάμεσοι πόλεων δημοσιεύονται με ακριβές 95% διάστημα από διατεταγμένες τιμές, χωρίς υπόθεση κατανομής, χωρίς επαναδειγματοληψία και χωρίς σπόρο. Μονάδα είναι η επιχείρηση, δηλαδή η συστάδα πόλη × κανονικοποιημένο όνομα του κανόνα 9, και τιμή της η διάμεσος των καταχωρίσεών της, στρογγυλεμένη στα 4 δεκαδικά, ώστε η ίδια επιχείρηση σε δεύτερη πλατφόρμα να μη μετρά δεύτερη φορά. Με k επιχειρήσεις το διάστημα είναι [x(r), x(k+1-r)] των διατεταγμένων τιμών, με r τον μεγαλύτερο ακέραιο ώστε 1 - 2·P(Bin(k, 1/2) ≤ r - 1) ≥ 0,95. Με ανεξάρτητες επιχειρήσεις η κάλυψη αυτή ισχύει ως ελάχιστη για κάθε κατανομή, και με ισοπαλίες τιμών. Δίπλα στο διάστημα δημοσιεύονται το k, το r και η ακριβής κάλυψη. Με λιγότερες από 6 επιχειρήσεις δεν δημοσιεύεται διάστημα, γιατί ακόμη και το [min, max] καλύπτει κάτω από 95%, και η πόλη παίρνει σημαία λίγων επιχειρήσεων. Η πόλη κρατά πάντα τη διάμεσο των καταχωρίσεών της και τον παρονομαστή της (κανόνας 7), και κάτω από 10 καταχωρίσεις και τη σημαία μικρού δείγματος. Το διάστημα αφορά τη διάμεσο των επιχειρήσεων· αν η δημοσιευμένη διάμεσος καταχωρίσεων πέσει εκτός του, γράφεται ως εύρημα με το νούμερο.",
      "en": "City medians are published with an exact 95% interval from order statistics, free of distributional assumptions, with no resampling and no seed. The unit is the business, the city × normalised name cluster of rule 9, and its value is the median of its listings, rounded to 4 decimals, so that the same business on a second platform does not count twice. With k businesses the interval is [x(r), x(k+1-r)] of the sorted values, with r the largest integer such that 1 - 2·P(Bin(k, 1/2) ≤ r - 1) ≥ 0.95. For independent businesses that coverage holds as a minimum for every distribution, tied prices included. The interval is published with k, r and the exact coverage. With fewer than 6 businesses no interval is published, because even [min, max] covers less than 95%, and the city is flagged as having few businesses. The city always keeps the median of its listings and its denominator (rule 7), and below 10 listings the small-sample flag as well. The interval is for the median across businesses; if the published listing median falls outside it, this is recorded as a finding with the number."
    },
    {
      "id": 12,
      "writtenOn": "2026-10-09",
      "el": "Καμία κανονική ανάγνωση σε εθνική αργία. Ο λόγος του κανόνα «καθημερινή», ότι το σαββατοκύριακο αλλάζει ποια μαγαζιά είναι ενεργά, ισχύει και για τις αργίες. Οκτώβριος 2026: 26 ή 27.10, γιατί η 28.10 είναι αργία. Δεκέμβριος 2026: μόνο η Δευτέρα 28.12. Μάρτιος 2027: μόνο η Παρασκευή 26.3. Στους μήνες με μία μέρα ο προέλεγχος (canary.py, λίγα αιτήματα) γίνεται την προηγούμενη μέρα, 27.12 και 25.3· ο προέλεγχος δεν είναι κανονική ανάγνωση. Ο φύλακας της συλλογής αρνείται κανονική ανάγνωση μετά το τέλος της λίστας αργιών.",
      "en": "No regular reading on a national holiday. The reason for the weekday rule, that the weekend changes which shops are active, holds for holidays too. October 2026: 26 or 27 October, because 28 October is a holiday. December 2026: only Monday 28 December. March 2027: only Friday 26 March. In single-day months the pre-check (canary.py, a few requests) runs the day before, 27 December and 25 March; the pre-check is not a regular reading. The collection guard refuses a regular reading after the end of the holiday list."
    },
    {
      "id": 13,
      "writtenOn": "2026-10-09",
      "el": "Χαμένος μήνας: αν δεν ολοκληρωθεί η ανάγνωση και των τριών πλατφορμών στις επιτρεπτές μέρες, ο μήνας δηλώνεται χωρίς κανονική μέτρηση, με τον λόγο, χωρίς παρεμβολή και χωρίς ανάγνωση εκτός παραθύρου. Ο επόμενος ρυθμός συγκρίνει με τον πιο πρόσφατο κανονικό μήνα, στα ίδια ζεύγη, και δημοσιεύεται ως μεταβολή όσων μηνών καλύπτει (monthsSpanned), όχι μοιρασμένη.",
      "en": "Missed month: if the reading of all three platforms is not completed on the eligible days, the month is declared without a regular measurement, with the reason, with no interpolation and no reading outside the window. The next rate compares with the latest regular month, on the same pairs, and is published as a change over the months it spans (monthsSpanned), not split."
    }
  ],
  "thresholds": {
    "minPairs": 100,
    "minPlatformPairs": 30,
    "unchangedWarningPct": 80.0,
    "fullIdentityGapFindingPoints": 1.0,
    "samePriceEuro": 0.005,
    "offerMinimumEuro": 0.005,
    "smallCityListings": 10,
    "minCityBusinesses": 6
  },
  "identity": {
    "official": "basic",
    "structuralAbsences": [
      "configuration-fields-missing",
      "configuration-requires-detail",
      "description-missing",
      "original-price-below-listed"
    ]
  },
  "price": {
    "level": "wrap_pork, else wrap_any: the price the customer pays",
    "rate": "the paid price; the original (regular) price only when it exceeds the paid price by at least offerMinimumEuro"
  },
  "interval": {
    "statistic": "geometric mean of the price ratios",
    "level": 0.95,
    "replicates": 2000,
    "seed": 20261026,
    "rng": "Python random.Random(seed), Mersenne Twister; index = floor(random() * n)",
    "quantiles": "linear interpolation between order statistics (type 7)",
    "decimals": 5,
    "decision": "rate bounds are published rounded to `decimals`; the wording is decided on the rate bounds as published. City medians have their own interval: see cityInterval",
    "scope": ["overall", "A", "B", "C"],
    "cluster": {
      "key": "city × normalised name",
      "normalisation": "lowercase shop slug; split on non-alphanumerics; drop digit-only tokens; apply folds in order; collapse repeated letters; drop dropTokens, city-key tokens and the URL area tokens (folded the same way); join without separator; if nothing remains, keep every token",
      "folds": [
        ["ph", "f"],
        ["ch", "x"],
        ["kh", "x"],
        ["ks", "x"],
        ["oy", "u"],
        ["ou", "u"],
        ["w", "o"],
        ["h", "i"],
        ["y", "i"],
        ["ei", "i"],
        ["oi", "i"],
        ["b", "v"]
      ],
      "dropTokens": ["gr", "grc", "i", "kai", "ke", "o", "ta", "tin", "tis", "to", "ton", "tu"],
      "examples": [
        {
          "city": "patra",
          "url": "https://www.e-food.gr/delivery/patra/mpilias-pita-soyvla-kai-kopana-1",
          "shop": "mpilias-pita-soyvla-kai-kopana",
          "key": "mpiliaspitasuvlakopana"
        },
        {
          "city": "patra",
          "url": "https://box.gr/delivery/patra/mpilias-pita-soubla--kopana",
          "shop": "mpilias-pita-soubla--kopana",
          "key": "mpiliaspitasuvlakopana"
        },
        {
          "city": "patra",
          "url": "https://wolt.com/el/grc/patra/restaurant/kitchen-grill-patra-grc",
          "shop": "kitchen-grill-patra-grc",
          "key": "kitxengril"
        },
        {
          "city": "athens",
          "url": "https://box.gr/delivery/agia-paraskevi/kalamaki-square-agia-paraskevi",
          "shop": "kalamaki-square-agia-paraskevi",
          "key": "kalamakisquare"
        }
      ]
    }
  },
  "cityInterval": {
    "statistic": "median of the business values of a city",
    "method": "exact distribution-free interval for the median from order statistics (binomial); no resampling and no seed",
    "level": 0.95,
    "unit": "business: the cluster city × normalised name of interval.cluster",
    "unitValue": "median of the business's listing prices (wrap_pork, else wrap_any), rounded to 4 decimals",
    "bounds": "[x_(r), x_(k+1-r)] of the k sorted business values",
    "rank": "r = the largest integer with 1 - 2 * P(Bin(k, 1/2) <= r - 1) >= level, computed in exact fractions",
    "coverage": "1 - 2 * P(Bin(k, 1/2) <= r - 1): a minimum for independent businesses and any distribution, ties included; published rounded to 4 decimals",
    "minBusinesses": 6,
    "belowMinimum": "interval95, intervalRank and intervalCoverage are null and fewBusinesses is true; the city keeps its listing median and denominator (rule 7)",
    "publishedMedian": "the listing median (rule 7), rounded to 4 decimals, as in v1; a listing median outside the interval is listed in cityMediansOutsideInterval",
    "fields": [
      "interval95",
      "intervalRank",
      "intervalCoverage",
      "clusters",
      "fewBusinesses",
      "fewListings"
    ],
    "table": [
      { "k": 6, "r": 1, "coverage": 0.9688 },
      { "k": 7, "r": 1, "coverage": 0.9844 },
      { "k": 8, "r": 1, "coverage": 0.9922 },
      { "k": 9, "r": 2, "coverage": 0.9609 },
      { "k": 10, "r": 2, "coverage": 0.9785 },
      { "k": 11, "r": 2, "coverage": 0.9883 },
      { "k": 12, "r": 3, "coverage": 0.9614 },
      { "k": 13, "r": 3, "coverage": 0.9775 },
      { "k": 14, "r": 3, "coverage": 0.9871 },
      { "k": 15, "r": 4, "coverage": 0.9648 },
      { "k": 16, "r": 4, "coverage": 0.9787 },
      { "k": 17, "r": 5, "coverage": 0.951 },
      { "k": 18, "r": 5, "coverage": 0.9691 },
      { "k": 19, "r": 5, "coverage": 0.9808 },
      { "k": 20, "r": 6, "coverage": 0.9586 },
      { "k": 21, "r": 6, "coverage": 0.9734 },
      { "k": 22, "r": 6, "coverage": 0.9831 },
      { "k": 23, "r": 7, "coverage": 0.9653 },
      { "k": 24, "r": 7, "coverage": 0.9773 },
      { "k": 25, "r": 8, "coverage": 0.9567 },
      { "k": 26, "r": 8, "coverage": 0.971 },
      { "k": 27, "r": 8, "coverage": 0.9808 },
      { "k": 28, "r": 9, "coverage": 0.9643 },
      { "k": 29, "r": 9, "coverage": 0.9759 },
      { "k": 30, "r": 10, "coverage": 0.9572 }
    ]
  },
  "diagnostics": {
    "el": "Δημοσιεύονται δίπλα στον επίσημο ρυθμό και στο επίπεδο και δεν αλλάζουν κανέναν κανόνα: μία ψήφος ανά συστάδα· πιθανή προσφορά πλατφόρμας στις A και C, όταν μια καταχώριση είχε τον προηγούμενο μήνα την ίδια τιμή με την ίδια συστάδα στις άλλες πλατφόρμες και τώρα είναι φθηνότερη από όλες· ανά πόλη, διάμεσος μόνο ρητά χοιρινού και διάμεσος χωρίς τις λέξεις μεγέθους. Οι ταξινομητές δεν αλλάζουν τον Οκτώβριο.",
    "en": "Published beside the official rate and the level, changing no rule: one vote per cluster; a possible platform offer on A and C, when a listing had the same price as its cluster on the other platforms last month and is now cheaper than all of them; per city, an explicitly pork median and a median without the size words. The classifiers do not change in October.",
    "sizeWords": "\\b(?:ΜΙΚΡΟΣ?|JUNIOR|ΣΦΗΝΑΚΙ|ΠΙΤΑΚΙΑ?)\\b"
  },
  "wording": {
    "increase": { "el": "αύξηση", "en": "increase" },
    "decrease": { "el": "μείωση", "en": "decrease" },
    "not-distinguishable-from-zero": {
      "el": "δεν διακρίνεται από το μηδέν",
      "en": "not distinguishable from zero"
    }
  },
  "calendar": {
    "timeZone": "Europe/Athens",
    "window": { "fromDay": 25, "toDay": 28, "weekdayOnly": true },
    "holidaysThrough": 2027,
    "holidays": [
      { "date": "2026-01-01", "el": "Πρωτοχρονιά", "en": "New Year's Day" },
      { "date": "2026-01-06", "el": "Θεοφάνεια", "en": "Epiphany" },
      { "date": "2026-02-23", "el": "Καθαρά Δευτέρα", "en": "Clean Monday" },
      { "date": "2026-03-25", "el": "25η Μαρτίου", "en": "25 March, Independence Day" },
      { "date": "2026-04-10", "el": "Μεγάλη Παρασκευή", "en": "Orthodox Good Friday" },
      { "date": "2026-04-13", "el": "Δευτέρα του Πάσχα", "en": "Orthodox Easter Monday" },
      { "date": "2026-05-01", "el": "Πρωτομαγιά", "en": "Labour Day" },
      { "date": "2026-06-01", "el": "Αγίου Πνεύματος", "en": "Orthodox Whit Monday" },
      { "date": "2026-08-15", "el": "Δεκαπενταύγουστος", "en": "Dormition, 15 August" },
      { "date": "2026-10-28", "el": "28η Οκτωβρίου", "en": "28 October, Ohi Day" },
      { "date": "2026-12-25", "el": "Χριστούγεννα", "en": "Christmas Day" },
      { "date": "2026-12-26", "el": "Σύναξη της Θεοτόκου", "en": "Second day of Christmas" },
      { "date": "2027-01-01", "el": "Πρωτοχρονιά", "en": "New Year's Day" },
      { "date": "2027-01-06", "el": "Θεοφάνεια", "en": "Epiphany" },
      { "date": "2027-03-15", "el": "Καθαρά Δευτέρα", "en": "Clean Monday" },
      { "date": "2027-03-25", "el": "25η Μαρτίου", "en": "25 March, Independence Day" },
      { "date": "2027-04-30", "el": "Μεγάλη Παρασκευή", "en": "Orthodox Good Friday" },
      { "date": "2027-05-01", "el": "Πρωτομαγιά", "en": "Labour Day" },
      { "date": "2027-05-03", "el": "Δευτέρα του Πάσχα", "en": "Orthodox Easter Monday" },
      { "date": "2027-06-21", "el": "Αγίου Πνεύματος", "en": "Orthodox Whit Monday" },
      { "date": "2027-08-15", "el": "Δεκαπενταύγουστος", "en": "Dormition, 15 August" },
      { "date": "2027-10-28", "el": "28η Οκτωβρίου", "en": "28 October, Ohi Day" },
      { "date": "2027-12-25", "el": "Χριστούγεννα", "en": "Christmas Day" },
      { "date": "2027-12-26", "el": "Σύναξη της Θεοτόκου", "en": "Second day of Christmas" }
    ],
    "eligibleDays": {
      "2026-10": [26, 27],
      "2026-11": [25, 26, 27],
      "2026-12": [28],
      "2027-01": [25, 26, 27, 28],
      "2027-02": [25, 26],
      "2027-03": [26],
      "2027-04": [26, 27, 28],
      "2027-05": [25, 26, 27, 28],
      "2027-06": [25, 28],
      "2027-07": [26, 27, 28],
      "2027-08": [25, 26, 27],
      "2027-09": [27, 28],
      "2027-10": [25, 26, 27],
      "2027-11": [25, 26],
      "2027-12": [27, 28]
    },
    "singleDayMonths": {
      "2026-12": { "day": 28, "preCheck": "2026-12-27" },
      "2027-03": { "day": 26, "preCheck": "2027-03-25" }
    }
  }
}
