Συμμόρφωση που απορρίπτει
Ένα εύλογο τεστ ξεχωρίζει μια οντολογία από ένα διάγραμμα με ετικέτες: μπορεί το τεκμήριο να απαγορεύσει κάτι; Μια οντολογία χωρίς αξιώματα, χωρίς επικύρωση, χωρίς αρχιτεκτονική πρόθεση είναι ένα γλωσσάρι σχεδιασμένο ως γράφος. Περιγράφει, αλλά δεν μπορεί να απορρίψει. Αν το Vercy είναι μόνο αυτό, η κριτική πετυχαίνει.
Γι' αυτό η σελίδα απαντά στο τεστ ευθέως, με ένα ναι και μια επίδειξη που μπορείτε να τρέξετε. Η συμμόρφωση στο Vercy επιβάλλεται, δεν διακοσμεί. Υπάρχει πρόγραμμα που διαβάζει ένα μοντέλο, το βρίσκει άκυρο και τερματίζει με μη μηδενικό κωδικό, κατονομάζοντας τον κανόνα που παραβιάστηκε. Παρακάτω είναι ακριβώς ποιο πρόγραμμα, ακριβώς ποιος κανόνας και μία αναλυμένη απόρριψη.
Η συμμόρφωση είναι πύλη, όχι περιγραφή
Το ζωντανό μητρώο, δημοσιευμένο στο github.com/ver-cy/registry, είναι το εν λειτουργία στιγμιότυπο του προφίλ ELMM. Η διαδρομή εγγραφής του είναι ένα pull request, και η πύλη εισδοχής σε αυτήν είναι η συνεχής ενσωμάτωση: το ci/run.py εκτελεί επτά ελέγχους fail-closed με τη σειρά, και ένας μόνο κόκκινος έλεγχος μπλοκάρει τη συγχώνευση. Fail-closed σημαίνει ότι η προεπιλογή είναι η άρνηση: ένα μοντέλο γίνεται δεκτό μόνο αν επιβιώσει από κάθε έλεγχο, όχι γίνεται δεκτό εφόσον κανείς δεν φέρει αντίρρηση.
Οι επτά έλεγχοι, καθένας τερματίζοντας με μη μηδενικό κωδικό και κατονομασμένο κανονιστικό κανόνα στην πρώτη παράβαση:
check_schema(επικύρωση σχήματος V0, ELMM-I8, ELMM-I14): κάθε καταχώριση επικυρώνεται έναντι του σχήματος προφίλ κόμβου του μητρώου, και η προβολή των upstream πεδίων της έναντι του αμετάβλητου upstream σχήματος καταχώρισης: κάθε ακμή επικυρώνεται έναντι του σχήματος ακμών. Εγγραφή με απόν υποχρεωτικό πεδίο, κακοσχηματισμένη ταυτότητα ή τιμή εκτός ελεγχόμενου λεξιλογίου απορρίπτεται εδώ.check_graph(ακεραιότητα του γράφου MMDG): έξι υποκανόνες, που απαριθμούνται στην επόμενη ενότητα.check_resolve(ντετερμινισμός και επανάληψη του επιλυτή, ELMM-I23, ELMM-I26, ELMM-I30): ο επιλυτής τρέχει δύο φορές με την ίδια σταθερή είσοδο ρολογιού και πρέπει να παράγει έξοδο ταυτόσημη ανά byte: το παραγόμενο πακέτο πλαισίου και το Twin Composition Snapshot πρέπει να επικυρώνονται έναντι των σχημάτων τους: και όπου υπάρχει καταχωρημένο fixture, η νέα έξοδος πρέπει να ταυτίζεται μαζί του ανά byte. Επιλυτής που διαβάζει ρολόι συστήματος, βγαίνει στο δίκτυο ή ξεφεύγει από τα fixtures του, αποτυγχάνει.check_zero_change(καταχώριση χωρίς αλλαγή πυρήνα, ELMM-I7, ELMM-I44): η καταχώριση νέου μοντέλου οποιουδήποτε ρόλου και τομέα πρέπει να αγγίζει μόνο δεδομένα μητρώου. Ο έλεγχος κλωνοποιεί το δέντρο, εισάγει νέο μοντέλο και μια ακμή, τρέχει την πύλη, επιλύει μια εργασία που φτάνει στο νέο είδος και υπολογίζει hash τωνschema/καιresolver/πριν και μετά. Μη κενό diff πυρήνα είναι αποτυχία συμμόρφωσης: θα σήμαινε ότι η εισδοχή απαίτησε αλλαγή του πυρήνα.check_facets(ένταξη σε όψεις και φρεσκάδα ευρετηρίου, ARCH-017): κάθε κωδικός κλάδου και συστάδας σε μια καταχώριση ανήκει στο λεξιλόγιό του: κάθε εξωτερική Ομάδα είναι αντιστοιχισμένη: ο παραγόμενος κατάλογος και το ενοποιημένο ευρετήριο αναπαράγονται ταυτόσημα ανά byte. Λεξιλόγιο που ξέφυγε, μη αντιστοιχισμένη Ομάδα ή χειροκίνητα επεξεργασμένο παραγόμενο αρχείο αποτυγχάνουν.check_instantiations(ακεραιότητα μετασχηματισμού B6): κάθε καταχωρημένη υλοποίηση από εξωτερικό σε εσωτερικό αναπαράγεται ταυτόσημη ανά byte, η καταχώρισή της επικυρώνεται έναντι του σχήματος κόμβου και το μανιφέστο της έναντι του σχήματος μανιφέστου, και ο έλεγχος κυριότητας IC-1 ισχύει.check_conventions(συμβάσεις σκελετού, S1, S2): το σχήμα κεφαλίδας τεκμηρίου είναι έγκυρο JSON Schema, το readme των τεκμηριωμένων συμβάσεων δεν είναι κενό, και κανένα όνομα αρχείου κάτω απόentries/,mmdg/ήschema/δεν φέρει ημερομηνία. Ο κανόνας χωρίς ημερομηνία στο όνομα αρχείου και οι συμβάσεις κεφαλίδων επιβάλλονται εδώ.
Αυτό δεν είναι υπόσχεση για συμπεριφορά, είναι η ίδια η συμπεριφορά. Η πύλη είναι ο κώδικας, και ο κώδικας είναι δημόσιος.
Ο έλεγχος ακεραιότητας του γράφου, κανόνας προς κανόνα
Το check_graph είναι εκεί όπου συμβαίνουν οι περισσότερες δομικές απορρίψεις. Επιβάλλει έξι κανόνες, καθέναν με δικό του διαγνωστικό και δικό του αναγνωριστικό ELMM:
- Ένας κόμβος ανά κύρια ταυτότητα (ELMM-I17): καμία δύο εγγραφή δεν μοιράζεται ίδιο id μητρώου.
- Αναφορική ακεραιότητα (ELMM-I19): κάθε άκρο ακμής,
fromκαιto, είναι id καταχωρημένης εγγραφής. - Κάλυψη εξαγωγών (ELMM-I11, ELMM-I19): κάθε είδος που κατονομάζει μια ακμή εμφανίζεται στα
exportsτης εγγραφής-στόχου. Ο γράφος υπολογίζεται στατικά μόνο από τις εγγραφές, οπότε αναφορά σε είδος που ο στόχος δεν εξάγει απορρίπτεται πριν από τον χρόνο επίλυσης. - Συμφωνία δηλωμένου ελαχίστου (ELMM-I11): όπου το
requiresμιας εγγραφής κατονομάζει τον ίδιο στόχο και είδος με μια ακμή, τοdeclared_minτης ακμής ισούται με εκείνο τοmin_version. Υπό την Επιλογή Ελάχιστης Έκδοσης η ακμή είναι η μοναδική είσοδος του επιλυτή, άρα εγγραφή και ακμή οφείλουν να συμφωνούν. - Απομόνωση πυρήνα (ELMM-I18): καμία ακμή
composesδεν φεύγει από τον κόμβο του πυρήνα. Ο πυρήνας δεν ενορχηστρώνει τίποτα: η γνώση του για τα μοντέλα έρχεται από το μητρώο, ποτέ από εξερχόμενες ακμές. - Ακυκλικότητα (ELMM-I16): ο υπογράφος
composesείναι κατευθυνόμενος ακυκλικός γράφος.
Καθένας από αυτούς μπορεί μόνος του να κάνει κόκκινο ένα πράσινο δέντρο.
Μία αναλυμένη απόρριψη
Πάρτε τον κανόνα 3, την κάλυψη εξαγωγών, και σπάστε τον επίτηδες.
Έστω ότι το μοναδικό διοικούμενο Τοπίο, vercy.plmm, δηλώνει ότι αναφέρεται σε ένα είδος budget-line που ανήκει στο μοντέλο οργανωτικών μονάδων vercy.oumm. Στο mmdg/edges.json ένας συντάκτης προσθέτει:
{
"from": "vercy.plmm",
"to": "vercy.oumm",
"edge_type": "references",
"declared_min": "0.1.0",
"compositional_role": "R4",
"kinds": ["budget-line"]
}
Η ακμή είναι έγκυρη κατά σχήμα: έχει κάθε υποχρεωτικό πεδίο, οπότε ο check_schema την περνά. Και τα δύο άκρα είναι καταχωρημένα, οπότε η αναφορική ακεραιότητα περνά. Διαβάζεται ως απολύτως καλοσχηματισμένη δήλωση. Όμως το vercy.oumm δεν εξάγει budget-line. Οι εξαγωγές του είναι org-unit, reporting-line, established-position και unit-mandate: το budget-line δεν είναι σε καμία. Η ακμή ισχυρίζεται εξάρτηση από νόημα που ο στόχος ουδέποτε δημοσίευσε.
Ο check_graph αρνείται. Ο υποέλεγχος κάλυψης εξαγωγών διατρέχει κάθε ακμή, παίρνει το σύνολο exports του στόχου και αποτυγχάνει στο πρώτο κατονομασμένο είδος που λείπει από αυτό. Εκπέμπει το πλήρες σύνολο εξαγωγών του στόχου, ταξινομημένο, ώστε ο αναγνώστης να δει ακριβώς τι δημοσιεύτηκε και τι όχι. Η εκτέλεση τερματίζει με μη μηδενικό κωδικό και αυτό το διαγνωστικό:
check_graph: FAIL
edge #N (vercy.plmm -references-> vercy.oumm) references kind 'budget-line'
which is not in vercy.oumm exports ['established-position', 'org-unit',
'reporting-line', 'unit-mandate'] (ELMM-I11, export coverage)
Η συγχώνευση μπλοκάρεται. Δεν επισημαίνεται, δεν προειδοποιεί: μπλοκάρεται. Το ci/run.py επιστρέφει μη μηδενικό κωδικό εξόδου και το pull request δεν μπορεί να προσγειωθεί. Για να διορθωθεί, ο συντάκτης είτε κάνει το vercy.oumm να εξάγει πραγματικά το budget-line, που είναι αληθινή αλλαγή την οποία το μοντέλο-ιδιοκτήτης οφείλει να δημοσιεύσει και να υποστηρίξει, είτε παύει να διεκδικεί μια αναφορά που ποτέ δεν του δόθηκε. Το μητρώο δεν θα αφήσει ένα μοντέλο να εξαρτάται από νόημα που άλλο μοντέλο δεν έχει εξάγει. Αυτό είναι κάτι που το τεκμήριο απαγορεύει.
Το ίδιο σχήμα άρνησης υπάρχει σε όλη την πύλη. Κυκλική σύνθεση, όπου ένα Τοπίο συνθέτει μοντέλο που μεταβατικά το συνθέτει πίσω, απορρίπτεται από την ακυκλικότητα (ELMM-I16). Ακμή προς ανύπαρκτο μοντέλο απορρίπτεται από την αναφορική ακεραιότητα (ELMM-I19). Ελάχιστο στο requires που διαφωνεί με το declared_min της ακμής του απορρίπτεται από τη συμφωνία δηλωμένου ελαχίστου (ELMM-I11), γιατί αλλιώς ο επιλυτής θα διάλεγε έκδοση έναντι της οποίας η εγγραφή ουδέποτε επικυρώθηκε. Καταχώριση που θα ανάγκαζε επεξεργασία πυρήνα απορρίπτεται από την εγγύηση μηδενικής αλλαγής (ELMM-I7). Όνομα αρχείου με ημερομηνία απορρίπτεται από τη σύμβαση ονοματοδοσίας (S1). Επιλυτής του οποίου οι δύο εκτελέσεις αποκλίνουν απορρίπτεται από τον ντετερμινισμό (ELMM-I23). Σε κάθε περίπτωση ο κανόνας είναι ο λόγος, το αναγνωριστικό είναι μέσα στο μήνυμα και ο κωδικός εξόδου δεν είναι μηδέν.
Το μοτίβο είναι το ζητούμενο: κάθε άρνηση κατονομάζει έναν κανονιστικό κανόνα στον οποίο μπορεί να παραπεμφθεί το μοντέλο, με τον οποίο μπορεί κανείς να διαφωνήσει και βάσει του οποίου μπορεί να διορθώσει. Δεν υπάρχει σιωπηλή απόρριψη ούτε απόρριψη κατά γούστο. Σπάσε τον κανόνα, πάρε τον κωδικό εξόδου, διάβασε το αναγνωριστικό.
Πέρα από το μητρώο: οι επικυρωτές μοντέλων
Το μητρώο ελέγχει τις σχέσεις μεταξύ μοντέλων. Τα επιμέρους μοντέλα φέρουν δικές τους πύλες. Το Συλλογικό Μετα-Μοντέλο, δημοσιευμένο και εκδόσιμο στο github.com/ver-cy/collective-meta-model, συνοδεύεται από επικυρωτή κόμβου που τρέχει τις πύλες V0 έως V2 συν τους ειδικούς ελέγχους CMM και αρνείται σε σπασμένο στιγμιότυπο: μέλος χωρίς συλλογικότητα, παραχώρηση αρμοδιότητας χωρίς παραχωρούντα, εντολή που δεν κλείνει βρόχο λογοδοσίας. Η εγγραφή καταχώρισης εκείνου του μοντέλου καταγράφει την επικύρωση V2 ως επίπεδο συμμόρφωσής του, και η εγγραφή αξίζει όσο ο επικυρωτής που τη στηρίζει. Ο επικυρωτής είναι ο λόγος για τον οποίο το επίπεδο είναι ισχυρισμός και όχι στολίδι.
Το ειλικρινές όριο
Τρία πράγματα πρέπει να ειπωθούν ευθέως.
Πρώτον, σήμερα αυτό είναι συμμόρφωση σε επίπεδο στιγμιοτύπου μοντέλου. Οι έλεγχοι απορρίπτουν άκυρες εγγραφές μητρώου, άκυρες ακμές, μη ντετερμινιστική επίλυση και άκυρα στιγμιότυπα μοντέλων έναντι των επικυρωτών τους. Τρέχουν σε CI στη διαδρομή εγγραφής και μπορεί να τους τρέξει οποιοσδήποτε τοπικά: κλωνοποιήστε το μητρώο από το github.com/ver-cy/registry, τρέξτε python ci/run.py, σπάστε έναν κανόνα, δείτε το να αποτυγχάνει. Αυτό είναι αληθινό και αρκεί για να απαντηθεί το τεστ.
Δεύτερον, μια φιλοξενούμενη δημόσια υπηρεσία επικύρωσης, μια σελίδα ή ένα endpoint όπου κάποιος εκτός ρίχνει ένα αυθαίρετο μοντέλο και παίρνει ετυμηγορία χωρίς να κλωνοποιήσει τίποτα, δεν υπάρχει ακόμη. Είναι ανοιχτό θέμα και κατονομάζεται ως τέτοιο. Μέχρι να κυκλοφορήσει, η άρνηση είναι αναπαραγώγιμη αλλά όχι με ένα κλικ για έναν ξένο.
Τρίτον, όποιος κλωνοποιήσει το μητρώο για να αναπαραγάγει την άρνηση θα βρει ότι μία καταχώριση υλοποίησης αναφοράς φέρει ακόμη αναγνωριστικό συνδεδεμένο με εμπορικό σήμα, από πριν το πέρασμα ουδετερότητας. Είναι αδρανές για την παραπάνω επίδειξη, που χρησιμοποιεί μόνο τα ουδέτερα αναγνωριστικά vercy.*, αλλά η εξουδετέρωση εκείνης της καταχώρισης και της ακμής της είναι κατονομασμένο ανοιχτό θέμα του μητρώου.
Καμία από αυτές τις επιφυλάξεις δεν αλλάζει την απάντηση στο τεστ. Ώσπου ένα τεκμήριο να μπορεί να αρνηθεί, είναι γλωσσάρι. Ιδού η άρνηση: κατονομασμένος έλεγχος, μη μηδενική έξοδος, κανονιστικός κανόνας και μια συγχώνευση που δεν γίνεται. Τρέξτε το μόνοι σας στο CI του μητρώου και στους επικυρωτές μοντέλων. Και τα δύο είναι δημόσια.