Skip to main content

agent_doc_element_unknown/
lib.rs

1//! Fallback descriptor for elements not defined by code or plugins.
2//!
3//! This descriptor is intentionally conservative. It lets a caller classify an
4//! unregistered `agent:*` component as a known safety shape, but it does not
5//! grant semantic mutation rights. Until a plugin registers a specific
6//! descriptor, unknown element content is operator-authoritative and merge-only.
7//!
8//! `__unknown__` is an internal sentinel name, not a document marker. Do not
9//! reserve `agent:unknown`; a plugin may define that component normally later.
10
11use agent_doc_element::{
12    ElementAuthority, ElementCompositionRole, ElementDescriptor, ElementRealtimeModel,
13    ElementSchedulingRole, ElementShape, ElementSource, ElementWritePolicy,
14};
15
16pub const UNKNOWN_FALLBACK_NAME: &str = "__unknown__";
17
18pub const DESCRIPTOR: ElementDescriptor = ElementDescriptor {
19    name: UNKNOWN_FALLBACK_NAME,
20    aliases: &[],
21    source: ElementSource::BuiltIn,
22    shape: ElementShape::Component,
23    authority: ElementAuthority::SharedOperatorAuthoritative,
24    write_policy: ElementWritePolicy::MergeOnly,
25    scheduling_role: ElementSchedulingRole::None,
26    realtime_model: ElementRealtimeModel::Unknown,
27    composition_role: ElementCompositionRole::LocalOnly,
28    realtime: true,
29};
30
31pub fn descriptor() -> ElementDescriptor {
32    DESCRIPTOR
33}
34
35pub fn descriptor_for_unknown_name(_name: &str) -> ElementDescriptor {
36    DESCRIPTOR
37}
38
39#[cfg(test)]
40mod tests {
41    use super::*;
42
43    #[test]
44    fn unknown_fallback_is_operator_authoritative_merge_only() {
45        let descriptor = descriptor_for_unknown_name("kanban");
46        assert_eq!(descriptor.name, "__unknown__");
47        assert_eq!(
48            descriptor.authority,
49            ElementAuthority::SharedOperatorAuthoritative
50        );
51        assert_eq!(descriptor.write_policy, ElementWritePolicy::MergeOnly);
52        assert_eq!(descriptor.realtime_model, ElementRealtimeModel::Unknown);
53    }
54}