kodelyth-ecc 1.5.10 → 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 (273) hide show
  1. package/.github/workflows/publish.yml +19 -0
  2. package/AGENTS.md +1 -1
  3. package/CHANGELOG.md +475 -0
  4. package/CLAUDE.md +48 -16
  5. package/README.md +285 -81
  6. package/VERSION +1 -1
  7. package/actions/ecc-review/README.md +243 -0
  8. package/actions/ecc-review/action.yml +158 -0
  9. package/actions/ecc-review/post-comment.js +171 -0
  10. package/actions/ecc-review/run-review.js +285 -0
  11. package/agents/backdoor-hunter.md +260 -0
  12. package/agents/chaos-engineer.md +251 -0
  13. package/agents/code-stealer-detector.md +228 -0
  14. package/agents/jailbreak-tester.md +222 -0
  15. package/agents/license-violation-finder.md +212 -0
  16. package/agents/prompt-injection-hunter.md +126 -0
  17. package/agents/secret-hunter.md +209 -0
  18. package/agents/supply-chain-auditor.md +195 -0
  19. package/bin/kodelyth-ecc.js +875 -1
  20. package/bundles/enterprise.md +172 -0
  21. package/bundles/indie-hacker.md +106 -0
  22. package/bundles/red-team.md +138 -0
  23. package/cat +0 -0
  24. package/commands/dashboard.md +67 -0
  25. package/commands/devil-mode.md +121 -0
  26. package/commands/memory-evolve.md +71 -0
  27. package/commands/replay.md +61 -0
  28. package/commands/route-model.md +48 -0
  29. package/commands/swarm.md +68 -0
  30. package/commands/verify-supply-chain.md +59 -0
  31. package/docs/dashboard.md +211 -0
  32. package/docs/evolve.md +303 -0
  33. package/docs/mcp-clients.md +167 -0
  34. package/docs/mcp.md +178 -0
  35. package/docs/replay.md +244 -0
  36. package/docs/supply-chain.md +207 -0
  37. package/docs/swarm.md +243 -0
  38. package/hooks/hooks.json +52 -0
  39. package/hooks/memory/auto-recall.js +29 -1
  40. package/hooks/safety/README.md +124 -0
  41. package/hooks/safety/lib/patterns.js +179 -0
  42. package/hooks/safety/prompt-injection-guard.js +179 -0
  43. package/hooks/safety/token-budget.js +229 -0
  44. package/install.ps1 +199 -2
  45. package/install.sh +285 -3
  46. package/package.json +30 -4
  47. package/rules/common/agent-intent-routing.md +182 -0
  48. package/rules/common/cost-aware-model-routing.md +152 -0
  49. package/scripts/dashboard/data.js +353 -0
  50. package/scripts/dashboard/server.js +324 -0
  51. package/scripts/dashboard/static/index.html +645 -0
  52. package/scripts/evolve/analyze.js +303 -0
  53. package/scripts/evolve/proposals.js +162 -0
  54. package/scripts/evolve/stats.js +219 -0
  55. package/scripts/mcp/catalog.js +244 -0
  56. package/scripts/mcp/client.js +181 -0
  57. package/scripts/mcp/prompts.js +133 -0
  58. package/scripts/mcp/resources.js +94 -0
  59. package/scripts/mcp/server.js +153 -0
  60. package/scripts/mcp/tools.js +465 -0
  61. package/scripts/replay/bundle.js +191 -0
  62. package/scripts/replay/replay.js +107 -0
  63. package/scripts/router/classify.js +232 -0
  64. package/scripts/supply-chain/manifest.js +155 -0
  65. package/scripts/supply-chain/sbom.js +202 -0
  66. package/scripts/supply-chain/verify.js +102 -0
  67. package/scripts/swarm/build-plan.js +193 -0
  68. package/skills/cost-aware-model-routing/SKILL.md +153 -0
  69. package/skills/kodelyth-quickstart/SKILL.md +7 -0
  70. package/skills/observability-dashboard/SKILL.md +119 -0
  71. package/skills/self-evolving-memory/SKILL.md +175 -0
  72. package/skills/session-replay/SKILL.md +199 -0
  73. package/skills/supply-chain-verification/SKILL.md +201 -0
  74. package/skills/swarm-orchestrator/SKILL.md +177 -0
  75. package/social/card-install.svg +1 -1
  76. package/social/facebook-group/POST.md +121 -0
  77. package/social/facebook-group/fb-1-3am-debug.png +0 -0
  78. package/social/facebook-group/fb-1-3am-debug.svg +97 -0
  79. package/social/facebook-group/fb-2-cpu-upgrade.png +0 -0
  80. package/social/facebook-group/fb-2-cpu-upgrade.svg +132 -0
  81. package/social/facebook-group/fb-3-before-after.png +0 -0
  82. package/social/facebook-group/fb-3-before-after.svg +94 -0
  83. package/social/facebook-v150.svg +6 -6
  84. package/social/github-social-preview.svg +119 -100
  85. package/social/readme-hero.svg +12 -12
  86. package/social/section-agents.svg +57 -0
  87. package/social/section-author.svg +54 -0
  88. package/social/section-dashboard.svg +59 -0
  89. package/social/section-devil.svg +54 -0
  90. package/social/section-hooks.svg +51 -0
  91. package/social/section-install.svg +42 -0
  92. package/social/section-learning.svg +52 -0
  93. package/social/section-mcp.svg +46 -0
  94. package/social/section-memory.svg +57 -0
  95. package/social/section-parallel.svg +72 -0
  96. package/social/section-routing.svg +51 -0
  97. package/social/x-card-agents-grid.svg +6 -6
  98. package/tests/dashboard/data.test.js +235 -0
  99. package/tests/dashboard/server.test.js +240 -0
  100. package/tests/evolve/analyze.test.js +169 -0
  101. package/tests/evolve/proposals.test.js +173 -0
  102. package/tests/evolve/stats.test.js +167 -0
  103. package/tests/mcp/catalog.test.js +98 -0
  104. package/tests/mcp/client.test.js +113 -0
  105. package/tests/mcp/resources-prompts.test.js +70 -0
  106. package/tests/mcp/tools.test.js +159 -0
  107. package/tests/replay/bundle.test.js +181 -0
  108. package/tests/replay/replay.test.js +131 -0
  109. package/tests/router/classify.test.js +164 -0
  110. package/tests/safety/patterns.test.js +94 -0
  111. package/tests/safety/prompt-injection-guard.test.js +111 -0
  112. package/tests/safety/token-budget.test.js +119 -0
  113. package/tests/supply-chain/manifest.test.js +147 -0
  114. package/tests/supply-chain/sbom.test.js +170 -0
  115. package/tests/supply-chain/verify.test.js +146 -0
  116. package/tests/swarm/build-plan.test.js +188 -0
  117. package/wiki/Agent-Reference.md +58 -7
  118. package/wiki/FAQ.md +204 -7
  119. package/wiki/Home.md +104 -29
  120. package/wiki/Hook-Reference.md +1 -1
  121. package/wiki/Installation-Guide.md +109 -6
  122. package/wiki/Platform-Support.md +189 -72
  123. package/wiki/Skill-Reference.md +101 -6
  124. package/.agent/rules/README.md +0 -108
  125. package/.agent/rules/agents.md +0 -94
  126. package/.agent/rules/code-review.md +0 -124
  127. package/.agent/rules/coding-style.md +0 -122
  128. package/.agent/rules/design-quality.md +0 -63
  129. package/.agent/rules/development-workflow.md +0 -44
  130. package/.agent/rules/git-mastery.md +0 -366
  131. package/.agent/rules/git-workflow.md +0 -24
  132. package/.agent/rules/hooks.md +0 -25
  133. package/.agent/rules/kodelyth-always-on.md +0 -63
  134. package/.agent/rules/kodelyth-quickstart.md +0 -207
  135. package/.agent/rules/observability.md +0 -390
  136. package/.agent/rules/patterns.md +0 -50
  137. package/.agent/rules/performance.md +0 -178
  138. package/.agent/rules/security.md +0 -58
  139. package/.agent/rules/smart-debug.md +0 -241
  140. package/.agent/rules/soul.md +0 -32
  141. package/.agent/rules/testing.md +0 -46
  142. package/.agent/skills/api-guardian.md +0 -279
  143. package/.agent/skills/architect.md +0 -211
  144. package/.agent/skills/build-error-resolver.md +0 -114
  145. package/.agent/skills/chief-of-staff.md +0 -151
  146. package/.agent/skills/code-architect.md +0 -71
  147. package/.agent/skills/code-explorer.md +0 -69
  148. package/.agent/skills/code-reviewer.md +0 -237
  149. package/.agent/skills/code-simplifier.md +0 -47
  150. package/.agent/skills/comment-analyzer.md +0 -45
  151. package/.agent/skills/conversation-analyzer.md +0 -52
  152. package/.agent/skills/cpp-build-resolver.md +0 -90
  153. package/.agent/skills/cpp-reviewer.md +0 -72
  154. package/.agent/skills/csharp-reviewer.md +0 -101
  155. package/.agent/skills/dart-build-resolver.md +0 -201
  156. package/.agent/skills/database-reviewer.md +0 -91
  157. package/.agent/skills/debug-detective.md +0 -409
  158. package/.agent/skills/doc-updater.md +0 -107
  159. package/.agent/skills/docs-lookup.md +0 -68
  160. package/.agent/skills/e2e-runner.md +0 -107
  161. package/.agent/skills/flutter-reviewer.md +0 -243
  162. package/.agent/skills/gan-evaluator.md +0 -209
  163. package/.agent/skills/gan-generator.md +0 -131
  164. package/.agent/skills/gan-planner.md +0 -99
  165. package/.agent/skills/go-build-resolver.md +0 -94
  166. package/.agent/skills/go-reviewer.md +0 -76
  167. package/.agent/skills/harness-optimizer.md +0 -35
  168. package/.agent/skills/healthcare-reviewer.md +0 -83
  169. package/.agent/skills/java-build-resolver.md +0 -153
  170. package/.agent/skills/java-reviewer.md +0 -92
  171. package/.agent/skills/kodelyth-advisor.md +0 -172
  172. package/.agent/skills/kotlin-build-resolver.md +0 -118
  173. package/.agent/skills/kotlin-reviewer.md +0 -159
  174. package/.agent/skills/loop-operator.md +0 -36
  175. package/.agent/skills/migration-guide.md +0 -368
  176. package/.agent/skills/opensource-forker.md +0 -198
  177. package/.agent/skills/opensource-packager.md +0 -249
  178. package/.agent/skills/opensource-sanitizer.md +0 -188
  179. package/.agent/skills/pair-programmer.md +0 -260
  180. package/.agent/skills/performance-optimizer.md +0 -446
  181. package/.agent/skills/planner.md +0 -212
  182. package/.agent/skills/pr-test-analyzer.md +0 -45
  183. package/.agent/skills/python-reviewer.md +0 -98
  184. package/.agent/skills/pytorch-build-resolver.md +0 -120
  185. package/.agent/skills/refactor-cleaner.md +0 -85
  186. package/.agent/skills/rust-build-resolver.md +0 -148
  187. package/.agent/skills/rust-reviewer.md +0 -94
  188. package/.agent/skills/security-reviewer.md +0 -108
  189. package/.agent/skills/seo-specialist.md +0 -62
  190. package/.agent/skills/silent-failure-hunter.md +0 -50
  191. package/.agent/skills/tdd-guide.md +0 -91
  192. package/.agent/skills/type-design-analyzer.md +0 -41
  193. package/.agent/skills/typescript-reviewer.md +0 -112
  194. package/.agent/skills/ux-reviewer.md +0 -483
  195. package/.agent/workflows/agent-sort.md +0 -23
  196. package/.agent/workflows/aside.md +0 -164
  197. package/.agent/workflows/build-fix.md +0 -62
  198. package/.agent/workflows/checkpoint.md +0 -74
  199. package/.agent/workflows/claw.md +0 -23
  200. package/.agent/workflows/code-review.md +0 -289
  201. package/.agent/workflows/context-budget.md +0 -23
  202. package/.agent/workflows/cpp-build.md +0 -173
  203. package/.agent/workflows/cpp-review.md +0 -132
  204. package/.agent/workflows/cpp-test.md +0 -251
  205. package/.agent/workflows/devfleet.md +0 -23
  206. package/.agent/workflows/docs.md +0 -23
  207. package/.agent/workflows/e2e.md +0 -268
  208. package/.agent/workflows/eval.md +0 -23
  209. package/.agent/workflows/evolve.md +0 -178
  210. package/.agent/workflows/feature-dev.md +0 -49
  211. package/.agent/workflows/flutter-build.md +0 -164
  212. package/.agent/workflows/flutter-review.md +0 -116
  213. package/.agent/workflows/flutter-test.md +0 -144
  214. package/.agent/workflows/gan-build.md +0 -99
  215. package/.agent/workflows/gan-design.md +0 -35
  216. package/.agent/workflows/go-build.md +0 -183
  217. package/.agent/workflows/go-review.md +0 -148
  218. package/.agent/workflows/go-test.md +0 -268
  219. package/.agent/workflows/gradle-build.md +0 -70
  220. package/.agent/workflows/harness-audit.md +0 -73
  221. package/.agent/workflows/hookify-configure.md +0 -14
  222. package/.agent/workflows/hookify-help.md +0 -46
  223. package/.agent/workflows/hookify-list.md +0 -21
  224. package/.agent/workflows/hookify.md +0 -50
  225. package/.agent/workflows/instinct-export.md +0 -66
  226. package/.agent/workflows/instinct-import.md +0 -114
  227. package/.agent/workflows/instinct-status.md +0 -59
  228. package/.agent/workflows/jira.md +0 -106
  229. package/.agent/workflows/kotlin-build.md +0 -174
  230. package/.agent/workflows/kotlin-review.md +0 -140
  231. package/.agent/workflows/kotlin-test.md +0 -312
  232. package/.agent/workflows/learn-eval.md +0 -116
  233. package/.agent/workflows/learn.md +0 -70
  234. package/.agent/workflows/loop-start.md +0 -32
  235. package/.agent/workflows/loop-status.md +0 -24
  236. package/.agent/workflows/model-route.md +0 -26
  237. package/.agent/workflows/multi-backend.md +0 -158
  238. package/.agent/workflows/multi-execute.md +0 -315
  239. package/.agent/workflows/multi-frontend.md +0 -158
  240. package/.agent/workflows/multi-plan.md +0 -268
  241. package/.agent/workflows/multi-workflow.md +0 -191
  242. package/.agent/workflows/orchestrate.md +0 -135
  243. package/.agent/workflows/plan.md +0 -117
  244. package/.agent/workflows/pm2.md +0 -272
  245. package/.agent/workflows/projects.md +0 -39
  246. package/.agent/workflows/promote.md +0 -41
  247. package/.agent/workflows/prompt-optimize.md +0 -23
  248. package/.agent/workflows/prp-commit.md +0 -112
  249. package/.agent/workflows/prp-implement.md +0 -385
  250. package/.agent/workflows/prp-plan.md +0 -502
  251. package/.agent/workflows/prp-pr.md +0 -184
  252. package/.agent/workflows/prp-prd.md +0 -447
  253. package/.agent/workflows/prune.md +0 -31
  254. package/.agent/workflows/python-review.md +0 -297
  255. package/.agent/workflows/quality-gate.md +0 -29
  256. package/.agent/workflows/refactor-clean.md +0 -80
  257. package/.agent/workflows/resume-session.md +0 -156
  258. package/.agent/workflows/review-pr.md +0 -37
  259. package/.agent/workflows/rules-distill.md +0 -20
  260. package/.agent/workflows/rust-build.md +0 -187
  261. package/.agent/workflows/rust-review.md +0 -142
  262. package/.agent/workflows/rust-test.md +0 -308
  263. package/.agent/workflows/santa-loop.md +0 -175
  264. package/.agent/workflows/save-session.md +0 -275
  265. package/.agent/workflows/sessions.md +0 -333
  266. package/.agent/workflows/setup-pm.md +0 -80
  267. package/.agent/workflows/skill-create.md +0 -174
  268. package/.agent/workflows/skill-health.md +0 -54
  269. package/.agent/workflows/tdd.md +0 -231
  270. package/.agent/workflows/test-coverage.md +0 -69
  271. package/.agent/workflows/update-codemaps.md +0 -72
  272. package/.agent/workflows/update-docs.md +0 -84
  273. 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.