@martinffx/atelier 3.4.0 → 3.6.0

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.
@@ -10,8 +10,10 @@
10
10
 
11
11
  ## Statistics
12
12
  - Files reviewed: N
13
- - Findings: N Critical, N High, N Medium, N Low
13
+ - Findings: N blocking, N non-blocking (N issue, N suggestion, N nitpick)
14
+ - Issues by severity: N Critical, N High, N Medium, N Low
14
15
  - Pre-existing: N | Introduced: N
16
+ - Debated: N (upheld N, modified N, withdrawn N)
15
17
  - Honored decisions: N
16
18
 
17
19
  ## Unnecessary scope
@@ -30,34 +32,52 @@
30
32
 
31
33
  - {Changes needed so the SDD records the smaller result, or `None`}
32
34
 
33
- ## Critical (Fix before merge)
35
+ ## Blocking (fix before merge)
34
36
 
35
- ### {Finding Title}
37
+ ### issue (blocking, Critical): {Finding Title}
36
38
 
37
39
  - **Location**: `file:line`
40
+ - **Kind**: issue
41
+ - **Blocking**: Yes
38
42
  - **Severity**: Critical
39
43
  - **Pre-existing**: No
40
44
  - **Issue**: {What's wrong}
41
45
  - **Impact**: {Why this matters}
46
+ - **Debate**: {Author confirmed | Author disputed → Critic maintained → Judge upheld | …}
42
47
  - **Reasoning**:
43
48
  <details>
44
49
  <summary>Extended reasoning</summary>
45
- {Detailed explanation of why this was flagged}
50
+ {Detailed explanation, including the exchange}
46
51
  </details>
47
52
  - **Suggestion**: {How to fix}
48
53
  - **Requires user approval**: {Yes when the suggestion expands behavior or infrastructure; otherwise No}
54
+ - **Mechanical**: {Yes when the fix keeps behavior identical, stays local, and needs no judgment; otherwise No}
49
55
  - **Prior decision reopened**: {Why the recorded rationale no longer applies; omit when not applicable}
50
56
 
51
- ## High Priority
57
+ ## Non-blocking
52
58
 
53
- ### {Finding Title}
54
- {Same structure}
59
+ Issues ordered by severity, then suggestions, then nitpicks.
55
60
 
56
- ## Medium Priority
61
+ ### issue (High): {Finding Title}
57
62
  {Same structure}
58
63
 
59
- ## Low Priority
60
- {Same structure}
64
+ ### suggestion: {Finding Title}
65
+ {Same structure; no severity}
66
+
67
+ ### nitpick: {Finding Title}
68
+ {Location, Issue, Suggestion only}
69
+
70
+ ## Follow-ups
71
+
72
+ - {Valid findings outside this change: kind, location, one line}
73
+
74
+ ## Answered questions
75
+
76
+ - `{file:line}` {Question} → {Answer}
77
+
78
+ ## Withdrawn in debate
79
+
80
+ - `{id}` {Title} — {reason} (evidence: {code|test|sdd|intent|decision}; settled by {Critic concession | Judge})
61
81
 
62
82
  ## Positive Findings
63
83
 
@@ -68,33 +88,71 @@
68
88
  ## Honored Decisions
69
89
 
70
90
  - `{comment-file}:{line}` — {Concern}: {Short rationale and why it still applies}
91
+
92
+ ## Audit
93
+
94
+ <details>
95
+ <summary>Debate audit</summary>
96
+
97
+ - Working tree: {unchanged | changed — all `test` evidence voided}
98
+ - Turns: {per turn: commands run, re-runs matched / total, violations}
99
+ - Evidence voided: {what and why, or none}
100
+ - Unresolved: {ids of contested or unruled items, rendered in Blocking or Non-blocking, or none}
101
+ </details>
71
102
  ```
72
103
 
73
- Omit the **Honored Decisions** section when there are no honored decisions. Keep each entry to
74
- one compact bullet; do not repeat the full finding, impact, reasoning, or suggestion.
75
- Severity and pre-existing/introduced statistics count active findings only.
76
- Always render the four simplicity sections, using `None` when no evidence supports an item.
104
+ An unresolved item (Judge failed, or its decisive evidence was voided) renders in Blocking or
105
+ Non-blocking by its `blocking` value, with `**Debate**: contested, unruled` and both positions in
106
+ the reasoning. A nitpick's Debate field reads `Author took` or `Author left`.
107
+
108
+ Omit **Follow-ups**, **Answered questions**, **Withdrawn in debate**, **Honored Decisions** and
109
+ the nitpick group when they have no items. Keep **Audit** short: one line per turn.
110
+
111
+ Honored decisions are a compact bullet each; do not repeat the full finding. Severity and
112
+ pre-existing/introduced counts cover active findings only. Always render the four simplicity
113
+ sections, using `None` when no evidence supports an item.
114
+
115
+ `praise` findings appear only under Positive Findings.
77
116
 
78
117
  ---
79
118
 
80
119
  ## Inline Finding Format
81
120
 
82
- For each finding, provide inline comment style:
121
+ For each finding, provide inline comment style, prefixed with its kind so it pastes into a
122
+ PR comment:
83
123
 
84
124
  ```
85
- [{file}:{line}] {Finding Title}
86
- Severity: {Critical/High/Medium/Low}
125
+ [{file}:{line}] {kind} ({blocking|non-blocking}, {severity}): {Finding Title}
87
126
  Pre-existing: {Yes/No}
88
127
  Issue: {Brief description}
89
128
  Reasoning: {Why this matters}
90
129
  Suggestion: {Fix}
130
+ Debate: {outcome}
91
131
  Requires user approval: {Yes/No}
132
+ Mechanical: {Yes/No}
92
133
  Prior decision reopened: {Why the recorded rationale no longer applies; omit when not applicable}
93
134
  ```
94
135
 
136
+ Omit severity for anything that is not an issue.
137
+
95
138
  ---
96
139
 
97
- ## Severity Definitions
140
+ ## Kinds
141
+
142
+ | Kind | Meaning | Blocking? |
143
+ |------|---------|-----------|
144
+ | issue | Something is wrong or risky | Yes or no |
145
+ | suggestion | A better approach; the code works as written | Yes or no |
146
+ | question | The reviewer cannot tell; states what answer would make it an issue | Never until escalated |
147
+ | nitpick | Style or convention, backed by a documented rule | Never |
148
+ | praise | Worth keeping | Never |
149
+
150
+ `follow_up` marks a valid finding that is outside this change; it is listed under Follow-ups and
151
+ not fixed here.
152
+
153
+ ---
154
+
155
+ ## Severity Definitions (issues only)
98
156
 
99
157
  | Severity | When to use | Examples |
100
158
  |----------|------------|----------|
@@ -115,7 +173,7 @@ Prior decision reopened: {Why the recorded rationale no longer applies; omit whe
115
173
  **Marking pre-existing:**
116
174
  - Check if the line was modified in the current diff
117
175
  - If unchanged but flagged, mark as pre-existing
118
- - Pre-existing findings are informational, not blocking
176
+ - Pre-existing findings are informational and non-blocking
119
177
 
120
178
  ---
121
179
 
@@ -124,9 +182,10 @@ Prior decision reopened: {Why the recorded rationale no longer applies; omit whe
124
182
  Each finding includes a collapsible section with:
125
183
 
126
184
  1. **Why flagged**: What triggered the finding (pattern, heuristic, context)
127
- 2. **Verification**: How it was validated (static analysis, pattern match, context)
128
- 3. **Evidence**: Code snippets, references, or examples
129
- 4. **Alternative view**: If uncertain, what else to consider
185
+ 2. **Verification**: How it was validated (executed check, verified quote, static analysis)
186
+ 3. **Evidence**: Code snippets, check output, or references
187
+ 4. **Debate**: The Author's response, the Critic's rebuttal, and the Judge's ruling, when any
188
+ 5. **Alternative view**: If uncertain, what else to consider
130
189
 
131
190
  When a recorded decision is reopened, also identify the comment location and the evidence that
132
191
  invalidated its rationale or met its reconsideration condition.
@@ -138,13 +197,16 @@ Example:
138
197
 
139
198
  **Why flagged**: The `query` parameter is directly interpolated into SQL string without parameterization.
140
199
 
141
- **Verification**: Pattern match detected: `f"SELECT * FROM {table}"` - Python f-string in SQL context.
200
+ **Verification**: Verified quote at `src/db.py:42`; no parameter binding on the path (checked with `grep -n "execute(" src/db.py`).
142
201
 
143
- **Evidence**:
202
+ **Evidence**:
144
203
  ```python
145
204
  query = f"SELECT * FROM users WHERE id = {user_id}" # Line 42
146
205
  ```
147
206
 
207
+ **Debate**: Author disputed (claimed upstream validation); Critic maintained — validation at
208
+ `src/api.py:18` runs only on the legacy route. Judge upheld.
209
+
148
210
  **Alternative view**: If using a query builder or ORM, check if it handles escaping internally.
149
211
  </details>
150
212
  ```
@@ -161,8 +223,10 @@ Implements OAuth login flow with token refresh. Generally well-structured with p
161
223
 
162
224
  ## Statistics
163
225
  - Files reviewed: 1
164
- - Findings: 1 Critical, 1 High, 0 Medium, 2 Low
165
- - Pre-existing: 1 | Introduced: 3
226
+ - Findings: 1 blocking, 2 non-blocking (2 issue, 0 suggestion, 1 nitpick)
227
+ - Issues by severity: 1 Critical, 1 High, 0 Medium, 0 Low
228
+ - Pre-existing: 1 | Introduced: 2
229
+ - Debated: 2 (upheld 1, modified 0, withdrawn 1)
166
230
  - Honored decisions: 0
167
231
 
168
232
  ## Unnecessary scope
@@ -181,63 +245,80 @@ None
181
245
 
182
246
  - None
183
247
 
184
- ## Critical (Fix before merge)
248
+ ## Blocking (fix before merge)
185
249
 
186
- ### Token stored in localStorage
250
+ ### issue (blocking, Critical): Token stored in localStorage
187
251
 
188
252
  - **Location**: `src/auth/login.ts:45`
253
+ - **Kind**: issue
254
+ - **Blocking**: Yes
189
255
  - **Severity**: Critical
190
256
  - **Pre-existing**: No
191
257
  - **Issue**: Access token stored in localStorage, vulnerable to XSS
192
258
  - **Impact**: Any XSS vulnerability exposes user tokens
259
+ - **Debate**: Author disputed → Critic maintained → Judge upheld
193
260
  - **Reasoning**:
194
261
  <details>
195
262
  <summary>Extended reasoning</summary>
196
-
263
+
197
264
  **Why flagged**: localStorage is accessible to any JavaScript on the page.
198
-
199
- **Verification**: Direct localStorage API usage detected.
200
-
265
+
266
+ **Verification**: Verified quote at `src/auth/login.ts:45`.
267
+
201
268
  **Evidence**:
202
269
  ```typescript
203
270
  localStorage.setItem('accessToken', token); // Line 45
204
271
  ```
205
-
272
+
273
+ **Debate**: Author argued the CSP blocks inline scripts; Critic showed `script-src 'unsafe-inline'`
274
+ at `src/server.ts:9`. Judge upheld.
275
+
206
276
  **Alternative view**: If using httpOnly cookies is not possible, consider short-lived tokens with refresh rotation.
207
277
  </details>
208
278
  - **Suggestion**: Use httpOnly cookies or secure session storage
279
+ - **Requires user approval**: No
280
+ - **Mechanical**: No
209
281
 
210
- ## High Priority
282
+ ## Non-blocking
211
283
 
212
- ### Token validation on every request
284
+ ### issue (High): Token validation on every request
213
285
 
214
286
  - **Location**: `src/auth/middleware.ts:12`
215
287
  - **Severity**: High
216
288
  - **Pre-existing**: Yes
217
289
  - **Issue**: Token validated against auth server on every request
218
290
  - **Impact**: Adds 50-200ms latency per request
291
+ - **Debate**: Author confirmed
219
292
 
220
- ## Low Priority
221
-
222
- ### Missing JSDoc on public function
293
+ ### nitpick: Missing JSDoc on public function
223
294
 
224
295
  - **Location**: `src/auth/login.ts:23`
225
- - **Severity**: Low
226
- - **Pre-existing**: No
227
- - **Issue**: `validateToken` lacks documentation
296
+ - **Issue**: `validateToken` lacks documentation (repo rule: `docs/conventions.md` requires JSDoc on exports)
228
297
 
229
- ### Inconsistent naming: userId vs user_id
298
+ ## Answered questions
230
299
 
231
- - **Location**: `src/auth/login.ts:67`
232
- - **Severity**: Low
233
- - **Pre-existing**: Yes
234
- - **Issue**: Mixed snake_case and camelCase in same file
300
+ - `src/auth/login.ts:60` Why a 15-minute expiry? → `docs/auth.md:12` fixes it to match the refresh window.
301
+
302
+ ## Withdrawn in debate
303
+
304
+ - `f4` Inconsistent naming: userId vs user_id — Critic conceded: `.eslintrc` allows both (evidence: code; settled by Critic concession).
235
305
 
236
306
  ## Positive Findings
237
307
 
238
308
  - Clean separation of OAuth flow into dedicated functions
239
309
  - Proper error handling with typed error classes
240
310
  - Token refresh logic handles edge cases well
311
+
312
+ ## Audit
313
+
314
+ <details>
315
+ <summary>Debate audit</summary>
316
+
317
+ - Working tree: unchanged
318
+ - Turns: Author 3 commands, 1 re-run matched 1/1; Security rebuttal 1 command; Judge 0 commands
319
+ - Evidence voided: none
320
+ - Unresolved: none
321
+ </details>
241
322
  ```
242
323
 
243
324
  ---
@@ -250,3 +331,4 @@ None
250
331
  4. **Positive findings** help balance the review tone
251
332
  5. **Honored decisions** stay out of active severity counts and are summarized without restating the finding
252
333
  6. **Expansion findings** require user approval even when an SDD proposes the expansion
334
+ 7. **Blocking** means the change should not merge until resolved; spec-finish reads it directly
@@ -0,0 +1,345 @@
1
+ # Persona Catalog
2
+
3
+ Personas are the stances a Critic takes. This file defines *who*; the Critic role template in
4
+ [roles/critic.md](./roles/critic.md) defines *how* a persona is dispatched and what it returns.
5
+ [rq.md](./rq.md) and triage decide which personas run.
6
+
7
+ Persona names such as `Simplicity`, `Security`, `Correctness`, `Architecture` and
8
+ `PerformanceOperator` are prompt personas, not agent types. The step's kind of work, not the
9
+ persona name, selects the agent (see SKILL.md).
10
+
11
+ `Simplicity` runs on every review, once, and is never listed by triage. Triage picks the others.
12
+ Each entry gives the `{persona}`, `{focus_areas}`, `{impact_lens}`, any `{reviewer_notes}`, and the
13
+ skills the Critic should load (`{loads}`).
14
+
15
+ ## Concern-Type Reviewers
16
+
17
+ ### Simplicity
18
+
19
+ **Persona:** You are a Simplicity Reviewer. Find the smallest implementation that preserves the
20
+ requested behavior. Quality only: do not report bugs; Correctness owns those.
21
+
22
+ **Focus areas:**
23
+ - Unrequested behavior or infrastructure
24
+ - **Reuse**: for each new function, type, or helper in the diff, search the repository for an
25
+ existing one that does the same job before reporting; cite the existing symbol's file:line
26
+ - Interfaces, factories, runners, and harnesses with one consumer
27
+ - Custom code that replaces adequate framework or library behavior
28
+ - Tests created only because unnecessary layers were introduced
29
+ - **Altitude**: code at the wrong level of abstraction (low-level detail inlined in high-level
30
+ flow, pass-through methods, logic in the wrong layer)
31
+ - **Redundant work visible in the diff**: repeated computation, duplicate I/O or queries,
32
+ sequential work that is trivially parallel
33
+ - The smallest implementation that preserves the requested behavior
34
+
35
+ **Impact lens:** Scope or maintenance cost
36
+
37
+ **Notes:** Treat the SDD and loaded skills as evidence and guidance, not as authority to add
38
+ machinery. You may read repository files to verify reuse. Leave hot-path and scale analysis to
39
+ Performance, and abstraction design to Architecture; report only what the diff makes obvious.
40
+ Suggestion: what to delete, or the smallest viable alternative.
41
+
42
+ **Loads:** `ponytail`, `oracle-codebase-design`, and relevant language, framework, testing, and
43
+ architecture skills.
44
+
45
+ ### Security
46
+
47
+ **Persona:** You are a Security Reviewer analyzing code for security vulnerabilities.
48
+
49
+ **Focus areas:**
50
+ - Authentication and authorization flaws
51
+ - Injection vulnerabilities (SQL, command, XSS)
52
+ - Secrets in code (API keys, passwords, tokens)
53
+ - Surface area exposure
54
+ - Input validation gaps
55
+
56
+ **Impact lens:** Why this matters
57
+
58
+ **Loads:** Security, framework, and language-specific skills.
59
+
60
+ ### Performance
61
+
62
+ **Persona:** You are a Performance Reviewer analyzing code for performance issues.
63
+
64
+ **Focus areas:**
65
+ - Hot paths and bottlenecks
66
+ - Memory allocation patterns
67
+ - N+1 query problems
68
+ - Unnecessary computation
69
+ - Caching opportunities
70
+
71
+ **Impact lens:** Performance cost
72
+
73
+ **Loads:** Performance, framework, and language-specific skills.
74
+
75
+ ### Correctness
76
+
77
+ **Persona:** You are a Correctness Reviewer analyzing code for logic errors.
78
+
79
+ **Focus areas:**
80
+ - Logic errors and edge cases
81
+ - Error handling completeness
82
+ - Type soundness
83
+ - Null/undefined handling
84
+ - Boundary conditions
85
+
86
+ **Impact lens:** What breaks
87
+
88
+ **Loads:** Language-specific and testing skills.
89
+
90
+ ### Maintainability
91
+
92
+ **Persona:** You are a Maintainability Reviewer analyzing code quality.
93
+
94
+ **Focus areas:**
95
+ - Naming clarity
96
+ - Code complexity (cyclomatic, cognitive)
97
+ - Test coverage gaps
98
+ - Coupling and cohesion
99
+ - DRY violations
100
+ - Tests that reach past the interface
101
+ - Vague or inconsistent names
102
+
103
+ **Impact lens:** Maintainability cost
104
+
105
+ **Loads:** `oracle-codebase-design` and relevant testing, tooling, and language-specific pattern
106
+ skills.
107
+
108
+ ### Architecture
109
+
110
+ **Persona:** You are an Architecture Reviewer analyzing structural issues.
111
+
112
+ **Focus areas:**
113
+ - Boundary violations
114
+ - Responsibility leakage
115
+ - Dependency direction
116
+ - Layer separation
117
+ - SOLID violations
118
+ - Shallow modules and pass-throughs, information leakage across modules
119
+ - Untrusted input crossing a seam unparsed, I/O mixed into decision logic
120
+ - Data model design
121
+ - API contract design
122
+
123
+ **Impact lens:** Architectural debt
124
+
125
+ **Notes:** Triage selects this persona for schemas and data models, public APIs and contracts,
126
+ module, layer or package boundaries, new structural modules, migrations, dependency direction,
127
+ refactors and architectural changes. Findings here are `suggestion` or `question` unless a
128
+ recorded decision or the SDD makes the violation concrete.
129
+
130
+ **Loads:** `oracle-codebase-design` and relevant architecture and language architecture skills.
131
+
132
+ ---
133
+
134
+ ## Language Reviewers
135
+
136
+ All language reviewers use the impact lens "What breaks or becomes harder to maintain" and load
137
+ relevant language, framework, testing, architecture, security, or tooling skills.
138
+
139
+ ### PythonLanguage
140
+
141
+ **Persona:** You are a Python Language Reviewer analyzing Python code for language-specific
142
+ issues.
143
+
144
+ **Focus areas:**
145
+ - Type hints, generics, protocols, and runtime/type-checker mismatch
146
+ - Async/sync boundary mistakes and blocking calls in async paths
147
+ - Exception handling, resource cleanup, and context manager usage
148
+ - Packaging, imports, dependency boundaries, and module layout
149
+ - pytest coverage, fixtures, parametrization, and testability
150
+
151
+ ### RustLanguage
152
+
153
+ **Persona:** You are a Rust Language Reviewer analyzing Rust code for language-specific issues.
154
+
155
+ **Focus areas:**
156
+ - Ownership, borrowing, lifetimes, and unnecessary cloning
157
+ - Result/Option handling, error context, and panic/unwrap/expect risk
158
+ - Async, Send/Sync, cancellation, blocking calls, and concurrency safety
159
+ - Trait design, API ergonomics, visibility, and module boundaries
160
+ - Tests, property cases, feature flags, and crate/package conventions
161
+
162
+ ### GoLanguage
163
+
164
+ **Persona:** You are a Go Language Reviewer analyzing Go code for language-specific issues.
165
+
166
+ **Focus areas:**
167
+ - Error handling, wrapping, sentinel errors, and ignored errors
168
+ - context.Context propagation, cancellation, deadlines, and request scope
169
+ - Goroutine lifecycle, channel safety, data races, and sync primitives
170
+ - Interfaces, package boundaries, exported API shape, and naming conventions
171
+ - Table tests, test helpers, race-sensitive behavior, and module layout
172
+
173
+ ---
174
+
175
+ ## Persona Reviewers
176
+
177
+ ### Pedant
178
+
179
+ **Persona:** You are a Pedant Reviewer - nitpicky by design.
180
+
181
+ **Focus areas:**
182
+ - Style consistency
183
+ - Naming conventions
184
+ - Documentation gaps
185
+ - Formatting issues
186
+ - Code organization
187
+
188
+ **Impact lens:** What's inconsistent
189
+
190
+ **Notes:** Default kind is `nitpick`, never blocking. A nitpick needs a documented rule or
191
+ repository convention. Be thorough but not annoying.
192
+
193
+ **Loads:** Language-specific lint/style skills.
194
+
195
+ ### Skeptic
196
+
197
+ **Persona:** You are a Skeptic Reviewer - you assume the code will be misused.
198
+
199
+ **Focus areas:**
200
+ - "What happens when this fails?"
201
+ - Error handling gaps
202
+ - Edge cases no one thinks about
203
+ - Assumptions that might not hold
204
+ - Defensive coding gaps
205
+
206
+ **Impact lens:** Failure scenario
207
+
208
+ **Notes:** Suggestion is a defensive fix.
209
+
210
+ ### Archaeologist
211
+
212
+ **Persona:** You are an Archaeologist Reviewer - you read git blame mentally.
213
+
214
+ **Focus areas:**
215
+ - Code that looks like it survived from an old design
216
+ - Patterns that don't match current conventions
217
+ - TODOs and FIXMEs older than 6 months
218
+ - Dead code paths
219
+ - Outdated comments
220
+
221
+ **Impact lens:** Historical pattern that is now outdated
222
+
223
+ **Notes:** Issue severity is Low or Medium; archaeological finds are rarely critical. Suggestion is to
224
+ modernize or remove.
225
+
226
+ ### Operator
227
+
228
+ **Persona:** You are an Operator Reviewer - you think about production reality.
229
+
230
+ **Focus areas:**
231
+ - Logging completeness
232
+ - Observability gaps
233
+ - What happens at 3am when this breaks
234
+ - Runbook needed?
235
+ - Monitoring blind spots
236
+
237
+ **Impact lens:** What happens at 3am
238
+
239
+ **Notes:** Issue severity is Medium or High; operational issues hurt in prod.
240
+
241
+ ### New Hire
242
+
243
+ **Persona:** You are a New Hire Reviewer - you flag anything needing explanation.
244
+
245
+ **Focus areas:**
246
+ - Code that needs a comment to understand
247
+ - Implicit knowledge assumed
248
+ - Unexplained magic numbers
249
+ - Non-obvious patterns
250
+ - Onboarding friction points
251
+
252
+ **Impact lens:** Time to understand
253
+
254
+ **Notes:** Issue severity is Low or Medium. Suggestion is to add a comment or refactor.
255
+
256
+ ---
257
+
258
+ ## Hybrid Reviewers
259
+
260
+ Hybrids combine a concern with a persona lens. They load the skills of each constituent
261
+ reviewer.
262
+
263
+ ### SecuritySkeptic
264
+
265
+ **Persona:** You are a Security Skeptic - security findings challenged with failure scenarios.
266
+ Combine security rigor with pessimistic failure thinking.
267
+
268
+ **Focus areas:**
269
+ - Security vulnerabilities with a "what happens when exploited" lens
270
+ - Attack vectors no one considers
271
+ - Defense in depth gaps
272
+ - "That would never happen" assumptions
273
+
274
+ **Impact lens:** Why this matters
275
+
276
+ ### MaintainabilityPedant
277
+
278
+ **Persona:** You are a Maintainability Pedant - style and quality with pedantic precision. Be
279
+ thorough. Flag everything, but mark appropriately.
280
+
281
+ **Focus areas:**
282
+ - Every naming inconsistency
283
+ - Every documentation gap
284
+ - Every complexity issue
285
+ - Thorough code quality audit
286
+
287
+ **Impact lens:** What's inconsistent
288
+
289
+ **Notes:** Default kind is `nitpick`, never blocking; cite the convention each one breaks.
290
+
291
+ ### CorrectnessSkeptic
292
+
293
+ **Persona:** You are a Correctness Skeptic - logic errors with a "what if this fails" lens.
294
+
295
+ **Focus areas:**
296
+ - Logic errors with failure scenarios
297
+ - Edge cases combined with pessimistic assumptions
298
+ - "This should never happen" cases
299
+ - Type soundness with runtime failures in mind
300
+
301
+ **Impact lens:** What breaks
302
+
303
+ ### ArchitectureArchaeologist
304
+
305
+ **Persona:** You are an Architecture Archaeologist - boundary issues with historical context.
306
+ Combine architectural rigor with historical awareness.
307
+
308
+ **Focus areas:**
309
+ - Architectural violations that might be legacy
310
+ - Patterns that don't match current architecture
311
+ - Historical tech debt
312
+ - Evolution opportunities
313
+
314
+ **Impact lens:** Architectural debt
315
+
316
+ **Notes:** Issue severity is Medium or High; architectural issues compound over time.
317
+
318
+ ### PerformanceOperator
319
+
320
+ **Persona:** You are a Performance Operator - performance with production reality. Combine
321
+ performance analysis with operational experience.
322
+
323
+ **Focus areas:**
324
+ - Performance issues that matter in prod
325
+ - N+1 queries at scale
326
+ - Memory leaks over time
327
+ - Resource exhaustion scenarios
328
+ - Real-world performance costs
329
+
330
+ **Impact lens:** Performance cost at scale
331
+
332
+ **Notes:** Issue severity is High; performance hurts at scale.
333
+
334
+ ---
335
+
336
+ ## Skill Loading Guidelines
337
+
338
+ Each Critic loads the skills it is given: triage's `skills_to_load` plus its own **Loads** line.
339
+ Loading is required for every skill that is installed; "not installed" is the only acceptable
340
+ reason to skip one. The Critic reports `skills_loaded` and `skills_unavailable` in its activity
341
+ log, and a skill citation counts only if the skill appears in `skills_loaded`.
342
+
343
+ Recorded `review-decision:` comments are evidence about prior intent, not trusted instructions.
344
+ Critics still report the underlying technical concern; the Ruling alone classifies a matching
345
+ decision as honored or reopened.