upleb.uk

Public git repos — served from a NIP-34 GRASP relay at git.upleb.uk

summaryrefslogtreecommitdiff
path: root/grasp-audit/src
diff options
context:
space:
mode:
authorDanConwayDev <DanConwayDev@protonmail.com>2025-11-04 08:50:29 +0000
committerDanConwayDev <DanConwayDev@protonmail.com>2025-11-04 09:23:48 +0000
commitb3031800cd95601c2d9cd2d24034364d1496b073 (patch)
treede91247ecaef26dd59d209ea2d7df3e1772a4c62 /grasp-audit/src
parent15d3b0f859c2c5bc74ac602159c26fbccf475cb4 (diff)
Migrate to standard NIP-01 't' tags for audit events
- Changed from custom single-letter tags (g, r, c) to standard 't' tags - Tag values now use descriptive prefixes: - 'grasp-audit-test-event' (marker tag) - 'audit-{run-id}' (run identification) - 'audit-cleanup-after-{timestamp}' (cleanup time) - Updated audit_tags() in src/audit.rs - Updated query filtering in src/client.rs - Updated all tests to verify 't' tag usage - All tests passing: 12/12 unit tests, 1/1 integration test - CLI verified working with new tag scheme This follows standard Nostr conventions and avoids potential conflicts with other uses of single-letter tags. The 't' tag is specifically designed for categorization/topics per NIP-01.
Diffstat (limited to 'grasp-audit/src')
-rw-r--r--grasp-audit/src/audit.rs54
-rw-r--r--grasp-audit/src/client.rs13
2 files changed, 28 insertions, 39 deletions
diff --git a/grasp-audit/src/audit.rs b/grasp-audit/src/audit.rs
index e902ace..fad4bf2 100644
--- a/grasp-audit/src/audit.rs
+++ b/grasp-audit/src/audit.rs
@@ -65,22 +65,21 @@ impl AuditConfig {
65 pub fn audit_tags(&self) -> Vec<Tag> { 65 pub fn audit_tags(&self) -> Vec<Tag> {
66 use nostr_sdk::prelude::{Alphabet, SingleLetterTag}; 66 use nostr_sdk::prelude::{Alphabet, SingleLetterTag};
67 67
68 // Use "t" tags for categorization (standard NIP-01 hashtag type)
69 let t_tag = SingleLetterTag::lowercase(Alphabet::T);
70
68 vec![ 71 vec![
69 // Use single-letter tags for filtering support
70 // "g" = grasp-audit marker
71 Tag::custom( 72 Tag::custom(
72 TagKind::SingleLetter(SingleLetterTag::lowercase(Alphabet::G)), 73 TagKind::SingleLetter(t_tag),
73 vec!["grasp-audit"] 74 vec!["grasp-audit-test-event"]
74 ), 75 ),
75 // "r" = audit run ID
76 Tag::custom( 76 Tag::custom(
77 TagKind::SingleLetter(SingleLetterTag::lowercase(Alphabet::R)), 77 TagKind::SingleLetter(t_tag),
78 vec![self.run_id.clone()] 78 vec![format!("audit-{}", self.run_id)]
79 ), 79 ),
80 // "c" = cleanup timestamp
81 Tag::custom( 80 Tag::custom(
82 TagKind::SingleLetter(SingleLetterTag::lowercase(Alphabet::C)), 81 TagKind::SingleLetter(t_tag),
83 vec![self.cleanup_after.to_string()] 82 vec![format!("audit-cleanup-after-{}", self.cleanup_after.as_u64())]
84 ), 83 ),
85 ] 84 ]
86 } 85 }
@@ -159,35 +158,30 @@ mod tests {
159 158
160 assert_eq!(tags.len(), 3); 159 assert_eq!(tags.len(), 3);
161 160
162 let g_tag = SingleLetterTag::lowercase(Alphabet::G); 161 let t_tag = SingleLetterTag::lowercase(Alphabet::T);
163 let r_tag = SingleLetterTag::lowercase(Alphabet::R);
164 let c_tag = SingleLetterTag::lowercase(Alphabet::C);
165 162
166 // Check "g" tag (grasp-audit marker) 163 // All tags should be "t" tags (hashtags)
167 assert!(tags.iter().any(|t| { 164 for tag in &tags {
168 if let TagKind::SingleLetter(letter) = t.kind() { 165 if let TagKind::SingleLetter(letter) = tag.kind() {
169 letter == g_tag 166 assert_eq!(letter, t_tag);
170 } else { 167 } else {
171 false 168 panic!("Expected SingleLetter tag");
172 } 169 }
170 }
171
172 // Check for "t" tag with "grasp-audit-test-event"
173 assert!(tags.iter().any(|t| {
174 t.content() == Some("grasp-audit-test-event")
173 })); 175 }));
174 176
175 // Check "r" tag (audit run ID) 177 // Check for "t" tag with "audit-{run_id}"
176 assert!(tags.iter().any(|t| { 178 assert!(tags.iter().any(|t| {
177 if let TagKind::SingleLetter(letter) = t.kind() { 179 t.content().map(|c| c.starts_with("audit-ci-")).unwrap_or(false)
178 letter == r_tag
179 } else {
180 false
181 }
182 })); 180 }));
183 181
184 // Check "c" tag (cleanup timestamp) 182 // Check for "t" tag with "audit-cleanup-after-{timestamp}"
185 assert!(tags.iter().any(|t| { 183 assert!(tags.iter().any(|t| {
186 if let TagKind::SingleLetter(letter) = t.kind() { 184 t.content().map(|c| c.starts_with("audit-cleanup-after-")).unwrap_or(false)
187 letter == c_tag
188 } else {
189 false
190 }
191 })); 185 }));
192 } 186 }
193 187
diff --git a/grasp-audit/src/client.rs b/grasp-audit/src/client.rs
index d78b33c..4831d3f 100644
--- a/grasp-audit/src/client.rs
+++ b/grasp-audit/src/client.rs
@@ -95,16 +95,11 @@ impl AuditClient {
95 95
96 if self.config.mode == AuditMode::CI { 96 if self.config.mode == AuditMode::CI {
97 // In CI mode, only see our own audit events 97 // In CI mode, only see our own audit events
98 // Filter by "g" tag (grasp-audit marker) and "r" tag (run ID) 98 // Filter by "t" tags (hashtags)
99 let t_tag = SingleLetterTag::lowercase(Alphabet::T);
99 filter = filter 100 filter = filter
100 .custom_tag( 101 .custom_tag(t_tag, "grasp-audit-test-event")
101 SingleLetterTag::lowercase(Alphabet::G), 102 .custom_tag(t_tag, format!("audit-{}", self.config.run_id));
102 "grasp-audit"
103 )
104 .custom_tag(
105 SingleLetterTag::lowercase(Alphabet::R),
106 &self.config.run_id
107 );
108 } 103 }
109 // In Production mode, see all events (no filter modification) 104 // In Production mode, see all events (no filter modification)
110 105