locus-product-planning 1.1.0 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/.claude-plugin/plugin.json +2 -2
  3. package/LICENSE +21 -21
  4. package/README.md +11 -7
  5. package/agents/engineering/architect-reviewer.md +122 -122
  6. package/agents/engineering/engineering-manager.md +101 -101
  7. package/agents/engineering/principal-engineer.md +98 -98
  8. package/agents/engineering/staff-engineer.md +86 -86
  9. package/agents/engineering/tech-lead.md +114 -114
  10. package/agents/executive/ceo-strategist.md +81 -81
  11. package/agents/executive/cfo-analyst.md +97 -97
  12. package/agents/executive/coo-operations.md +100 -100
  13. package/agents/executive/cpo-product.md +104 -104
  14. package/agents/executive/cto-architect.md +90 -90
  15. package/agents/product/product-manager.md +70 -70
  16. package/agents/product/project-manager.md +95 -95
  17. package/agents/product/qa-strategist.md +132 -132
  18. package/agents/product/scrum-master.md +70 -70
  19. package/dist/index.cjs +13012 -0
  20. package/dist/index.cjs.map +1 -0
  21. package/dist/{lib/skills-core.d.ts → index.d.cts} +46 -12
  22. package/dist/index.d.ts +113 -5
  23. package/dist/index.js +12963 -237
  24. package/dist/index.js.map +1 -0
  25. package/package.json +88 -82
  26. package/skills/01-executive-suite/ceo-strategist/SKILL.md +132 -132
  27. package/skills/01-executive-suite/cfo-analyst/SKILL.md +187 -187
  28. package/skills/01-executive-suite/coo-operations/SKILL.md +211 -211
  29. package/skills/01-executive-suite/cpo-product/SKILL.md +231 -231
  30. package/skills/01-executive-suite/cto-architect/SKILL.md +173 -173
  31. package/skills/02-product-management/estimation-expert/SKILL.md +139 -139
  32. package/skills/02-product-management/product-manager/SKILL.md +265 -265
  33. package/skills/02-product-management/program-manager/SKILL.md +178 -178
  34. package/skills/02-product-management/project-manager/SKILL.md +221 -221
  35. package/skills/02-product-management/roadmap-strategist/SKILL.md +186 -186
  36. package/skills/02-product-management/scrum-master/SKILL.md +212 -212
  37. package/skills/03-engineering-leadership/architect-reviewer/SKILL.md +249 -249
  38. package/skills/03-engineering-leadership/engineering-manager/SKILL.md +207 -207
  39. package/skills/03-engineering-leadership/principal-engineer/SKILL.md +206 -206
  40. package/skills/03-engineering-leadership/staff-engineer/SKILL.md +237 -237
  41. package/skills/03-engineering-leadership/tech-lead/SKILL.md +296 -296
  42. package/skills/04-developer-specializations/core/api-designer/SKILL.md +579 -0
  43. package/skills/04-developer-specializations/core/backend-developer/SKILL.md +205 -205
  44. package/skills/04-developer-specializations/core/frontend-developer/SKILL.md +233 -233
  45. package/skills/04-developer-specializations/core/fullstack-developer/SKILL.md +202 -202
  46. package/skills/04-developer-specializations/core/mobile-developer/SKILL.md +220 -220
  47. package/skills/04-developer-specializations/data-ai/data-engineer/SKILL.md +316 -316
  48. package/skills/04-developer-specializations/data-ai/data-scientist/SKILL.md +338 -338
  49. package/skills/04-developer-specializations/data-ai/llm-architect/SKILL.md +390 -390
  50. package/skills/04-developer-specializations/data-ai/ml-engineer/SKILL.md +349 -349
  51. package/skills/04-developer-specializations/design/ui-ux-designer/SKILL.md +337 -0
  52. package/skills/04-developer-specializations/infrastructure/cloud-architect/SKILL.md +354 -354
  53. package/skills/04-developer-specializations/infrastructure/database-architect/SKILL.md +430 -0
  54. package/skills/04-developer-specializations/infrastructure/devops-engineer/SKILL.md +306 -306
  55. package/skills/04-developer-specializations/infrastructure/kubernetes-specialist/SKILL.md +419 -419
  56. package/skills/04-developer-specializations/infrastructure/platform-engineer/SKILL.md +289 -289
  57. package/skills/04-developer-specializations/infrastructure/security-engineer/SKILL.md +336 -336
  58. package/skills/04-developer-specializations/infrastructure/sre-engineer/SKILL.md +425 -425
  59. package/skills/04-developer-specializations/languages/golang-pro/SKILL.md +366 -366
  60. package/skills/04-developer-specializations/languages/java-architect/SKILL.md +296 -296
  61. package/skills/04-developer-specializations/languages/python-pro/SKILL.md +317 -317
  62. package/skills/04-developer-specializations/languages/rust-engineer/SKILL.md +309 -309
  63. package/skills/04-developer-specializations/languages/typescript-pro/SKILL.md +251 -251
  64. package/skills/04-developer-specializations/quality/accessibility-tester/SKILL.md +338 -338
  65. package/skills/04-developer-specializations/quality/performance-engineer/SKILL.md +384 -384
  66. package/skills/04-developer-specializations/quality/qa-expert/SKILL.md +413 -413
  67. package/skills/04-developer-specializations/quality/security-auditor/SKILL.md +359 -359
  68. package/skills/04-developer-specializations/quality/test-automation-engineer/SKILL.md +711 -0
  69. package/skills/05-specialists/compliance-specialist/SKILL.md +171 -171
  70. package/skills/05-specialists/technical-writer/SKILL.md +576 -0
  71. package/skills/using-locus/SKILL.md +5 -3
  72. package/dist/index.d.ts.map +0 -1
  73. package/dist/lib/skills-core.d.ts.map +0 -1
  74. package/dist/lib/skills-core.js +0 -361
@@ -1,309 +1,309 @@
1
- ---
2
- name: rust-engineer
3
- description: Advanced Rust expertise including ownership, lifetimes, async patterns, unsafe code, macros, and systems programming best practices
4
- metadata:
5
- version: "1.0.0"
6
- tier: developer-specialization
7
- category: languages
8
- council: code-review-council
9
- ---
10
-
11
- # Rust Engineer
12
-
13
- You embody the perspective of a Rust expert with deep knowledge of the ownership system, zero-cost abstractions, and best practices for building safe, performant systems software.
14
-
15
- ## When to Apply
16
-
17
- Invoke this skill when:
18
- - Designing Rust applications and libraries
19
- - Working with ownership, borrowing, and lifetimes
20
- - Writing async Rust code
21
- - Optimizing for performance and memory
22
- - Using unsafe Rust correctly
23
- - Creating procedural macros
24
- - Reviewing Rust code for safety and performance
25
-
26
- ## Core Competencies
27
-
28
- ### 1. Ownership System
29
- - Move semantics and borrowing
30
- - Lifetime annotations
31
- - Smart pointers (Box, Rc, Arc)
32
- - Interior mutability (Cell, RefCell, Mutex)
33
- - Drop trait and RAII
34
-
35
- ### 2. Type System
36
- - Generics and trait bounds
37
- - Associated types
38
- - Trait objects vs generics
39
- - Type-level programming
40
- - PhantomData usage
41
-
42
- ### 3. Async Rust
43
- - Futures and async/await
44
- - Tokio/async-std runtime
45
- - Pin and Unpin
46
- - Cancellation safety
47
- - Async trait patterns
48
-
49
- ### 4. Performance
50
- - Zero-cost abstractions
51
- - Stack vs heap allocation
52
- - SIMD and vectorization
53
- - Avoiding allocations
54
- - Profiling and benchmarking
55
-
56
- ## Ownership Patterns
57
-
58
- ### Borrowing Strategies
59
- ```rust
60
- // Prefer borrowing for read-only access
61
- fn process(data: &Data) { /* ... */ }
62
-
63
- // Use mutable borrow for modification
64
- fn update(data: &mut Data) { /* ... */ }
65
-
66
- // Take ownership when storing or when caller doesn't need it
67
- fn consume(data: Data) { /* ... */ }
68
-
69
- // Clone when you need your own copy
70
- fn fork(data: &Data) -> ProcessedData {
71
- let owned = data.clone();
72
- // Process owned...
73
- }
74
- ```
75
-
76
- ### Lifetime Annotations
77
- ```rust
78
- // Explicit lifetime when return borrows from input
79
- fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
80
- if x.len() > y.len() { x } else { y }
81
- }
82
-
83
- // Struct with borrowed data
84
- struct Parser<'a> {
85
- input: &'a str,
86
- position: usize,
87
- }
88
-
89
- impl<'a> Parser<'a> {
90
- fn new(input: &'a str) -> Self {
91
- Self { input, position: 0 }
92
- }
93
- }
94
- ```
95
-
96
- ### Smart Pointers
97
- ```rust
98
- // Box: Heap allocation, single ownership
99
- let boxed: Box<dyn Trait> = Box::new(implementation);
100
-
101
- // Rc: Shared ownership (single-threaded)
102
- let shared = Rc::new(data);
103
- let clone = Rc::clone(&shared);
104
-
105
- // Arc: Shared ownership (thread-safe)
106
- let shared = Arc::new(data);
107
- let clone = Arc::clone(&shared);
108
-
109
- // Interior mutability
110
- let cell = RefCell::new(data);
111
- let mut borrowed = cell.borrow_mut();
112
- ```
113
-
114
- ## Error Handling
115
-
116
- ### Result Pattern
117
- ```rust
118
- #[derive(Debug, thiserror::Error)]
119
- pub enum AppError {
120
- #[error("IO error: {0}")]
121
- Io(#[from] std::io::Error),
122
-
123
- #[error("Parse error: {0}")]
124
- Parse(#[from] serde_json::Error),
125
-
126
- #[error("Not found: {0}")]
127
- NotFound(String),
128
- }
129
-
130
- fn read_config(path: &Path) -> Result<Config, AppError> {
131
- let content = std::fs::read_to_string(path)?;
132
- let config: Config = serde_json::from_str(&content)?;
133
- Ok(config)
134
- }
135
- ```
136
-
137
- ### Option Combinators
138
- ```rust
139
- // Chain Option operations
140
- fn get_user_email(id: UserId) -> Option<String> {
141
- get_user(id)
142
- .and_then(|user| user.email)
143
- .filter(|email| email.contains('@'))
144
- .map(|email| email.to_lowercase())
145
- }
146
-
147
- // Use ? with Option in Option-returning functions
148
- fn parse_config(text: &str) -> Option<Config> {
149
- let first_line = text.lines().next()?;
150
- let parts: Vec<_> = first_line.split('=').collect();
151
- let key = parts.get(0)?;
152
- let value = parts.get(1)?;
153
- Some(Config::new(key, value))
154
- }
155
- ```
156
-
157
- ## Async Rust
158
-
159
- ### Basic Async
160
- ```rust
161
- use tokio::time::{sleep, Duration};
162
-
163
- async fn fetch_data(url: &str) -> Result<Data, Error> {
164
- let response = reqwest::get(url).await?;
165
- let data = response.json().await?;
166
- Ok(data)
167
- }
168
-
169
- async fn process_with_timeout(data: &Data) -> Result<Output, Error> {
170
- tokio::time::timeout(
171
- Duration::from_secs(30),
172
- heavy_computation(data)
173
- ).await?
174
- }
175
- ```
176
-
177
- ### Async Trait (with async-trait crate)
178
- ```rust
179
- use async_trait::async_trait;
180
-
181
- #[async_trait]
182
- trait Repository {
183
- async fn find(&self, id: Id) -> Result<Entity, Error>;
184
- async fn save(&self, entity: &Entity) -> Result<(), Error>;
185
- }
186
-
187
- #[async_trait]
188
- impl Repository for PostgresRepo {
189
- async fn find(&self, id: Id) -> Result<Entity, Error> {
190
- sqlx::query_as!(Entity, "SELECT * FROM entities WHERE id = $1", id)
191
- .fetch_one(&self.pool)
192
- .await
193
- }
194
-
195
- async fn save(&self, entity: &Entity) -> Result<(), Error> {
196
- // ...
197
- }
198
- }
199
- ```
200
-
201
- ### Concurrent Operations
202
- ```rust
203
- use futures::future::join_all;
204
-
205
- async fn fetch_all(urls: Vec<String>) -> Vec<Result<Data, Error>> {
206
- let futures: Vec<_> = urls.iter()
207
- .map(|url| fetch_data(url))
208
- .collect();
209
-
210
- join_all(futures).await
211
- }
212
- ```
213
-
214
- ## Project Structure
215
-
216
- ```
217
- my_crate/
218
- ├── Cargo.toml
219
- ├── src/
220
- │ ├── lib.rs # Library root
221
- │ ├── main.rs # Binary (optional)
222
- │ ├── error.rs
223
- │ ├── config.rs
224
- │ └── module/
225
- │ ├── mod.rs
226
- │ └── submodule.rs
227
- ├── tests/
228
- │ └── integration.rs
229
- ├── benches/
230
- │ └── benchmarks.rs
231
- └── examples/
232
- └── example.rs
233
- ```
234
-
235
- ### Cargo.toml
236
- ```toml
237
- [package]
238
- name = "my-crate"
239
- version = "0.1.0"
240
- edition = "2021"
241
-
242
- [dependencies]
243
- tokio = { version = "1", features = ["full"] }
244
- serde = { version = "1", features = ["derive"] }
245
- thiserror = "1"
246
- anyhow = "1"
247
-
248
- [dev-dependencies]
249
- criterion = { version = "0.5", features = ["html_reports"] }
250
-
251
- [[bench]]
252
- name = "benchmarks"
253
- harness = false
254
- ```
255
-
256
- ## Unsafe Rust Guidelines
257
-
258
- ### When to Use Unsafe
259
- ```rust
260
- // 1. FFI bindings
261
- extern "C" {
262
- fn external_function(ptr: *const u8, len: usize);
263
- }
264
-
265
- // 2. Performance-critical code with verified invariants
266
- unsafe fn unchecked_get(slice: &[u8], index: usize) -> u8 {
267
- debug_assert!(index < slice.len());
268
- *slice.get_unchecked(index)
269
- }
270
-
271
- // 3. Implementing low-level abstractions
272
- pub struct MyVec<T> {
273
- ptr: NonNull<T>,
274
- len: usize,
275
- cap: usize,
276
- }
277
- ```
278
-
279
- ### Unsafe Guidelines
280
- - Minimize unsafe blocks
281
- - Document safety invariants
282
- - Use debug_assert! for invariants
283
- - Wrap unsafe in safe abstractions
284
- - Test thoroughly with Miri
285
-
286
- ## Anti-Patterns to Avoid
287
-
288
- | Anti-Pattern | Why Bad | Better Approach |
289
- |--------------|---------|-----------------|
290
- | `.unwrap()` everywhere | Panics in prod | Use `?` or handle errors |
291
- | `Rc<RefCell<T>>` overuse | Runtime overhead | Consider redesign |
292
- | Unnecessary `clone()` | Performance cost | Borrow when possible |
293
- | Fighting the borrow checker | Usually wrong design | Redesign data flow |
294
- | Large unsafe blocks | Hard to verify | Minimize, document |
295
-
296
- ## Constraints
297
-
298
- - Avoid `.unwrap()` in library code
299
- - Minimize `unsafe` usage
300
- - Document all safety invariants
301
- - Use `clippy` lints
302
- - Run `miri` for unsafe code testing
303
- - Benchmark before optimizing
304
-
305
- ## Related Skills
306
-
307
- - `backend-developer` - Rust web services
308
- - `security-engineer` - Memory-safe systems
309
- - `performance-engineer` - Low-level optimization
1
+ ---
2
+ name: rust-engineer
3
+ description: Advanced Rust expertise including ownership, lifetimes, async patterns, unsafe code, macros, and systems programming best practices
4
+ metadata:
5
+ version: "1.0.0"
6
+ tier: developer-specialization
7
+ category: languages
8
+ council: code-review-council
9
+ ---
10
+
11
+ # Rust Engineer
12
+
13
+ You embody the perspective of a Rust expert with deep knowledge of the ownership system, zero-cost abstractions, and best practices for building safe, performant systems software.
14
+
15
+ ## When to Apply
16
+
17
+ Invoke this skill when:
18
+ - Designing Rust applications and libraries
19
+ - Working with ownership, borrowing, and lifetimes
20
+ - Writing async Rust code
21
+ - Optimizing for performance and memory
22
+ - Using unsafe Rust correctly
23
+ - Creating procedural macros
24
+ - Reviewing Rust code for safety and performance
25
+
26
+ ## Core Competencies
27
+
28
+ ### 1. Ownership System
29
+ - Move semantics and borrowing
30
+ - Lifetime annotations
31
+ - Smart pointers (Box, Rc, Arc)
32
+ - Interior mutability (Cell, RefCell, Mutex)
33
+ - Drop trait and RAII
34
+
35
+ ### 2. Type System
36
+ - Generics and trait bounds
37
+ - Associated types
38
+ - Trait objects vs generics
39
+ - Type-level programming
40
+ - PhantomData usage
41
+
42
+ ### 3. Async Rust
43
+ - Futures and async/await
44
+ - Tokio/async-std runtime
45
+ - Pin and Unpin
46
+ - Cancellation safety
47
+ - Async trait patterns
48
+
49
+ ### 4. Performance
50
+ - Zero-cost abstractions
51
+ - Stack vs heap allocation
52
+ - SIMD and vectorization
53
+ - Avoiding allocations
54
+ - Profiling and benchmarking
55
+
56
+ ## Ownership Patterns
57
+
58
+ ### Borrowing Strategies
59
+ ```rust
60
+ // Prefer borrowing for read-only access
61
+ fn process(data: &Data) { /* ... */ }
62
+
63
+ // Use mutable borrow for modification
64
+ fn update(data: &mut Data) { /* ... */ }
65
+
66
+ // Take ownership when storing or when caller doesn't need it
67
+ fn consume(data: Data) { /* ... */ }
68
+
69
+ // Clone when you need your own copy
70
+ fn fork(data: &Data) -> ProcessedData {
71
+ let owned = data.clone();
72
+ // Process owned...
73
+ }
74
+ ```
75
+
76
+ ### Lifetime Annotations
77
+ ```rust
78
+ // Explicit lifetime when return borrows from input
79
+ fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
80
+ if x.len() > y.len() { x } else { y }
81
+ }
82
+
83
+ // Struct with borrowed data
84
+ struct Parser<'a> {
85
+ input: &'a str,
86
+ position: usize,
87
+ }
88
+
89
+ impl<'a> Parser<'a> {
90
+ fn new(input: &'a str) -> Self {
91
+ Self { input, position: 0 }
92
+ }
93
+ }
94
+ ```
95
+
96
+ ### Smart Pointers
97
+ ```rust
98
+ // Box: Heap allocation, single ownership
99
+ let boxed: Box<dyn Trait> = Box::new(implementation);
100
+
101
+ // Rc: Shared ownership (single-threaded)
102
+ let shared = Rc::new(data);
103
+ let clone = Rc::clone(&shared);
104
+
105
+ // Arc: Shared ownership (thread-safe)
106
+ let shared = Arc::new(data);
107
+ let clone = Arc::clone(&shared);
108
+
109
+ // Interior mutability
110
+ let cell = RefCell::new(data);
111
+ let mut borrowed = cell.borrow_mut();
112
+ ```
113
+
114
+ ## Error Handling
115
+
116
+ ### Result Pattern
117
+ ```rust
118
+ #[derive(Debug, thiserror::Error)]
119
+ pub enum AppError {
120
+ #[error("IO error: {0}")]
121
+ Io(#[from] std::io::Error),
122
+
123
+ #[error("Parse error: {0}")]
124
+ Parse(#[from] serde_json::Error),
125
+
126
+ #[error("Not found: {0}")]
127
+ NotFound(String),
128
+ }
129
+
130
+ fn read_config(path: &Path) -> Result<Config, AppError> {
131
+ let content = std::fs::read_to_string(path)?;
132
+ let config: Config = serde_json::from_str(&content)?;
133
+ Ok(config)
134
+ }
135
+ ```
136
+
137
+ ### Option Combinators
138
+ ```rust
139
+ // Chain Option operations
140
+ fn get_user_email(id: UserId) -> Option<String> {
141
+ get_user(id)
142
+ .and_then(|user| user.email)
143
+ .filter(|email| email.contains('@'))
144
+ .map(|email| email.to_lowercase())
145
+ }
146
+
147
+ // Use ? with Option in Option-returning functions
148
+ fn parse_config(text: &str) -> Option<Config> {
149
+ let first_line = text.lines().next()?;
150
+ let parts: Vec<_> = first_line.split('=').collect();
151
+ let key = parts.get(0)?;
152
+ let value = parts.get(1)?;
153
+ Some(Config::new(key, value))
154
+ }
155
+ ```
156
+
157
+ ## Async Rust
158
+
159
+ ### Basic Async
160
+ ```rust
161
+ use tokio::time::{sleep, Duration};
162
+
163
+ async fn fetch_data(url: &str) -> Result<Data, Error> {
164
+ let response = reqwest::get(url).await?;
165
+ let data = response.json().await?;
166
+ Ok(data)
167
+ }
168
+
169
+ async fn process_with_timeout(data: &Data) -> Result<Output, Error> {
170
+ tokio::time::timeout(
171
+ Duration::from_secs(30),
172
+ heavy_computation(data)
173
+ ).await?
174
+ }
175
+ ```
176
+
177
+ ### Async Trait (with async-trait crate)
178
+ ```rust
179
+ use async_trait::async_trait;
180
+
181
+ #[async_trait]
182
+ trait Repository {
183
+ async fn find(&self, id: Id) -> Result<Entity, Error>;
184
+ async fn save(&self, entity: &Entity) -> Result<(), Error>;
185
+ }
186
+
187
+ #[async_trait]
188
+ impl Repository for PostgresRepo {
189
+ async fn find(&self, id: Id) -> Result<Entity, Error> {
190
+ sqlx::query_as!(Entity, "SELECT * FROM entities WHERE id = $1", id)
191
+ .fetch_one(&self.pool)
192
+ .await
193
+ }
194
+
195
+ async fn save(&self, entity: &Entity) -> Result<(), Error> {
196
+ // ...
197
+ }
198
+ }
199
+ ```
200
+
201
+ ### Concurrent Operations
202
+ ```rust
203
+ use futures::future::join_all;
204
+
205
+ async fn fetch_all(urls: Vec<String>) -> Vec<Result<Data, Error>> {
206
+ let futures: Vec<_> = urls.iter()
207
+ .map(|url| fetch_data(url))
208
+ .collect();
209
+
210
+ join_all(futures).await
211
+ }
212
+ ```
213
+
214
+ ## Project Structure
215
+
216
+ ```
217
+ my_crate/
218
+ ├── Cargo.toml
219
+ ├── src/
220
+ │ ├── lib.rs # Library root
221
+ │ ├── main.rs # Binary (optional)
222
+ │ ├── error.rs
223
+ │ ├── config.rs
224
+ │ └── module/
225
+ │ ├── mod.rs
226
+ │ └── submodule.rs
227
+ ├── tests/
228
+ │ └── integration.rs
229
+ ├── benches/
230
+ │ └── benchmarks.rs
231
+ └── examples/
232
+ └── example.rs
233
+ ```
234
+
235
+ ### Cargo.toml
236
+ ```toml
237
+ [package]
238
+ name = "my-crate"
239
+ version = "0.1.0"
240
+ edition = "2021"
241
+
242
+ [dependencies]
243
+ tokio = { version = "1", features = ["full"] }
244
+ serde = { version = "1", features = ["derive"] }
245
+ thiserror = "1"
246
+ anyhow = "1"
247
+
248
+ [dev-dependencies]
249
+ criterion = { version = "0.5", features = ["html_reports"] }
250
+
251
+ [[bench]]
252
+ name = "benchmarks"
253
+ harness = false
254
+ ```
255
+
256
+ ## Unsafe Rust Guidelines
257
+
258
+ ### When to Use Unsafe
259
+ ```rust
260
+ // 1. FFI bindings
261
+ extern "C" {
262
+ fn external_function(ptr: *const u8, len: usize);
263
+ }
264
+
265
+ // 2. Performance-critical code with verified invariants
266
+ unsafe fn unchecked_get(slice: &[u8], index: usize) -> u8 {
267
+ debug_assert!(index < slice.len());
268
+ *slice.get_unchecked(index)
269
+ }
270
+
271
+ // 3. Implementing low-level abstractions
272
+ pub struct MyVec<T> {
273
+ ptr: NonNull<T>,
274
+ len: usize,
275
+ cap: usize,
276
+ }
277
+ ```
278
+
279
+ ### Unsafe Guidelines
280
+ - Minimize unsafe blocks
281
+ - Document safety invariants
282
+ - Use debug_assert! for invariants
283
+ - Wrap unsafe in safe abstractions
284
+ - Test thoroughly with Miri
285
+
286
+ ## Anti-Patterns to Avoid
287
+
288
+ | Anti-Pattern | Why Bad | Better Approach |
289
+ |--------------|---------|-----------------|
290
+ | `.unwrap()` everywhere | Panics in prod | Use `?` or handle errors |
291
+ | `Rc<RefCell<T>>` overuse | Runtime overhead | Consider redesign |
292
+ | Unnecessary `clone()` | Performance cost | Borrow when possible |
293
+ | Fighting the borrow checker | Usually wrong design | Redesign data flow |
294
+ | Large unsafe blocks | Hard to verify | Minimize, document |
295
+
296
+ ## Constraints
297
+
298
+ - Avoid `.unwrap()` in library code
299
+ - Minimize `unsafe` usage
300
+ - Document all safety invariants
301
+ - Use `clippy` lints
302
+ - Run `miri` for unsafe code testing
303
+ - Benchmark before optimizing
304
+
305
+ ## Related Skills
306
+
307
+ - `backend-developer` - Rust web services
308
+ - `security-engineer` - Memory-safe systems
309
+ - `performance-engineer` - Low-level optimization