pub struct Record {Show 18 fields
pub key: String,
pub value: String,
pub category: Category,
pub priority: Priority,
pub tags: Vec<String>,
pub created_at: u64,
pub updated_at: u64,
pub ref_url: Option<String>,
pub staleness: StalenessScore,
pub lifecycle: RecordLifecycle,
pub version: RecordVersion,
pub quality: QualityScore,
pub access_count: u32,
pub last_accessed: u64,
pub source: RecordSource,
pub confidence: ConfidenceScore,
pub gap_analysis_score: f32,
pub payload: Option<Value>,
}Expand description
The universal store entry. All categories (gotcha, file, decision, …)
share this struct. Category-specific detail is in value (human-readable)
and in the typed FileRecord / GotchaRecord for Layer 0/1 fast paths.
Does not derive PartialEq — see module-level float equality note.
Key namespacing:
gotcha:<slug> file:<path> decision:<slug>
stage:current dep:<ecosystem>:<name> dev_note:<slug>Fields§
§key: StringNamespaced key — primary storage identifier and graph node key.
value: StringHuman-readable content: purpose (file), rule (gotcha), body (decision). Indexed by tantivy for full-text search.
category: Category§priority: PriorityFree-form tags for search and filtering.
created_at: u64Unix timestamp (seconds) when this record was first created.
updated_at: u64Unix timestamp (seconds) of the last write.
ref_url: Option<String>URL to a PR, issue, doc, or incident that explains this record.
staleness: StalenessScore§lifecycle: RecordLifecycle§version: RecordVersionVersioning for Lamport-clock conflict resolution (see RecordVersion).
Use record.version.device_id to identify the authoring device.
quality: QualityScore§access_count: u32How many times this record has been read via mem_get or hooks.
last_accessed: u64Unix timestamp (seconds) of the last access.
source: RecordSource§confidence: ConfidenceScore§gap_analysis_score: f32Pre-computed gap risk score: change_frequency × (1 - coverage_score).
payload: Option<Value>Structured per-category payload — typed data in JSON form.
file:*→FileRecordgotcha:*→GotchaRecorddecision:*→ serialized decision body (TBD Layer 1)analytics:*,session:*→ arbitrary JSON blob (DailyAgg, StaleReviewPayload, …)
value is always the human-readable text: rule, purpose, body.
payload carries all structured fields so read sites never parse value as JSON.
Stored as-is in MessagePack (serde_json::Value → msgpack map).
Implementations§
Source§impl Record
impl Record
Sourcepub fn device_id(&self) -> DeviceId
pub fn device_id(&self) -> DeviceId
The device that last wrote this record.
Convenience accessor — delegates to self.version.device_id.
Sourcepub fn payload_as<T: DeserializeOwned>(&self) -> Option<T>
pub fn payload_as<T: DeserializeOwned>(&self) -> Option<T>
Deserialize the structured payload into a typed value.
Returns None when payload is absent or the JSON shape does not match T.
Always prefer this over serde_json::from_str(&self.value).
Sourcepub fn layer0_file_stub(
key: impl Into<String>,
device_id: DeviceId,
logical_clock: u64,
wall_clock: u64,
) -> Self
pub fn layer0_file_stub( key: impl Into<String>, device_id: DeviceId, logical_clock: u64, wall_clock: u64, ) -> Self
Construct a layer-0 file stub for file:<path>.
This is the persisted companion to FileRecord::layer0_stub.
Layer 0 file records start empty on purpose/value, but still get the
suppressed quality default so they never surface in Claude-facing
injection paths until enrichment raises them.
Trait Implementations§
Source§impl<'de> Deserialize<'de> for Record
impl<'de> Deserialize<'de> for Record
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Auto Trait Implementations§
impl Freeze for Record
impl RefUnwindSafe for Record
impl Send for Record
impl Sync for Record
impl Unpin for Record
impl UnsafeUnpin for Record
impl UnwindSafe for Record
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> DeserializeOwned for Twhere
T: for<'de> Deserialize<'de>,
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be
downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further
downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> DowncastSend for T
impl<T> DowncastSend for T
Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
impl<T> Fruit for T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more