1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
//! Override distribués — traits + types + FrontmatterPatch.
//!
//! Spec ref : `docs/superpowers/specs/2026-05-03-phase1-design-gradatum-core.md` §2.8.
//!
//! ## Design
//!
//! Un override est une modification de métadonnée d'une note, scopée à un contexte
//! particulier (`OverrideScope`) et stockée dans la table générique `note_overrides`.
//!
//! ### Traits
//!
//! - `Overridable` : trait à Associated Types (pattern Iterator/Future) — décision Q1/B2.
//! `type Patch` = delta à appliquer ; `type Output` = type résultant de la résolution.
//! - `OverridePayload` : contrat de stockage pour tout payload override (TOML embed + discriminant).
//!
//! ### FrontmatterPatch
//!
//! Le seul payload Phase 1 — `NoteMetadataOverride` vit dans `gradatum-vault` et implémente
//! `Overridable<Patch = FrontmatterPatch, Output = Frontmatter>`.
//! `FrontmatterPatch` est ici parce que `gradatum-vault` ET `gradatum-curator` le construisent.
//!
//! ## Décisions
//!
//! - Q1/B2 : Associated Types (composition-friendly, idiomatic Rust)
//! - Q7/B20 : 1 override actif par `(note, scope, type)` + table générique + trait `OverridePayload`
//! - §2.14 : schéma registry TOML embedded
use ;
use ;
use crateAuthorRef;
use crateSchemaVersion;
use crateNoteId;
use crateOverrideScope;
/// Métadonnées communes à tout override — stockées en colonnes dédiées dans `note_overrides`.
///
/// Le payload (struct concrète) est sérialisé en TOML dans la colonne `payload_toml`
/// et identifié par (`override_type`, `schema_version`).
/// Trait de résolution d'override — composition par Associated Types.
///
/// Décision Q1/B2 brainstorming the maintainer 2026-05-03.
///
/// Pattern identique à `Iterator` (`type Item`) et `Future` (`type Output`) :
/// les crates aval peuvent contraindre `T: Overridable<Patch = FrontmatterPatch>` sans
/// mentionner le type concret d'override.
///
/// ## Implémentation attendue (Phase 1)
///
/// `gradatum-vault::NoteMetadataOverride` :
/// ```text
/// impl Overridable for NoteMetadataOverride {
/// type Patch = FrontmatterPatch;
/// type Output = Frontmatter;
/// fn resolve(base: &Frontmatter, patch: &FrontmatterPatch) -> Frontmatter { … }
/// }
/// ```
/// Contrat de stockage pour un payload override dans la table `note_overrides`.
///
/// Décision Q7/B20 — toute struct de payload override implémente ce trait pour
/// s'enregistrer dans le schema registry et se round-tripper via TOML.
///
/// ## Implémentation
///
/// ```rust,ignore
/// impl OverridePayload for NoteMetadataOverride {
/// const OVERRIDE_TYPE: &'static str = "metadata";
/// const SCHEMA_VERSION: SchemaVersion = 1;
/// }
/// ```
/// Patch de métadonnées pour `NoteMetadataOverride` (seul override Phase 1).
///
/// Tous les champs sont optionnels — seuls les champs présents sont appliqués lors
/// de la résolution. Permet des patches partiels sans re-spécifier la totalité du frontmatter.
///
/// Vit dans `gradatum-core` (pas dans `gradatum-vault`) parce que :
/// - `gradatum-vault` le construit lors de l'écriture d'overrides.
/// - `gradatum-curator` le construit lors de ses décisions de catégorisation.
/// - Évite une dépendance `curator → vault` (anti-cycle).