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
//! Distributed overrides — traits, types, and `FrontmatterPatch`.
//!
//! ## Design
//!
//! An override is a metadata modification for a note, scoped to a particular context
//! (`OverrideScope`) and stored in the generic `note_overrides` table.
//!
//! ### Traits
//!
//! - `Overridable`: Associated Types trait (Iterator/Future pattern).
//! `type Patch` = delta to apply; `type Output` = type resulting from resolution.
//! - `OverridePayload`: storage contract for any override payload (TOML embed + discriminant).
//!
//! ### FrontmatterPatch
//!
//! `NoteMetadataOverride` lives in `gradatum-vault` and implements
//! `Overridable<Patch = FrontmatterPatch, Output = Frontmatter>`.
//! `FrontmatterPatch` lives here because both `gradatum-vault` and `gradatum-curator` construct it.
//!
//! ## Design Decisions
//!
//! - Associated Types for `Overridable` (composition-friendly, idiomatic Rust)
//! - One active override per `(note, scope, type)` + generic table + `OverridePayload` trait
//! - TOML-embedded schema registry
use ;
use ;
use crateAuthorRef;
use crateSchemaVersion;
use crateNoteId;
use crateOverrideScope;
/// Common metadata for any override — stored in dedicated columns in `note_overrides`.
///
/// The payload (concrete struct) is serialised as TOML in the `payload_toml` column
/// and identified by (`override_type`, `schema_version`).
/// Override resolution trait — composition via Associated Types.
///
/// Pattern identical to `Iterator` (`type Item`) and `Future` (`type Output`):
/// downstream crates can constrain `T: Overridable<Patch = FrontmatterPatch>` without
/// naming the concrete override type.
///
/// ## Reference implementation
///
/// `gradatum-vault::NoteMetadataOverride`:
/// ```text
/// impl Overridable for NoteMetadataOverride {
/// type Patch = FrontmatterPatch;
/// type Output = Frontmatter;
/// fn resolve(base: &Frontmatter, patch: &FrontmatterPatch) -> Frontmatter { … }
/// }
/// ```
/// Storage contract for an override payload in the `note_overrides` table.
///
/// Every override payload struct implements this trait to register with
/// the schema registry and round-trip through TOML.
///
/// ## Implementation
///
/// ```rust,ignore
/// impl OverridePayload for NoteMetadataOverride {
/// const OVERRIDE_TYPE: &'static str = "metadata";
/// const SCHEMA_VERSION: SchemaVersion = 1;
/// }
/// ```
/// Metadata patch for `NoteMetadataOverride`.
///
/// All fields are optional — only present fields are applied during resolution.
/// Enables partial patches without re-specifying the entire frontmatter.
///
/// Lives in `gradatum-core` (not `gradatum-vault`) because:
/// - `gradatum-vault` constructs it when writing overrides.
/// - `gradatum-curator` constructs it during categorisation decisions.
/// - Avoids a `curator → vault` dependency (anti-cycle).