data-analysis — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited data-analysis (Agent Skill) and scored it 91/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 1 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 1 flagged
The text {match} is the classic direct prompt-injection phrasing. Placed in a skill body that the agent reads as trusted instructions, it tries to make the agent abandon its prior rules and follow whatever comes next — a full system-prompt override.
ignore/disregard/forget … previous instructions sentence.Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Perform structured exploratory data analysis (EDA) on tabular datasets. Covers loading, cleaning, profiling, statistical analysis, grouping, and communicating insights clearly.
import pandas as pd
import numpy as np
df = pd.read_csv("data.csv")
# Basic shape
print(f"Rows: {len(df):,}, Columns: {df.shape[1]}")
print(df.dtypes)
print(df.head(10))For Excel: pd.read_excel("data.xlsx", sheet_name=0) For JSON: pd.read_json("data.json") For large files: use pd.read_csv("data.csv", chunksize=10000)
# Missing values
missing = df.isnull().sum()
print(missing[missing > 0])
# Descriptive statistics (numeric)
print(df.describe())
# Cardinality (categorical)
for col in df.select_dtypes("object").columns:
print(f"{col}: {df[col].nunique()} unique values")
if df[col].nunique() <= 20:
print(df[col].value_counts())# Drop duplicate rows
df = df.drop_duplicates()
# Handle missing values
df["column"].fillna(df["column"].median(), inplace=True) # numeric
df["category"].fillna("Unknown", inplace=True) # categorical
# Fix data types
df["date"] = pd.to_datetime(df["date"])
df["price"] = df["price"].str.replace("$", "").astype(float)
# Strip whitespace in strings
df["name"] = df["name"].str.strip()# Central tendency and spread
df["revenue"].agg(["mean", "median", "std", "min", "max"])
# Percentiles
df["revenue"].quantile([0.25, 0.5, 0.75, 0.9, 0.99])
# Correlation matrix
corr = df.select_dtypes("number").corr()# Group by one dimension
summary = df.groupby("region")["revenue"].agg(["sum", "mean", "count"])
# Group by multiple dimensions
pivot = df.groupby(["year", "product_category"])["sales"].sum().unstack()
# Top N
top_products = df.groupby("product")["revenue"].sum().nlargest(10)# IQR method
Q1 = df["value"].quantile(0.25)
Q3 = df["value"].quantile(0.75)
IQR = Q3 - Q1
outliers = df[(df["value"] < Q1 - 1.5 * IQR) | (df["value"] > Q3 + 1.5 * IQR)]
print(f"Outliers: {len(outliers):,} rows ({len(outliers)/len(df):.1%})")df["date"] = pd.to_datetime(df["date"])
df = df.set_index("date").sort_index()
# Resample to monthly totals
monthly = df["revenue"].resample("ME").sum()
# Rolling average
df["revenue_7d_avg"] = df["revenue"].rolling(7).mean()Structure your output as:
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.