diff options
| author | DanConwayDev <DanConwayDev@protonmail.com> | 2025-11-04 08:50:29 +0000 |
|---|---|---|
| committer | DanConwayDev <DanConwayDev@protonmail.com> | 2025-11-04 09:23:48 +0000 |
| commit | b3031800cd95601c2d9cd2d24034364d1496b073 (patch) | |
| tree | de91247ecaef26dd59d209ea2d7df3e1772a4c62 /grasp-audit/src | |
| parent | 15d3b0f859c2c5bc74ac602159c26fbccf475cb4 (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.rs | 54 | ||||
| -rw-r--r-- | grasp-audit/src/client.rs | 13 |
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 | ||