Agent skill · Audited from source

create-evlog-enricher

skill · hugorcd/evlogMIT licenceAudited 21 Oct 2026 · source 6c2be7d5fae1

★ 1,897pushed todayversion 0.9
✕BLOCKGrade F · 50/100 · 25 findings · 6c2be7d
1,897repo stars · whole hugorcd/evlog

Is it safe? No — BLOCK, grade F (50/100). We read this skill's source at commit 6c2be7d5fae1 and observed network and shell access and a hard-coded secret (see the findings). The audit raised 25 findings, 2 critical or high. What it does: Analyze application logs from the .evlog/logs/ directory. Use when debugging errors, investigating slow requests, understanding request patterns, or answering questions about application behavior. Reads structured…

Ask an AI about this pageGChatGPTCClaudePPerplexityGeGeminiXGrok
More
Cite

Cite this page

ModelsAtlas. “create-evlog-enricher (hugorcd/evlog)”. Retrieved 21 Oct 2026. https://modelsatlas.com/skills/hugorcd/create-evlog-enricher

Blocked. The page stays public so you can check this skill if someone recommended it to you. The audit found 2 critical or high findings, starting with “Code injection” in packages/cli/src/lib/init/pm.ts:41. Do not install it without reading them.

3 skills are called “create-evlog-enricher”. You are viewing hugorcd/evlog. 3 of them are BLOCK.

Trust audit

Audit 0.4.1 · source read 21 Oct 2026

Trust score50/100✕BLOCK F
0 critical2 high6 medium38 low2 info

BLOCK means the audit found something that could harm you or your machine. Grade F is shared by 105 of 14,816 audited skills.

What the source does

  • FilesystemNone observedNo reads or writes in the source
  • NetworkDeclared6 observations
  • ShellDeclared4 observations
  • DependenciesNot pinnedSome versions float
  • SecretsFoundSee the findings; values are never shown

Five audit layers

LayerWhat we checkResultFindings
L0 ProvenanceRepo owner, licence, archive status, activityWARN9
L1 Static sourceSecrets, path traversal, supply chain, hidden codeFAIL15
L2 InstructionsPrompt injection, authority framing, hidden directivesFAIL1
L3 InventoryThe files and declarations match the sourcePASS0
L4 SandboxRun in isolation and watch behaviourSKIPPED why0

Gates applied: no behavioural pass.

Findings (25)

HIGHCode injectioncode.eval_exec · packages/cli/src/lib/init/pm.ts:41
F-02 Code injectionCWE-78 · CWE-94 · CWE-95Layer L1
await exec(manager, args, { cwd, timeout: 5 * 60_000 })
Why
evaluates text as code
Fix
remove; use a parser or a dispatch table
HIGHPrompt injectionprompt.credential_read · apps/evi/agent/skills/cost-watchdog/SKILL.md:100
F-01 Prompt injectionCWE-94 · CWE-1427Layer L2
- **`anthropic/claude-haiku-5.5`, decided 2026-10-09: replaces `zai/glm-5.3-flash` as the base model.** It runs on the team's Anthropic BYOK key, which the gateway tries first, so its rows report `tot
Why
asks the agent to read credentials
Fix
—
MEDIUMInventory / provenanceinv.binary · apps/evi/vendor/agent-browser-eve-0.38.1-eve0.64.1.tgz
F-13 Inventory / provenanceCWE-1104Layer L0
agent-browser-eve-0.38.1-eve0.64.1.tgz
Why
a compiled or binary member cannot be reviewed from source
Fix
ship source, or explain the binary in the README
MEDIUMInventory / provenanceinv.binary · apps/just-use-evlog/public/fonts/Geist Pixel Line.otf
F-13 Inventory / provenanceCWE-1104Layer L0
Geist Pixel Line.otf
Why
a compiled or binary member cannot be reviewed from source
Fix
ship source, or explain the binary in the README
MEDIUMNetwork egressnet.beacon_words · apps/next-playground/app/page.tsx:313
F-04 Network egressCWE-200 · CWE-319Layer L1
id: 'browser-drain-beacon',
Why
No further detail recorded for this rule.
Fix
—
MEDIUMNetwork egressnet.beacon_words · apps/playground/app/config/tests.config.ts:837
F-04 Network egressCWE-200 · CWE-319Layer L1
id: 'browser-drain-beacon',
Why
No further detail recorded for this rule.
Fix
—
MEDIUMHard-coded secretssecret.generic · packages/evlog/test/e2e/axiom.e2e.ts:126
F-03 Hard-coded secretsCWE-798 · CWE-321Layer L1
apiKey: '…',
Why
No further detail recorded for this rule.
Fix
—
MEDIUMHard-coded secretssecret.generic · packages/evlog/test/e2e/better-stack.e2e.ts:58
F-03 Hard-coded secretsCWE-798 · CWE-321Layer L1
{ apiKey: '…', endpoint },
Why
No further detail recorded for this rule.
Fix
—
LOWInventory / provenanceinv.binary · apps/docs/public/fonts/Geist Pixel Line.otf
F-13 Inventory / provenanceCWE-1104Layer L0
Geist Pixel Line.otf
Why
a compiled or binary member cannot be reviewed from source
Fix
ship source, or explain the binary in the README
LOWInventory / provenanceinv.hidden_file · .node-version
F-13 Inventory / provenanceCWE-1104Layer L0
.node-version
Why
hidden member outside the usual dotfiles
Fix
review its purpose
LOWInventory / provenanceinv.hidden_file · apps/docs/content/1.start/.navigation.yml
F-13 Inventory / provenanceCWE-1104Layer L0
.navigation.yml
Why
hidden member outside the usual dotfiles
Fix
review its purpose
LOWInventory / provenanceinv.hidden_file · apps/docs/content/2.learn/.navigation.yml
F-13 Inventory / provenanceCWE-1104Layer L0
.navigation.yml
Why
hidden member outside the usual dotfiles
Fix
review its purpose
LOWInventory / provenanceinv.hidden_file · apps/docs/content/3.cli/.navigation.yml
F-13 Inventory / provenanceCWE-1104Layer L0
.navigation.yml
Why
hidden member outside the usual dotfiles
Fix
review its purpose
LOWInventory / provenanceinv.hidden_file · apps/docs/content/4.integrate/.navigation.yml
F-13 Inventory / provenanceCWE-1104Layer L0
.navigation.yml
Why
hidden member outside the usual dotfiles
Fix
review its purpose
LOWCode injectioncode.eval_exec · apps/evi/agent/lib/capture.test.ts:91
F-02 Code injectionCWE-78 · CWE-94 · CWE-95Layer L1
return new Function('document', 'window', `return ${expression}`)(page.document, page.window)
Why
evaluates text as code
Fix
remove; use a parser or a dispatch table
LOWCode injectioncode.eval_exec · apps/evi/agent/lib/content/handoff.test.ts:33
F-02 Code injectionCWE-78 · CWE-94 · CWE-95Layer L1
const result = await exec(command.replaceAll('/workspace/repo', path))
Why
evaluates text as code
Fix
remove; use a parser or a dispatch table
LOWFilesystem / pathfs.traversal · apps/docs/nuxt.config.ts:15
F-05 Filesystem / pathCWE-22 · CWE-59Layer L1
dir: '../../skills',
Why
No further detail recorded for this rule.
Fix
—
LOWFilesystem / pathfs.traversal · apps/docs/server/api/__sitemap__/urls.ts:2
F-05 Filesystem / pathCWE-22 · CWE-59Layer L1
import { collectSitemapUrls } from '../../utils/sitemap'
Why
No further detail recorded for this rule.
Fix
—
LOWFilesystem / pathfs.traversal · apps/docs/server/mcp/tools/estimate-log-cost.ts:8
F-05 Filesystem / pathCWE-22 · CWE-59Layer L1
} from '../../../app/utils/log-cost'
Why
No further detail recorded for this rule.
Fix
—
LOWFilesystem / pathfs.traversal · apps/evi/agent/lib/content/scan.test.ts:24
F-05 Filesystem / pathCWE-22 · CWE-59Layer L1
const root = resolve(import.meta.dirname, '../../../../..')
Why
No further detail recorded for this rule.
Fix
—
LOWFilesystem / pathfs.traversal · apps/evi/agent/lib/simplification/specialists.test.ts:4
F-05 Filesystem / pathCWE-22 · CWE-59Layer L1
import architectureAgent from '../../subagents/architecture_reviewer/agent'
Why
No further detail recorded for this rule.
Fix
—
LOWNetwork egressnet.metadata_ip · apps/evi/agent/lib/capture.test.ts:16
F-04 Network egressCWE-200 · CWE-319Layer L1
expect(validateCaptureUrl('http://169.254.169.254/latest')).toMatch(/outside the allowed/)
Why
cloud metadata endpoint: the classic SSRF credential grab
Fix
—
LOWNetwork egressnet.metadata_ip · scripts/content-lint/lib/net.test.mjs:6
F-04 Network egressCWE-200 · CWE-319Layer L1
for (const address of ['127.0.0.1', '10.0.0.1', '172.16.0.1', '172.31.255.255', '192.168.1.1', '169.254.169.254', '0.0.0.0', '100.64.0.1', '::1', 'fc00::1', 'fe80::1', '::ffff:127.0.0.1']) {
Why
cloud metadata endpoint: the classic SSRF credential grab
Fix
—
LOWNetwork egressnet.metadata_ip · scripts/content-lint/lib/net.test.mjs:39
F-04 Network egressCWE-200 · CWE-319Layer L1
expect(await refuseHost('metadata.google.internal')).toMatch(/local name/)
Why
cloud metadata endpoint: the classic SSRF credential grab
Fix
—

Audit 0.4.1 · source sha 6c2be7d5fae1 · 21 Oct 2026Report an issue or request a re-scan

Provenance

Who published it, and what the verdict is pinned to

  • Publisherhugorcd GitHub organizationOwner of the repository this skill is read from
  • Source folderhugorcd/evlogThe exact folder we audited
  • LicenceMITAs the repository states it
  • Commit pinned for this verdict6c2be7d5fae1A new audit runs when the source changes
  • Repository statusNot archivedPushed today
  • Sandboxed runNot runSkills are read, not executed; layer L4 is skipped

What it tells the agent

Full source on GitHub ↗

Its description: Analyze application logs from the .evlog/logs/ directory. Use when debugging errors, investigating slow requests, understanding request patterns, or answering questions about application behavior. Reads structured…

---
name: analyze-logs
description: Analyze application logs from the .evlog/logs/ directory. Use when debugging errors, investigating slow requests, understanding request patterns, or answering questions about application behavior. Reads structured NDJSON wide events written by evlog's file system drain.
license: MIT
metadata:
  author: HugoRCD
  version: "0.3"
---

# Analyze application logs

Read and analyze structured wide-event logs from the local `.evlog/logs/` directory to debug errors, investigate performance issues, and understand application behavior.

## When to Use

- User asks to debug an error, investigate a bug, or understand why something failed
- User asks about request patterns, slow endpoints, or error rates
- User asks "what happened" or "what's going on" with their application
- User asks to analyze logs, check recent errors, or review application behavior
- User mentions a specific error message or status code they're seeing

## Finding the logs

Try the CLI first; it reads both file layouts, every dated file, and knows where the project's drain writes. Prefer the copy the project installed (`pnpm evlog`, or the equivalent for its package manager). The wrappers that fetch on demand (`npx`, `bunx`, `npm exec`) install `@evlog/cli` when the project has none, which runs a release the lockfile never pinned. Ask before that happens.

```bash
pnpm evlog logs --json                       # the last 50 events
pnpm evlog logs errors --since 1h --json     # what failed
pnpm evlog logs slow --over 1s --json        # what was slow, worst first
pnpm evlog logs "$REQUEST_ID" --json         # one request, every event with that id
pnpm evlog logs stats --json                 # per route: count, errors, p50, p95; by status and level
pnpm evlog logs --where 'payment.amount>5000' --where audit.outcome=failure --json
```

`--json` is an envelope (`sources`, `view`, `matched`, `events`; `stats` carries `stats` instead); filters are `--since`, `--until`, `--level`, `--path`, `--status` (`500` or `5xx`), `--where field=value|field>n|field~regex|field|!field` on any dotted field (repeatable), `--limit`, `--dir` for a non-default directory, and `--url` for an app on the memory drain that exposes `readMemoryLogs()` over HTTP. From a monorepo root it reads every app's `.evlog/logs` and labels each event. Docs: https://www.evlog.dev/cli/logs. If the CLI is unavailable or the user declines it, read the files directly as below.

Logs are written by evlog's file system drain as `.jsonl` files, organized by date.

**Format detection**: The drain supports two modes:
- **NDJSON** (default, `pretty: false`): One compact JSON object per line. Parse line-by-line.
- **Pretty** (`pretty: true`): Multi-line indented JSON per event. Parse by reading the entire file and splitting on top-level objects (e.g. `JSON.parse('[' + content.replace(/\}\n\{/g, '},{') + ']')`) or use a streaming JSON parser.

Always check the first few bytes of the file to detect the format: if the second character is a newline or `"`, it's NDJSON; if it's a space or newline followed by spaces, it's pretty-printed.

**Search order.** Check these locations relative to the project root:

1. `.evlog/logs/` (default)
2. Any `.evlog/logs/` inside app directories (monorepos: `apps/*/.evlog/logs/`)

Use glob to find log files:

```
.evlog/logs/*.jsonl
*/.evlog/logs/*.jsonl
apps/*/.evlog/logs/*.jsonl
```

Files are named by date: `2026-03-14.jsonl`. Start with the most recent file.

**Programmatic reading**: instead of hand-parsing, a small script can use the readers shipped with evlog: `readFsLogs()` and `tailFsLogs()` from `evlog/fs` are async generators that handle both formats, date ordering, and filtering. Prefer them when the project already has evlog installed and the analysis needs more than a quick grep.

**Memory drain alternative**: some apps use the Memory adapter (`evlog/memory`) instead of (or alongside) the FS drain, exposing recent events through a dev-only HTTP endpoint via `readMemoryLogs()`. If `.evlog/logs/` is empty but the app wires `createMemoryDrain()`, query that endpoint instead.

## If no logs are found

Before wiring a new drain, you can try `npx evlog doctor --json`, which checks whether `evlog` is installed and whether a local `.evlog/logs` drain already exists (read-only). Optional; skip if the CLI is unavailable.

The file system drain may not be enabled. On Nuxt, Nitro, Next.js, TanStack Start, Hono, Express, or Fastify, the fastest path is the CLI, which detects the framework and wires the fs drain (its default dev drain) in one pass:

```bash
npx evlog init --dry-run --yes   # preview first
npx evlog init --yes --drain fs  # apply
```

Ask before running it. On other frameworks (or if the user declines), guide the manual setup:

```typescript
import { defineEvlog } from 'evlog'
import { createFsDrain } from 'evlog/fs'

// Nuxt / Nitro: evlog.config.ts at the app root, which the module loads
export default defineEvlog({ drain: createFsDrain() })

// Hono / Express / Elysia: pass in middleware options
app.use(evlog({ drain: createFsDrain() }))

// Fastify: pass in plugin options
await app.register(evlog, { drain: createFsDrain() })

// NestJS: pass in module options
EvlogModule.forRoot({ drain: createFsDrain() })

// Standalone: pass to initLogger
initLogger({ drain: createFsDrain() })
```

After setup, the user needs to trigger some requests to generate logs, then re-analyze.

## Log format

Each line is a self-contained JSON object (wide event). Key fields:

| Field | Type | Description |
|-------|------|-------------|
| `timestamp` | `string` | ISO 8601 timestamp |
| `level` | `string` | `info`, `warn`, `error`, `debug` |
| `service` | `string` | Service name |
| `environment` | `string` | `development`, `production`, etc. |
| `method` | `string` | HTTP method (`GET`, `POST`, etc.) |
| `path` | `string` | Request path (`/api/checkout`) |
| `status` | `number` | HTTP response status code |
| `duration` | `st

Excerpt, first 6,000 characters of SKILL.md, verbatim from the audited commit. It is text from someone else’s repository, quoted so you can judge it before your agent reads it.

Install

Pinned to the audited commit 6c2be7d

npm install evlog
npm install
npx skills add https://www.evlog.dev
npm install --save-dev @evlog/cli
npm install @nuxthub/core @evlog/nuxthub

Commands as the repository documents them: shown, never run by us. Our verdict covers commit 6c2be7d5fae1 only.

Works in which agents?

What its own text says, not a test

AgentStatusMore
Claude CodeMentioned in its text, not testedSkills for Claude Code · About Claude Code
Claude DesktopMentioned in its text, not testedSkills for Claude Desktop · About Claude Desktop
CodexMentioned in its text, not testedSkills for Codex · About Codex
GitHub CopilotMentioned in its text, not testedSkills for GitHub Copilot · About GitHub Copilot
CursorMentioned in its text, not testedSkills for Cursor · About Cursor
“Mentioned” means the skill’s text names the agent. We have not run it there.

Audit history

Every audit, every source change

  1. ✕BLOCK F 50 / 100

    first audit · source 6c2be7d5fae1

README badge

For maintainers · shows the latest audit

ModelsAtlas: BLOCK FMODELSATLASBLOCK · F
[![ModelsAtlas: BLOCK F](https://modelsatlas.com/skills/hugorcd/create-evlog-enricher/badge.svg)](https://modelsatlas.com/skills/hugorcd/create-evlog-enricher/)

The badge shows our verdict and grade for this skill, and links back to this page. It changes when the audit does.

review-logging-patterns✓SAFE

hugorcd/evlog

Review code for logging patterns and suggest evlog adoption. Optionally use the evlog CLI, shipped with the evlog package (`evlog init` to wire evlog, `evlog agents` to write the conventions into AGENTS.md, `evlog map`…

★ 1.9kGrade B
create-evlog-framework-integration✕BLOCK

hugorcd/evlog

Analyze application logs from the .evlog/logs/ directory. Use when debugging errors, investigating slow requests, understanding request patterns, or answering questions about application behavior. Reads structured…

★ 1.9kGrade F
create-evlog-adapter✕BLOCK

hugorcd/evlog

Analyze application logs from the .evlog/logs/ directory. Use when debugging errors, investigating slow requests, understanding request patterns, or answering questions about application behavior. Reads structured…

★ 1.9kGrade F
next-dev-loop✓SAFE

vercel/next.js

Verify Next.js runtime behavior after editing app code. Use this skill to confirm a change actually works in a running app — not just that it compiles or type-checks. Combines /_next/mcp (Next.js's view) with…

★ 143kGrade B
next-cache-components-optimizer✓SAFE

vercel/next.js

Optimize the meaningful UI available immediately from a Next.js route on an initial load (hard navigation) or named client-side navigation (soft navigation). Encode the goal as a failing @next/playwright instant() e2e…

★ 143kGrade B
next-cache-components-adoption✓SAFE

vercel/next.js

Turn on Cache Components in a Next.js app and resolve the blocking routes it surfaces. Use when the user wants to enable, adopt, or migrate to Cache Components, flip the `cacheComponents` flag, work through a flood of…

★ 143kGrade B

Add this badge to your README

[![ModelsAtlas: BLOCK F](https://modelsatlas.com/skills/hugorcd/create-evlog-enricher/badge.svg)](https://modelsatlas.com/skills/hugorcd/create-evlog-enricher/)

Questions about create-evlog-enricher

What does the create-evlog-enricher skill do?
Digging through logs is not observability. It's hope — wide events, structured errors, TypeScript-first, every runtime.
Is create-evlog-enricher safe to install?
No — not without reading the findings first. The audit graded it F (50/100) and found 2 critical or high issues in the source. Each one is listed on this page with the file and line it is on.
What can create-evlog-enricher access on my machine?
The audit observed that it reaches the network and runs shell commands. Each of those is consistent with what it says it does. Secrets in the source: found — see the findings.
Which assistants does create-evlog-enricher work with?
Its documentation mentions claude-code, claude-desktop, codex, copilot and cursor. That is what the text claims, not a compatibility test we ran.
How current is this page?
The grade is for one exact copy of the source (6c2be7d5fae1), read on 2026-10-21. The repository is watched, and a new audit runs when it changes — this is the first audit.

Sources

Spotted something wrong? Report a correction · Methodology

Keep going in your AI

Opens with this page as the source. We add nothing else to the prompt.