Agent skill · Audited from source

retentioneering-tools

skill · retentioneering/retentioneering-toolsApache-2.0 licenceAudited 25 Oct 2026 · source 79512eade603

★ 938pushed todayversion 1.0.0
✕BLOCKGrade D · 64/100 · 25 findings · 79512ea
938repo stars · whole retentioneering/retentioneering-tools

Is it safe? No — BLOCK, grade D (64/100). We read this skill's source at commit 79512eade603 and observed filesystem and network access and a hard-coded secret (see the findings). The audit raised 25 findings, 5 critical or high. What it does: Help the user turn their Retentioneering ideas, friction reports, bug findings, or feature needs into high-quality upstream contributions: from capturing and validating the idea, through minimal reproductions and issue…

Ask an AI about this pageGChatGPTCClaudePPerplexityGeGeminiXGrok
More
Cite

Cite this page

ModelsAtlas. “retentioneering-tools (retentioneering/retentioneering-tools)”. Retrieved 25 Oct 2026. https://modelsatlas.com/skills/retentioneering/retentioneering-tools

Blocked. The page stays public so you can check this skill if someone recommended it to you. The audit found 5 critical or high findings, starting with “Prompt injection” in .agents/skills/retentioneering-contributing/references/proposal-templates.md:16. Do not install it without reading them.

Trust audit

Audit 0.4.1 · source read 25 Oct 2026

Trust score64/100✕BLOCK D
0 critical5 high3 medium18 low1 info

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

What the source does

  • FilesystemDeclared6 observations
  • NetworkDeclared3 observations
  • ShellNone observedNo commands run in the source
  • DependenciesNot pinnedSome versions float
  • SecretsFoundSee the findings; values are never shown

Five audit layers

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

Gates applied: no behavioural pass.

Findings (25)

HIGHPrompt injectionprompt.zero_width · .agents/skills/retentioneering-contributing/references/proposal-templates.md:16
F-01 Prompt injectionCWE-94 · CWE-1427Layer L2
```python
Why
invisible characters in instruction text
Fix
strip non-printing characters
HIGHPrompt injectionprompt.zero_width · .agents/skills/retentioneering-contributing/references/proposal-templates.md:18
F-01 Prompt injectionCWE-94 · CWE-1427Layer L2
```
Why
invisible characters in instruction text
Fix
strip non-printing characters
HIGHPrompt injectionprompt.zero_width · .agents/skills/retentioneering-contributing/references/proposal-templates.md:39
F-01 Prompt injectionCWE-94 · CWE-1427Layer L2
```python
Why
invisible characters in instruction text
Fix
strip non-printing characters
HIGHPrompt injectionprompt.zero_width · .agents/skills/retentioneering-contributing/references/proposal-templates.md:41
F-01 Prompt injectionCWE-94 · CWE-1427Layer L2
```
Why
invisible characters in instruction text
Fix
strip non-printing characters
HIGHPrompt injectionprompt.zero_width · .agents/skills/retentioneering-contributing/references/proposal-templates.md:44
F-01 Prompt injectionCWE-94 · CWE-1427Layer L2
```python
Why
invisible characters in instruction text
Fix
strip non-printing characters
MEDIUMInventory / provenanceinv.binary · src/retentioneering/datasets/ecom.csv.gz
F-13 Inventory / provenanceCWE-1104Layer L0
ecom.csv.gz
Why
a compiled or binary member cannot be reviewed from source
Fix
ship source, or explain the binary in the README
MEDIUMNetwork egressnet.raw_ip · js/widget/demo/rest-host-demo.ts:65
F-04 Network egressCWE-200 · CWE-319Layer L1
url: `http://127.0.0.1:${port}`,
Why
No further detail recorded for this rule.
Fix
—
MEDIUMHard-coded secretssecret.generic · src/retentioneering/paths/anchors.py:347
F-03 Hard-coded secretsCWE-798 · CWE-321Layer L1
token: "…",
Why
No further detail recorded for this rule.
Fix
—
LOWInventory / provenanceinv.hidden_file · .git-blame-ignore-revs
F-13 Inventory / provenanceCWE-1104Layer L0
.git-blame-ignore-revs
Why
hidden member outside the usual dotfiles
Fix
review its purpose
LOWInventory / provenanceinv.hidden_file · .gitleaks.toml
F-13 Inventory / provenanceCWE-1104Layer L0
.gitleaks.toml
Why
hidden member outside the usual dotfiles
Fix
review its purpose
LOWInventory / provenanceinv.hidden_file · .pre-commit-config.yaml
F-13 Inventory / provenanceCWE-1104Layer L0
.pre-commit-config.yaml
Why
hidden member outside the usual dotfiles
Fix
review its purpose
LOWInventory / provenanceinv.hidden_file · src/retentioneering/datasets/.!51949!ecom.csv.gz
F-13 Inventory / provenanceCWE-1104Layer L0
.!51949!ecom.csv.gz
Why
hidden member outside the usual dotfiles
Fix
review its purpose
LOWCode injectioncode.eval_exec · docs/scripts/capture_readme_screenshots.py:101
F-02 Code injectionCWE-78 · CWE-94 · CWE-95Layer L1
exec(compile(source, str(notebook), "exec"), namespace)
Why
evaluates text as code
Fix
remove; use a parser or a dispatch table
LOWCode injectioncode.eval_exec · docs/scripts/generate_widget_demos.py:185
F-02 Code injectionCWE-78 · CWE-94 · CWE-95Layer L1
widget = eval(tag.cmd, {"stream": stream_for(tag.source_file)})  # noqa: S307 -- trusted, hand-authored template content
Why
evaluates text as code
Fix
remove; use a parser or a dispatch table
LOWInsecure cryptocrypto.weak_hash · src/retentioneering/eventstream/eventstream.py:350
F-09 Insecure cryptoCWE-327 · CWE-338Layer L1
return hashlib.md5(payload.encode()).hexdigest()
Why
No further detail recorded for this rule.
Fix
—
LOWFilesystem / pathfs.traversal · js/viz-core/src/components/SettingsSidebar/SettingsSidebar.tsx:4
F-05 Filesystem / pathCWE-22 · CWE-59Layer L1
import { TransitionMatrixStore } from "../../stores/TransitionMatrixStore";
Why
No further detail recorded for this rule.
Fix
—
LOWFilesystem / pathfs.traversal · js/viz-core/src/components/SettingsSidebar/SettingsSidebar.tsx:7
F-05 Filesystem / pathCWE-22 · CWE-59Layer L1
import { type MatrixValueType, VALUE_TYPE_DESCRIPTIONS } from "../../utils/value-types";
Why
No further detail recorded for this rule.
Fix
—
LOWFilesystem / pathfs.traversal · js/viz-core/src/components/SettingsSidebar/SettingsSidebar.tsx:8
F-05 Filesystem / pathCWE-22 · CWE-59Layer L1
import { formatNumber, formatPopulation } from "../../utils/format-number";
Why
No further detail recorded for this rule.
Fix
—
LOWFilesystem / pathfs.traversal · js/viz-core/src/components/SettingsSidebar/SettingsSidebar.tsx:9
F-05 Filesystem / pathCWE-22 · CWE-59Layer L1
import { formatTime } from "../../utils/format-time";
Why
No further detail recorded for this rule.
Fix
—
LOWFilesystem / pathfs.traversal · js/viz-core/src/components/SettingsSidebar/SettingsSidebar.tsx:10
F-05 Filesystem / pathCWE-22 · CWE-59Layer L1
import { isTimeValueType } from "../../utils/value-types";
Why
No further detail recorded for this rule.
Fix
—
LOWNetwork egressnet.raw_ip · docs/scripts/record_readme_cluster_analysis.py:120
F-04 Network egressCWE-200 · CWE-319Layer L1
urllib.request.urlopen(f"http://127.0.0.1:{port}/api/status?token={TOKEN}")
Why
No further detail recorded for this rule.
Fix
—
LOWObfuscation / stealthobf.decode_call · js/viz-core/src/components/TransitionGraph/graph-view.ts:186
F-07 Obfuscation / stealthCWE-506 · CWE-94Layer L1
const binary = atob(base64);
Why
No further detail recorded for this rule.
Fix
—
LOWSupply chainsupply.unpinned · js/viz-core/package.json
F-08 Supply chainCWE-829 · CWE-1357Layer L1
@radix-ui/react-slider, @supabase/supabase-js, cytoscape, cytoscape-fcose, lucide-react, mobx, mobx-react-lite, react
Why
15 dependency range(s) float
Fix
pin exact versions or ship a lockfile
LOWSupply chainsupply.unpinned · js/widget/package.json
F-08 Supply chainCWE-829 · CWE-1357Layer L1
@retentioneering/viz-core, react, react-dom, @types/react, @types/react-dom, @vitejs/plugin-react, esbuild, typescript
Why
9 dependency range(s) float
Fix
pin exact versions or ship a lockfile
LOWPrompt injectionprompt.transfer_instruction · CHANGELOG.md:175
F-01 Prompt injectionCWE-94 · CWE-1427Layer L2
- **An anchor is a spec, not just an event name.** [`truncate_paths`](https://retentioneering.com/docs/data-processors/truncate-paths#anchoring-on-a-sequence-not-just-an-event)' `start_anchor`/`end_an
Why
an instruction to move sensitive data to an outside destination
Fix
remove; a skill never needs the user's secrets off the machine

Audit 0.4.1 · source sha 79512eade603 · 25 Oct 2026Report an issue or request a re-scan

Provenance

Who published it, and what the verdict is pinned to

  • Publisherretentioneering GitHub organizationOwner of the repository this skill is read from
  • Source folderretentioneering/retentioneering-toolsThe exact folder we audited
  • LicenceApache-2.0As the repository states it
  • Commit pinned for this verdict79512eade603A 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: Help the user turn their Retentioneering ideas, friction reports, bug findings, or feature needs into high-quality upstream contributions: from capturing and validating the idea, through minimal reproductions and issue…

---
name: retentioneering-contributing
description: >
  Help the user turn their Retentioneering ideas, friction reports, bug
  findings, or feature needs into high-quality upstream contributions: from
  capturing and validating the idea, through minimal reproductions and issue
  drafts, to preparing, testing, and submitting a pull request that follows
  this repository's conventions. Use when the user says they found a bug,
  wants a feature, wrote a workaround worth upstreaming, or asks how to
  contribute, open an issue, or make a PR to retentioneering-tools.
license: Apache-2.0
compatibility: >
  Requires a git checkout of retentioneering-tools, Python >= 3.10 with uv,
  and Node.js only when JS/widget code is touched. The gh CLI is optional
  but recommended for PR submission.
metadata:
  author: retentioneering
  version: "1.0.0"
  package: retentioneering
  category: developer-tools
  keywords: >-
    open source contribution, pull request, bug report, issue template,
    minimal reproduction, code review, oss workflow, github, retentioneering
  homepage: https://retentioneering.com
  documentation: https://retentioneering.com/docs
  repository: https://github.com/retentioneering/retentioneering-tools
---

# Contributing to retentioneering-tools

## Objective

Convert a user's observation — a bug, a paper cut, a missing capability, a workaround
they keep re-writing — into the smallest upstream change that would have prevented it,
packaged so maintainers can accept it quickly.

## Bundled references

| File | Read it when |
|---|---|
| `references/repo-conventions.md` | before touching code — build/test/docs commands, architecture rules, naming, sync obligations |
| `references/proposal-templates.md` | when drafting — issue/feature/PR templates with worked examples |

## The full route: idea → merged PR

### Stage 1 — Capture the observation properly (do this even for "small" ideas)

Record four things while they are fresh:
1. **Expectation** — what the user believed would happen (quote the docstring/docs page
   that created the expectation, if any).
2. **Reality** — what actually happened (exact error text or wrong output).
3. **Cost** — time lost, wrong conclusion nearly shipped, workaround written.
4. **Environment** — `retentioneering.__version__`, Python, OS, install source
   (pip wheel vs source checkout).

Field lesson: reports formatted as expectation/reality/cost/repro get acted on;
"X is broken" reports stall.

### Stage 2 — Validate against the CURRENT version

Many pain points are already fixed on `v5-migration` — verify before drafting:

1. `git log --oneline -30` and `CHANGELOG.md` — search keywords from the observation.
2. Search existing issues/PRs: `gh issue list --search "<keywords>"`, `gh pr list ...`.
3. Reproduce on the current checkout (see Stage 3). If it no longer reproduces, the
   contribution may become a docs clarification or a regression test instead — both welcome.

### Stage 3 — Minimal reproduction (the heart of a bug report)

Build the smallest toy that shows the gap, e.g.:

```python
import pandas as pd
from retentioneering import Eventstream
df = pd.DataFrame({"user_id": ["u1","u1","u2"], "event": ["a","b","a"],
                   "timestamp": pd.date_range("2026-01-01", periods=3, freq="1min")})
# EXPECTED: ...       ACTUAL: ...
```

Rules: synthetic data only (never the user's real log); deterministic (fixed frames, no
randomness without seed); one behavior per repro; assert the expectation so the repro
doubles as a failing test.

### Stage 4 — Choose the contribution shape

| Situation | Shape |
|---|---|
| Clear defect with repro | Issue with repro; PR with fix + regression test if user wants to go further |
| Surprising-but-documented behavior | Docs PR (docstring is the source of truth — site pages regenerate from it) |
| Missing capability | Feature issue: use-case first, proposed signature second, evidence third (see templates) |
| Repeated workaround in user's code | Extract as proposed API: show the workaround, its cost, the proposed call replacing it |
| Wrong-conclusion trap (library was silent) | Frame as "missing signal": what the library knew and did not surface; propose the warning/field |

For API proposals, the accepted framing (from templates): problem → evidence of frequency
→ proposed signature → semantics incl. edge cases → acceptance criteria → migration notes.

### Stage 5 — Implement (when making a PR, not just an issue)

Read `references/repo-conventions.md` first. Non-negotiables:

1. Fork or branch from `master`-tracking `v5-migration`; one logical change per PR.
2. **`make install-dev`** — installs deps (`uv sync` + `npm install`) and wires the git hook
   (a one-time-per-clone step) so commits are auto-checked; skip it and commits bypass the hooks
   locally and CI's `lint` job flags the formatting on your PR. Add `make build` only when
   touching widgets/JS.
3. Follow naming conventions (ADR-0008): `path_col/event_col/timestamp_col/session_col`,
   `start_anchor/end_anchor`, verb-first processors, noun widgets, `<widget>_data` twins.
4. All DuckDB execution goes through the unified query engine (L1) — no ad-hoc
   `duckdb.sql` with replacement-scan idioms (superseded ADR-0002).
5. Add/extend tests next to the code area (`tests/...`); a bug fix MUST include the
   failing-before test from Stage 3.
6. Keep the loud-and-helpful error pattern: errors that list valid values/keys are the
   house style; silent degradation (dropped rows, empty results without a signal) is an
   auto-reject.
7. Sync obligations when renaming/changing API: MCP tool layer mirrors Eventstream
   method names; JS metric editor consumes the Python metric schema; docstrings feed the
   docs site — update all in the same PR (`uv run python docs/scripts/render_pages.py`).

### Stage 6 — Pre-flight and submit

```bash
uv run pre-commit run --all-files      # ruff lint+format, gitleaks, hygiene
uv run pytest tests/ -v                # full suite (C

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 79512ea

uv run pre-commit run --all-files      # ruff lint+format, gitleaks, hygiene
uv run pytest tests/ -v                # full suite (CI runs 3.10–3.13)
uv run python docs/scripts/render_pages.py   # if docstrings changed
uv sync                              # python deps incl. dev group (pytest, ruff, pre-commit)
uv run pytest tests/ -v              # full suite; single file/test supported
uv run pre-commit run --all-files    # ruff lint+format, gitleaks, hygiene hooks

Commands as the repository documents them: shown, never run by us. Our verdict covers commit 79512eade603 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
CodexMentioned in its text, not testedSkills for Codex · About Codex
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 D 64 / 100

    first audit · source 79512eade603

Similar skills

diagram-design✓SAFE

cathrynlavery/diagram-design

Create branded architecture, architecture delta, IT current-state, flowchart, sequence, state machine, ER/data model, timeline, swimlane, quadrant, radar/spider, polar chart (polar/radial lollipop), loop/flywheel,…

★ 49kGrade B
turborepo!CAUTION

bklit/bklit-ui

Turborepo monorepo build system guidance. Triggers on: turbo.json, task pipelines, dependsOn, caching, remote cache, the "turbo" CLI, --filter, --affected, CI optimization, environment variables, internal packages,…

★ 1.8kGrade B
unit-tests✓SAFE

bklit/bklit-ui

Guardrails for adding unit tests in bklit-ui without over-testing. Use when the user mentions unit test, unit tests, tests, test coverage, add tests, write tests, vitest, jest, or asks whether something should be tested.

★ 1.8kGrade B
bklit-ship✓SAFE

bklit/bklit-ui

bklit-ui monorepo contributors only — ship a chart or component from Studio prototype to production in packages/ui with docs and registry.

★ 1.8kGrade B
academic-pptx✓SAFE

gabberflast/academic-pptx-skill

Use this skill whenever the user wants to create or improve a presentation for an academic context — conference papers, seminar talks, thesis defenses, grant briefings, lab meetings, invited lectures, or any…

★ 1.3kGrade B
guizang-material-illustration✓SAFE

op7418/guizang-material-illustration

Generate Guizang-style material illustrations, labeled explanatory visuals, material-styled chart illustrations, and data-first editorial images from articles, notes, product concepts, workplace reports, creator posts,…

★ 1.2kGrade B

Questions about retentioneering-tools

What does the retentioneering-tools skill do?
Python toolkit, MCP server, and agent skills for reproducible, auditable clickstream and event log analytics. Helps AI agents, data scientists and analysts build, validate, and cross-check product analytics, quantitative UX, customer journeys, graph-based user flows, behavioral segmentation, A/B tes
Is retentioneering-tools safe to install?
No — not without reading the findings first. The audit graded it D (64/100) and found 5 critical or high issues in the source. Each one is listed on this page with the file and line it is on.
What can retentioneering-tools access on my machine?
The audit observed that it reaches the network and reads or writes files. Each of those is consistent with what it says it does. Secrets in the source: found — see the findings.
Which assistants does retentioneering-tools work with?
Its documentation mentions claude-code, codex 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 (79512eade603), read on 2026-10-25. 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.