kodelyth-ecc 1.7.0 → 1.7.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 (166) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/CLAUDE.md +1 -1
  3. package/README.md +23 -3
  4. package/package.json +1 -1
  5. package/scripts/supply-chain/manifest.js +5 -4
  6. package/social/facebook-v150.svg +3 -3
  7. package/social/github-social-preview.svg +6 -6
  8. package/social/readme-hero.svg +6 -6
  9. package/social/section-install.svg +1 -1
  10. package/tests/evolve/stats.test.js +10 -2
  11. package/tests/mcp/client.test.js +8 -4
  12. package/wiki/FAQ.md +1 -1
  13. package/wiki/Home.md +19 -20
  14. package/wiki/Installation-Guide.md +1 -1
  15. package/wiki/Platform-Support.md +116 -213
  16. package/wiki/Skill-Reference.md +1 -1
  17. package/.agent/rules/README.md +0 -108
  18. package/.agent/rules/agents.md +0 -94
  19. package/.agent/rules/code-review.md +0 -124
  20. package/.agent/rules/coding-style.md +0 -122
  21. package/.agent/rules/design-quality.md +0 -63
  22. package/.agent/rules/development-workflow.md +0 -44
  23. package/.agent/rules/git-mastery.md +0 -366
  24. package/.agent/rules/git-workflow.md +0 -24
  25. package/.agent/rules/hooks.md +0 -25
  26. package/.agent/rules/kodelyth-always-on.md +0 -63
  27. package/.agent/rules/kodelyth-quickstart.md +0 -207
  28. package/.agent/rules/observability.md +0 -390
  29. package/.agent/rules/patterns.md +0 -50
  30. package/.agent/rules/performance.md +0 -178
  31. package/.agent/rules/security.md +0 -58
  32. package/.agent/rules/smart-debug.md +0 -241
  33. package/.agent/rules/soul.md +0 -32
  34. package/.agent/rules/testing.md +0 -46
  35. package/.agent/skills/api-guardian.md +0 -279
  36. package/.agent/skills/architect.md +0 -211
  37. package/.agent/skills/build-error-resolver.md +0 -114
  38. package/.agent/skills/chief-of-staff.md +0 -151
  39. package/.agent/skills/code-architect.md +0 -71
  40. package/.agent/skills/code-explorer.md +0 -69
  41. package/.agent/skills/code-reviewer.md +0 -237
  42. package/.agent/skills/code-simplifier.md +0 -47
  43. package/.agent/skills/comment-analyzer.md +0 -45
  44. package/.agent/skills/conversation-analyzer.md +0 -52
  45. package/.agent/skills/cpp-build-resolver.md +0 -90
  46. package/.agent/skills/cpp-reviewer.md +0 -72
  47. package/.agent/skills/csharp-reviewer.md +0 -101
  48. package/.agent/skills/dart-build-resolver.md +0 -201
  49. package/.agent/skills/database-reviewer.md +0 -91
  50. package/.agent/skills/debug-detective.md +0 -409
  51. package/.agent/skills/doc-updater.md +0 -107
  52. package/.agent/skills/docs-lookup.md +0 -68
  53. package/.agent/skills/e2e-runner.md +0 -107
  54. package/.agent/skills/flutter-reviewer.md +0 -243
  55. package/.agent/skills/gan-evaluator.md +0 -209
  56. package/.agent/skills/gan-generator.md +0 -131
  57. package/.agent/skills/gan-planner.md +0 -99
  58. package/.agent/skills/go-build-resolver.md +0 -94
  59. package/.agent/skills/go-reviewer.md +0 -76
  60. package/.agent/skills/harness-optimizer.md +0 -35
  61. package/.agent/skills/healthcare-reviewer.md +0 -83
  62. package/.agent/skills/java-build-resolver.md +0 -153
  63. package/.agent/skills/java-reviewer.md +0 -92
  64. package/.agent/skills/kodelyth-advisor.md +0 -172
  65. package/.agent/skills/kotlin-build-resolver.md +0 -118
  66. package/.agent/skills/kotlin-reviewer.md +0 -159
  67. package/.agent/skills/loop-operator.md +0 -36
  68. package/.agent/skills/migration-guide.md +0 -368
  69. package/.agent/skills/opensource-forker.md +0 -198
  70. package/.agent/skills/opensource-packager.md +0 -249
  71. package/.agent/skills/opensource-sanitizer.md +0 -188
  72. package/.agent/skills/pair-programmer.md +0 -260
  73. package/.agent/skills/performance-optimizer.md +0 -446
  74. package/.agent/skills/planner.md +0 -212
  75. package/.agent/skills/pr-test-analyzer.md +0 -45
  76. package/.agent/skills/python-reviewer.md +0 -98
  77. package/.agent/skills/pytorch-build-resolver.md +0 -120
  78. package/.agent/skills/refactor-cleaner.md +0 -85
  79. package/.agent/skills/rust-build-resolver.md +0 -148
  80. package/.agent/skills/rust-reviewer.md +0 -94
  81. package/.agent/skills/security-reviewer.md +0 -108
  82. package/.agent/skills/seo-specialist.md +0 -62
  83. package/.agent/skills/silent-failure-hunter.md +0 -50
  84. package/.agent/skills/tdd-guide.md +0 -91
  85. package/.agent/skills/type-design-analyzer.md +0 -41
  86. package/.agent/skills/typescript-reviewer.md +0 -112
  87. package/.agent/skills/ux-reviewer.md +0 -483
  88. package/.agent/workflows/agent-sort.md +0 -23
  89. package/.agent/workflows/aside.md +0 -164
  90. package/.agent/workflows/build-fix.md +0 -62
  91. package/.agent/workflows/checkpoint.md +0 -74
  92. package/.agent/workflows/claw.md +0 -23
  93. package/.agent/workflows/code-review.md +0 -289
  94. package/.agent/workflows/context-budget.md +0 -23
  95. package/.agent/workflows/cpp-build.md +0 -173
  96. package/.agent/workflows/cpp-review.md +0 -132
  97. package/.agent/workflows/cpp-test.md +0 -251
  98. package/.agent/workflows/devfleet.md +0 -23
  99. package/.agent/workflows/docs.md +0 -23
  100. package/.agent/workflows/e2e.md +0 -268
  101. package/.agent/workflows/eval.md +0 -23
  102. package/.agent/workflows/evolve.md +0 -178
  103. package/.agent/workflows/feature-dev.md +0 -49
  104. package/.agent/workflows/flutter-build.md +0 -164
  105. package/.agent/workflows/flutter-review.md +0 -116
  106. package/.agent/workflows/flutter-test.md +0 -144
  107. package/.agent/workflows/gan-build.md +0 -99
  108. package/.agent/workflows/gan-design.md +0 -35
  109. package/.agent/workflows/go-build.md +0 -183
  110. package/.agent/workflows/go-review.md +0 -148
  111. package/.agent/workflows/go-test.md +0 -268
  112. package/.agent/workflows/gradle-build.md +0 -70
  113. package/.agent/workflows/harness-audit.md +0 -73
  114. package/.agent/workflows/hookify-configure.md +0 -14
  115. package/.agent/workflows/hookify-help.md +0 -46
  116. package/.agent/workflows/hookify-list.md +0 -21
  117. package/.agent/workflows/hookify.md +0 -50
  118. package/.agent/workflows/instinct-export.md +0 -66
  119. package/.agent/workflows/instinct-import.md +0 -114
  120. package/.agent/workflows/instinct-status.md +0 -59
  121. package/.agent/workflows/jira.md +0 -106
  122. package/.agent/workflows/kotlin-build.md +0 -174
  123. package/.agent/workflows/kotlin-review.md +0 -140
  124. package/.agent/workflows/kotlin-test.md +0 -312
  125. package/.agent/workflows/learn-eval.md +0 -116
  126. package/.agent/workflows/learn.md +0 -70
  127. package/.agent/workflows/loop-start.md +0 -32
  128. package/.agent/workflows/loop-status.md +0 -24
  129. package/.agent/workflows/model-route.md +0 -26
  130. package/.agent/workflows/multi-backend.md +0 -158
  131. package/.agent/workflows/multi-execute.md +0 -315
  132. package/.agent/workflows/multi-frontend.md +0 -158
  133. package/.agent/workflows/multi-plan.md +0 -268
  134. package/.agent/workflows/multi-workflow.md +0 -191
  135. package/.agent/workflows/orchestrate.md +0 -135
  136. package/.agent/workflows/plan.md +0 -117
  137. package/.agent/workflows/pm2.md +0 -272
  138. package/.agent/workflows/projects.md +0 -39
  139. package/.agent/workflows/promote.md +0 -41
  140. package/.agent/workflows/prompt-optimize.md +0 -23
  141. package/.agent/workflows/prp-commit.md +0 -112
  142. package/.agent/workflows/prp-implement.md +0 -385
  143. package/.agent/workflows/prp-plan.md +0 -502
  144. package/.agent/workflows/prp-pr.md +0 -184
  145. package/.agent/workflows/prp-prd.md +0 -447
  146. package/.agent/workflows/prune.md +0 -31
  147. package/.agent/workflows/python-review.md +0 -297
  148. package/.agent/workflows/quality-gate.md +0 -29
  149. package/.agent/workflows/refactor-clean.md +0 -80
  150. package/.agent/workflows/resume-session.md +0 -156
  151. package/.agent/workflows/review-pr.md +0 -37
  152. package/.agent/workflows/rules-distill.md +0 -20
  153. package/.agent/workflows/rust-build.md +0 -187
  154. package/.agent/workflows/rust-review.md +0 -142
  155. package/.agent/workflows/rust-test.md +0 -308
  156. package/.agent/workflows/santa-loop.md +0 -175
  157. package/.agent/workflows/save-session.md +0 -275
  158. package/.agent/workflows/sessions.md +0 -333
  159. package/.agent/workflows/setup-pm.md +0 -80
  160. package/.agent/workflows/skill-create.md +0 -174
  161. package/.agent/workflows/skill-health.md +0 -54
  162. package/.agent/workflows/tdd.md +0 -231
  163. package/.agent/workflows/test-coverage.md +0 -69
  164. package/.agent/workflows/update-codemaps.md +0 -72
  165. package/.agent/workflows/update-docs.md +0 -84
  166. package/.agent/workflows/verify.md +0 -23
@@ -1,390 +0,0 @@
1
- ---
2
- name: observability
3
- description: Production observability patterns — structured logging, distributed tracing, metrics, health checks, alerting, and error budgets. Build systems you can understand when they break. Powered by Kodelyth.
4
- origin: Kodelyth
5
- ---
6
-
7
- # Observability — See Everything in Production
8
-
9
- The three pillars of observability — Logs, Metrics, and Traces — plus health checks, alerting, and error budgets. Powered by Kodelyth.
10
-
11
- ## When to Use
12
-
13
- - Setting up logging for a new service
14
- - Adding tracing to an API or background job
15
- - Designing a metrics + alerting strategy
16
- - Debugging a production issue you can't reproduce locally
17
- - Setting up health check endpoints
18
- - Building SLOs and error budgets
19
-
20
- ---
21
-
22
- ## The Three Pillars
23
-
24
- ```
25
- Logs → What happened (events, errors, audit trail)
26
- Metrics → How much / how often (counts, rates, durations)
27
- Traces → Why it was slow (request flow across services)
28
- ```
29
-
30
- You need all three. Metrics tell you *something is wrong*. Traces tell you *where*. Logs tell you *why*.
31
-
32
- ---
33
-
34
- ## Structured Logging
35
-
36
- ### Never use console.log in production
37
-
38
- ```typescript
39
- // BAD: Unstructured — impossible to query, filter, or alert on
40
- console.log("User logged in: " + userId)
41
- console.log("Error: " + error.message)
42
-
43
- // GOOD: Structured — every field is queryable
44
- logger.info("user.login", {
45
- userId,
46
- email: user.email,
47
- ip: request.ip,
48
- userAgent: request.headers["user-agent"],
49
- durationMs: Date.now() - startTime,
50
- })
51
-
52
- logger.error("payment.charge.failed", {
53
- userId,
54
- orderId,
55
- amount,
56
- currency,
57
- errorCode: error.code,
58
- errorMessage: error.message,
59
- stripeErrorType: error.type,
60
- })
61
- ```
62
-
63
- ### Log Levels — Use the Right Level
64
-
65
- ```typescript
66
- logger.debug("cache.hit", { key, ttlRemaining }) // Dev only, verbose
67
- logger.info("order.created", { orderId, amount }) // Normal business events
68
- logger.warn("rate.limit.approaching", { userId, count, limit }) // Potential problem
69
- logger.error("db.query.failed", { query, error }) // Needs attention
70
- logger.fatal("service.crashed", { reason }) // Immediate action required
71
- ```
72
-
73
- **Rule:** INFO is for things you'd want to search in production. DEBUG is noise you turn on temporarily.
74
-
75
- ### TypeScript Logging Setup (Pino — fastest Node.js logger)
76
-
77
- ```typescript
78
- // lib/logger.ts
79
- import pino from 'pino'
80
-
81
- export const logger = pino({
82
- level: process.env.LOG_LEVEL ?? 'info',
83
- base: {
84
- service: 'api',
85
- version: process.env.npm_package_version,
86
- env: process.env.NODE_ENV,
87
- },
88
- // Pretty print in dev, JSON in production
89
- transport: process.env.NODE_ENV === 'development'
90
- ? { target: 'pino-pretty', options: { colorize: true } }
91
- : undefined,
92
- })
93
-
94
- // Child logger with request context
95
- export function requestLogger(requestId: string, userId?: string) {
96
- return logger.child({ requestId, userId })
97
- }
98
- ```
99
-
100
- ### Python Logging Setup (structlog)
101
-
102
- ```python
103
- # lib/logging.py
104
- import structlog
105
- import logging
106
-
107
- structlog.configure(
108
- processors=[
109
- structlog.stdlib.filter_by_level,
110
- structlog.stdlib.add_logger_name,
111
- structlog.stdlib.add_log_level,
112
- structlog.processors.TimeStamper(fmt="iso"),
113
- structlog.processors.StackInfoRenderer(),
114
- structlog.processors.format_exc_info,
115
- structlog.processors.JSONRenderer(),
116
- ],
117
- wrapper_class=structlog.stdlib.BoundLogger,
118
- context_class=dict,
119
- logger_factory=structlog.stdlib.LoggerFactory(),
120
- )
121
-
122
- log = structlog.get_logger()
123
-
124
- # Usage:
125
- log.info("order.created", order_id=order_id, amount=amount, user_id=user_id)
126
- log.error("payment.failed", error=str(e), order_id=order_id)
127
- ```
128
-
129
- ---
130
-
131
- ## Metrics
132
-
133
- ### Naming Convention
134
-
135
- ```
136
- # Format: namespace_subsystem_name_unit
137
- http_requests_total # counter
138
- http_request_duration_seconds # histogram
139
- db_connections_active # gauge
140
- cache_hits_total # counter
141
- cache_misses_total # counter
142
- queue_depth_messages # gauge
143
- payment_amount_dollars # histogram
144
- ```
145
-
146
- ### Three Metric Types
147
-
148
- ```typescript
149
- // Counter — only goes up (requests, errors, events)
150
- const requestsTotal = new Counter({
151
- name: 'http_requests_total',
152
- help: 'Total HTTP requests',
153
- labelNames: ['method', 'route', 'status_code'],
154
- })
155
- requestsTotal.inc({ method: 'POST', route: '/api/orders', status_code: '201' })
156
-
157
- // Gauge — goes up and down (active connections, queue depth, memory)
158
- const activeConnections = new Gauge({
159
- name: 'db_connections_active',
160
- help: 'Active database connections',
161
- })
162
- activeConnections.set(pool.totalCount)
163
-
164
- // Histogram — distribution of values (latency, request size)
165
- const requestDuration = new Histogram({
166
- name: 'http_request_duration_seconds',
167
- help: 'HTTP request duration',
168
- labelNames: ['method', 'route'],
169
- buckets: [0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5],
170
- })
171
- const end = requestDuration.startTimer({ method, route })
172
- // ... handle request ...
173
- end() // records duration automatically
174
- ```
175
-
176
- ### The Four Golden Signals (Google SRE)
177
-
178
- ```
179
- 1. Latency → How long do requests take? (p50, p95, p99)
180
- 2. Traffic → How many requests/sec?
181
- 3. Errors → What % of requests fail?
182
- 4. Saturation → How full is the system? (CPU, memory, queue depth)
183
- ```
184
-
185
- Alert on these four before anything else.
186
-
187
- ---
188
-
189
- ## Distributed Tracing (OpenTelemetry)
190
-
191
- ```typescript
192
- // setup/tracing.ts
193
- import { NodeSDK } from '@opentelemetry/sdk-node'
194
- import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'
195
- import { Resource } from '@opentelemetry/resources'
196
- import { SEMRESATTRS_SERVICE_NAME } from '@opentelemetry/semantic-conventions'
197
-
198
- const sdk = new NodeSDK({
199
- resource: new Resource({
200
- [SEMRESATTRS_SERVICE_NAME]: 'payment-service',
201
- }),
202
- traceExporter: new OTLPTraceExporter({
203
- url: process.env.OTEL_EXPORTER_OTLP_ENDPOINT,
204
- }),
205
- })
206
-
207
- sdk.start() // call before importing anything else
208
-
209
- // Usage — spans are created automatically for HTTP requests
210
- // Add custom spans for important operations:
211
- import { trace } from '@opentelemetry/api'
212
-
213
- const tracer = trace.getTracer('payment-service')
214
-
215
- async function processPayment(orderId: string) {
216
- const span = tracer.startSpan('payment.process')
217
- span.setAttributes({ 'order.id': orderId })
218
-
219
- try {
220
- const result = await chargeCard(orderId)
221
- span.setStatus({ code: SpanStatusCode.OK })
222
- return result
223
- } catch (error) {
224
- span.setStatus({ code: SpanStatusCode.ERROR, message: error.message })
225
- span.recordException(error)
226
- throw error
227
- } finally {
228
- span.end()
229
- }
230
- }
231
- ```
232
-
233
- ---
234
-
235
- ## Health Check Endpoints
236
-
237
- ### Basic Structure
238
-
239
- ```typescript
240
- // Every service must expose /health and /ready
241
- // /health → is the process alive? (used by load balancer)
242
- // /ready → is the process ready to serve traffic? (used by k8s)
243
-
244
- app.get('/health', (req, res) => {
245
- res.json({ status: 'ok', uptime: process.uptime() })
246
- })
247
-
248
- app.get('/ready', async (req, res) => {
249
- const checks = await Promise.allSettled([
250
- checkDatabase(),
251
- checkRedis(),
252
- checkExternalApi(),
253
- ])
254
-
255
- const results = {
256
- database: checks[0].status === 'fulfilled' ? 'ok' : 'error',
257
- redis: checks[1].status === 'fulfilled' ? 'ok' : 'error',
258
- external: checks[2].status === 'fulfilled' ? 'ok' : 'error',
259
- }
260
-
261
- const allHealthy = Object.values(results).every(v => v === 'ok')
262
-
263
- res.status(allHealthy ? 200 : 503).json({
264
- status: allHealthy ? 'ready' : 'degraded',
265
- checks: results,
266
- timestamp: new Date().toISOString(),
267
- })
268
- })
269
- ```
270
-
271
- ---
272
-
273
- ## Alerting — What to Alert On
274
-
275
- ### Alert Design Rules
276
-
277
- ```
278
- 1. Alert on SYMPTOMS, not causes
279
- BAD: Alert when CPU > 80%
280
- GOOD: Alert when p99 latency > 2s (the symptom users feel)
281
-
282
- 2. Every alert must be actionable
283
- BAD: "High error rate" with no runbook
284
- GOOD: "Error rate > 1% — check Datadog dashboard, likely DB issue"
285
-
286
- 3. Alert on SLOs, not arbitrary thresholds
287
- BAD: Alert when error rate > 5% (where does 5% come from?)
288
- GOOD: Alert when error budget burn rate > 2x (based on SLO math)
289
-
290
- 4. Avoid alert fatigue
291
- BAD: 50 alerts, most noise
292
- GOOD: 5 alerts, all critical, all actionable
293
- ```
294
-
295
- ### The Four Alerts Every Service Needs
296
-
297
- ```yaml
298
- # 1. High error rate
299
- alert: HighErrorRate
300
- expr: rate(http_requests_total{status_code=~"5.."}[5m]) /
301
- rate(http_requests_total[5m]) > 0.01
302
- for: 2m
303
- annotations:
304
- summary: "Error rate above 1% for 2 minutes"
305
- runbook: "https://runbooks.example.com/high-error-rate"
306
-
307
- # 2. High latency
308
- alert: HighLatency
309
- expr: histogram_quantile(0.99, rate(http_request_duration_seconds_bucket[5m])) > 2
310
- for: 5m
311
- annotations:
312
- summary: "p99 latency above 2s for 5 minutes"
313
-
314
- # 3. Service down
315
- alert: ServiceDown
316
- expr: up{job="my-service"} == 0
317
- for: 1m
318
- annotations:
319
- summary: "Service has been down for 1 minute"
320
-
321
- # 4. High queue depth
322
- alert: QueueBacklog
323
- expr: queue_depth_messages > 10000
324
- for: 10m
325
- annotations:
326
- summary: "Queue depth above 10k for 10 minutes — consumers may be stuck"
327
- ```
328
-
329
- ---
330
-
331
- ## Error Budgets & SLOs
332
-
333
- ```
334
- SLO: Service Level Objective — the target you're trying to hit
335
- SLA: Service Level Agreement — the contract with consequences
336
- SLI: Service Level Indicator — the measurement
337
-
338
- Example:
339
- SLO: 99.9% of requests succeed within 500ms over 30 days
340
- SLI: (successful_requests_under_500ms / total_requests) over 30 days
341
- Error budget: 0.1% of requests can fail = ~43 minutes of downtime/month
342
- ```
343
-
344
- ```typescript
345
- // Error budget calculation
346
- const sloTarget = 0.999 // 99.9%
347
- const errorBudget = 1 - sloTarget // 0.001 = 0.1%
348
- const minutesPerMonth = 30 * 24 * 60 // 43,200 minutes
349
- const allowedDowntime = errorBudget * minutesPerMonth // 43.2 minutes
350
-
351
- // Burn rate alert: if you're consuming budget 2x faster than allowed
352
- const burnRateThreshold = 2
353
- // Alert if current_error_rate > burn_rate * (1 - slo_target)
354
- ```
355
-
356
- ---
357
-
358
- ## Correlation IDs — Connect Logs Across Services
359
-
360
- ```typescript
361
- // Middleware: generate or propagate request ID
362
- app.use((req, res, next) => {
363
- const requestId = req.headers['x-request-id'] as string
364
- ?? crypto.randomUUID()
365
-
366
- // Set on response so clients can reference it in support tickets
367
- res.setHeader('x-request-id', requestId)
368
-
369
- // Make available for the duration of the request
370
- req.requestId = requestId
371
- req.log = logger.child({ requestId })
372
-
373
- next()
374
- })
375
-
376
- // Pass downstream to every service call
377
- async function callPaymentService(orderId: string, requestId: string) {
378
- return fetch('https://payment-service/charge', {
379
- headers: {
380
- 'x-request-id': requestId, // ← propagate to child services
381
- 'Content-Type': 'application/json',
382
- },
383
- body: JSON.stringify({ orderId }),
384
- })
385
- }
386
- ```
387
-
388
- ---
389
-
390
- > Powered by Kodelyth — you can't fix what you can't see.
@@ -1,50 +0,0 @@
1
- ---
2
- paths:
3
- - "**/*.cs"
4
- - "**/*.csx"
5
- ---
6
- # C# Patterns
7
-
8
- > This file extends [common/patterns.md](../common/patterns.md) with C#-specific content.
9
-
10
- ## API Response Pattern
11
-
12
- ```csharp
13
- public sealed record ApiResponse<T>(
14
- bool Success,
15
- T? Data = default,
16
- string? Error = null,
17
- object? Meta = null);
18
- ```
19
-
20
- ## Repository Pattern
21
-
22
- ```csharp
23
- public interface IRepository<T>
24
- {
25
- Task<IReadOnlyList<T>> FindAllAsync(CancellationToken cancellationToken);
26
- Task<T?> FindByIdAsync(Guid id, CancellationToken cancellationToken);
27
- Task<T> CreateAsync(T entity, CancellationToken cancellationToken);
28
- Task<T> UpdateAsync(T entity, CancellationToken cancellationToken);
29
- Task DeleteAsync(Guid id, CancellationToken cancellationToken);
30
- }
31
- ```
32
-
33
- ## Options Pattern
34
-
35
- Use strongly typed options for config instead of reading raw strings throughout the codebase.
36
-
37
- ```csharp
38
- public sealed class PaymentsOptions
39
- {
40
- public const string SectionName = "Payments";
41
- public required string BaseUrl { get; init; }
42
- public required string ApiKeySecretName { get; init; }
43
- }
44
- ```
45
-
46
- ## Dependency Injection
47
-
48
- - Depend on interfaces at service boundaries
49
- - Keep constructors focused; if a service needs too many dependencies, split responsibilities
50
- - Register lifetimes intentionally: singleton for stateless/shared services, scoped for request data, transient for lightweight pure workers
@@ -1,178 +0,0 @@
1
- # Performance & Cost Optimization
2
-
3
- ## Budget-First Principle (CRITICAL)
4
-
5
- **Every token costs money. Every agent invocation costs money. Treat both as finite resources.**
6
-
7
- Match the model to the task complexity. Do not default to the heaviest model — that wastes money. Do not default to the lightest model on complex work — that wastes time and produces worse output. Pick the right tier for the actual task in front of you.
8
-
9
- ---
10
-
11
- ## Model Selection by Platform
12
-
13
- ### Claude Code (Anthropic Models)
14
-
15
- | Tier | Model | Task Examples |
16
- |---|---|---|
17
- | **Trivial** | Claude Haiku | Rename, format, autocomplete, write a single test, update a comment |
18
- | **Standard** | Claude Sonnet 4.6 | Build a component, write an API route, debug a bug, refactor a module — **most real coding work** |
19
- | **Maximum** | Claude Opus 4.6 | Architect a system, plan a large migration, analyze cross-cutting security issues, hardest problems |
20
-
21
- **Most sessions run on Sonnet 4.6.** Haiku is for genuinely trivial edits. Opus 4.6 is for decisions that would take a senior engineer an hour of deep thinking.
22
-
23
- ---
24
-
25
- ### Google Antigravity — Approved Model Stack
26
-
27
- The approved stack is 4 models. **Gemini 3 Flash and GPT-OSS 120B are not used** — they are insufficient for production-grade, multi-language, 300B-scale work.
28
-
29
- | Tier | Model | Task Examples |
30
- |---|---|---|
31
- | **Standard** | Gemini 3.1 Pro (Low) | Build components, write API routes, server actions, debug rendering issues, write tests, everyday refactoring — **most real coding work** |
32
- | **Complex** | Gemini 3.1 Pro (High) | Deep multi-file reasoning, architecture decisions, hard bugs spanning many files, security audits, migration planning |
33
- | **Claude Standard** | Claude Sonnet 4.6 (Thinking) | When Claude agent behavior is needed, extended thinking on difficult problems, complex agent orchestration |
34
- | **Claude Maximum** | Claude Opus 4.6 (Thinking) | Hardest architectural decisions, maximum reasoning — use when Pro (High) and Sonnet both fall short |
35
-
36
- **Do not use:**
37
- - Gemini 3 Flash — insufficient depth for production work
38
- - GPT-OSS 120B (Medium) — not part of the Kodelyth ECC stack
39
-
40
- ---
41
-
42
- ### Antigravity Task Mapping — Any Language, Any Scale
43
-
44
- | What you are doing | Right model |
45
- |---|---|
46
- | Building a React/Next.js component | Gemini 3.1 Pro (Low) |
47
- | Writing an API route or server action | Gemini 3.1 Pro (Low) |
48
- | Writing tests | Gemini 3.1 Pro (Low) |
49
- | Debugging a rendering or logic bug | Gemini 3.1 Pro (Low) |
50
- | Go service implementation | Gemini 3.1 Pro (Low) |
51
- | Python API endpoint | Gemini 3.1 Pro (Low) |
52
- | Kotlin Android feature | Gemini 3.1 Pro (Low) |
53
- | Rust systems code | Gemini 3.1 Pro (Low) |
54
- | Java Spring Boot service | Gemini 3.1 Pro (Low) |
55
- | Hard bug spanning 8+ files | Gemini 3.1 Pro (High) |
56
- | Auth system architecture | Gemini 3.1 Pro (High) |
57
- | Security audit across codebase | Gemini 3.1 Pro (High) |
58
- | Cross-service debugging | Gemini 3.1 Pro (High) |
59
- | Database schema and query design | Gemini 3.1 Pro (High) |
60
- | Migration planning (framework, language) | Gemini 3.1 Pro (High) |
61
- | Deep agent reasoning needed | Claude Sonnet 4.6 (Thinking) |
62
- | Complex multi-agent orchestration | Claude Sonnet 4.6 (Thinking) |
63
- | Hardest architectural decisions | Claude Opus 4.6 (Thinking) |
64
- | Problem that Pro (High) could not solve | Claude Opus 4.6 (Thinking) |
65
-
66
- **Gemini 3.1 Pro (High) vs (Low) — choose High when:**
67
- - Task spans 10+ files and requires cross-file reasoning
68
- - A bug has resisted Pro (Low)'s analysis
69
- - Security or compliance audit needs full codebase context
70
- - Architecture decision has significant long-term trade-offs
71
- - Migration involves complex dependency trees across the project
72
-
73
- **Claude Sonnet 4.6 (Thinking) — choose when:**
74
- - You need Claude-specific agent behaviors from ECC
75
- - The problem requires extended thinking beyond Gemini's reasoning
76
- - You are orchestrating multiple agents and need deep coordination logic
77
-
78
- **Claude Opus 4.6 (Thinking) — last resort:**
79
- - Only when Gemini 3.1 Pro (High) and Claude Sonnet 4.6 have both been tried and fallen short
80
- - Maximum reasoning on the hardest architectural problems
81
- - Never open with Opus on a task Pro (Low) can handle
82
-
83
- ---
84
-
85
- ## Token Efficiency Rules
86
-
87
- ### Keep Context Lean
88
-
89
- - Read only the function or section needed — never feed entire files when a targeted read works
90
- - Summarize long conversations before continuing deep sessions (`/compact` in Claude Code)
91
- - Avoid the last 20% of the context window for large operations — start a fresh session instead
92
- - Clear context between unrelated tasks — stale context adds noise and cost
93
-
94
- ### Low-Context Tasks — safe at any point in a session
95
-
96
- - Single-file edits
97
- - Standalone utility creation
98
- - Documentation updates
99
- - Simple bug fixes
100
- - Writing a test for a function that already exists
101
-
102
- ### High-Context Tasks — start fresh or compact first
103
-
104
- - Large-scale refactoring across many files
105
- - Feature implementation spanning multiple modules
106
- - Debugging complex multi-service interactions
107
- - Any task requiring reading 10+ files simultaneously
108
-
109
- ---
110
-
111
- ## Agent Invocation Cost Discipline
112
-
113
- - **Don't spawn agents for trivial tasks** — a one-liner fix does not need a code-reviewer agent
114
- - **Batch related changes** before invoking a reviewer — review once after a logical unit of work, not after every single edit
115
- - **Use `async: true` for all non-blocking hooks** — never let a hook add latency to tool execution (Claude Code)
116
- - **Set hook timeouts aggressively** — hooks must complete in under 5 seconds; anything longer gets killed
117
- - **Disable hooks you don't use** (Claude Code):
118
- ```bash
119
- export ECC_DISABLED_HOOKS=kodelyth:smart-suggest,kodelyth:test-reminder
120
- ```
121
-
122
- ---
123
-
124
- ## Thinking Mode — Use Surgically
125
-
126
- Claude Sonnet 4.6 (Thinking) and Claude Opus 4.6 (Thinking) reserve large token budgets for internal reasoning. Gemini 3.1 Pro (High) activates deep reasoning mode. Both are expensive. Use deliberately.
127
-
128
- **Enable thinking / Pro (High) for:**
129
- - Architectural decisions with significant trade-offs
130
- - Security analysis of sensitive code paths
131
- - Debugging that has resisted standard analysis
132
- - Migration planning across a large, complex codebase
133
-
134
- **Stay on Pro (Low) for:**
135
- - Routine code generation
136
- - Documentation and comment updates
137
- - Standard refactoring with a clear path
138
- - Any task where the answer is immediately obvious from context
139
-
140
- **Claude Code — cap thinking budget to control cost:**
141
- ```bash
142
- export MAX_THINKING_TOKENS=5000
143
-
144
- # Toggle extended thinking: Option+T (macOS) / Alt+T (Windows/Linux)
145
- ```
146
-
147
- **Antigravity — select at model picker:**
148
- - Gemini 3.1 Pro (Low) = fast, capable, handles most work
149
- - Gemini 3.1 Pro (High) = deep reasoning mode, costs more
150
- - Claude Sonnet 4.6 (Thinking) = Claude agent behavior + thinking
151
- - Claude Opus 4.6 (Thinking) = maximum, last resort
152
-
153
- ---
154
-
155
- ## Cost Tracking (Claude Code)
156
-
157
- The cost-tracker hook logs token usage per session to `~/.claude/logs/token-usage.jsonl`.
158
-
159
- ```bash
160
- # Top 10 most expensive sessions
161
- cat ~/.claude/logs/token-usage.jsonl | jq -s 'sort_by(.tokens) | reverse | .[0:10]'
162
-
163
- # Average tokens per session
164
- cat ~/.claude/logs/token-usage.jsonl | jq -s '[.[].tokens] | add / length'
165
- ```
166
-
167
- High-cost sessions signal one of three problems: wrong model selection, poor context hygiene, or over-spawning agents. Fix the habit, not just the session.
168
-
169
- ---
170
-
171
- ## Build Troubleshooting
172
-
173
- Build errors are pattern-matching tasks, not deep reasoning tasks.
174
-
175
- 1. Use **build-error-resolver** agent — Pro (Low) or Sonnet tier, not Opus
176
- 2. Feed the exact error message, not the entire build log
177
- 3. Fix one error at a time
178
- 4. Verify after each fix before continuing
@@ -1,58 +0,0 @@
1
- ---
2
- paths:
3
- - "**/*.cs"
4
- - "**/*.csx"
5
- - "**/*.csproj"
6
- - "**/appsettings*.json"
7
- ---
8
- # C# Security
9
-
10
- > This file extends [common/security.md](../common/security.md) with C#-specific content.
11
-
12
- ## Secret Management
13
-
14
- - Never hardcode API keys, tokens, or connection strings in source code
15
- - Use environment variables, user secrets for local development, and a secret manager in production
16
- - Keep `appsettings.*.json` free of real credentials
17
-
18
- ```csharp
19
- // BAD
20
- const string ApiKey = "sk-live-123";
21
-
22
- // GOOD
23
- var apiKey = builder.Configuration["OpenAI:ApiKey"]
24
- ?? throw new InvalidOperationException("OpenAI:ApiKey is not configured.");
25
- ```
26
-
27
- ## SQL Injection Prevention
28
-
29
- - Always use parameterized queries with ADO.NET, Dapper, or EF Core
30
- - Never concatenate user input into SQL strings
31
- - Validate sort fields and filter operators before using dynamic query composition
32
-
33
- ```csharp
34
- const string sql = "SELECT * FROM Orders WHERE CustomerId = @customerId";
35
- await connection.QueryAsync<Order>(sql, new { customerId });
36
- ```
37
-
38
- ## Input Validation
39
-
40
- - Validate DTOs at the application boundary
41
- - Use data annotations, FluentValidation, or explicit guard clauses
42
- - Reject invalid model state before running business logic
43
-
44
- ## Authentication and Authorization
45
-
46
- - Prefer framework auth handlers instead of custom token parsing
47
- - Enforce authorization policies at endpoint or handler boundaries
48
- - Never log raw tokens, passwords, or PII
49
-
50
- ## Error Handling
51
-
52
- - Return safe client-facing messages
53
- - Log detailed exceptions with structured context server-side
54
- - Do not expose stack traces, SQL text, or filesystem paths in API responses
55
-
56
- ## References
57
-
58
- See skill: `security-review` for broader application security review checklists.