isabl-project-report — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited isabl-project-report (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
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.
You are helping generate a status report for an Isabl project.
Work through these steps systematically:
import isabl_cli as ii
project = ii.get_instance("projects", PROJECT_PK)
print(f"Project: {project.title}")
print(f"Short title: {project.short_title}")
print(f"PI: {project.principal_investigator}")
print(f"Analyst: {project.analyst}")
print(f"Description: {project.description}")from collections import Counter
experiments = ii.get_experiments(projects=PROJECT_PK)
# By technique
techniques = Counter(e.technique.method for e in experiments)
print("Experiments by technique:")
for tech, count in techniques.most_common():
print(f" {tech}: {count}")
# By sample category
categories = Counter(e.sample.category for e in experiments)
print("\nExperiments by category:")
for cat, count in categories.most_common():
print(f" {cat}: {count}")
print(f"\nTotal experiments: {len(experiments)}")analyses = ii.get_analyses(projects=PROJECT_PK)
# By status
statuses = Counter(a.status for a in analyses)
print("Analyses by status:")
for status in ["SUCCEEDED", "FAILED", "STARTED", "STAGED", "CREATED"]:
count = statuses.get(status, 0)
print(f" {status}: {count}")
# By application
apps = Counter(a.application.name for a in analyses)
print("\nAnalyses by application (top 10):")
for app, count in apps.most_common(10):
print(f" {app}: {count}")
print(f"\nTotal analyses: {len(analyses)}")failed = ii.get_analyses(
projects=PROJECT_PK,
status="FAILED"
)
if failed:
print(f"FAILED analyses ({len(failed)}):")
for a in failed[:10]: # Show first 10
target = a.targets[0].system_id if a.targets else "N/A"
print(f" [{a.pk}] {a.application.name}: {target}")
if len(failed) > 10:
print(f" ... and {len(failed) - 10} more")
else:
print("No failed analyses!")# Get storage usage from project
print(f"Project storage: {project.storage_usage / 1e9:.2f} GB")
# Or calculate from analyses
total_storage = sum(a.storage_usage or 0 for a in analyses)
print(f"Total analysis storage: {total_storage / 1e9:.2f} GB")Create a summary like this:
# Project Report: {project.title}
**Date**: {today}
**PI**: {project.principal_investigator}
**Analyst**: {project.analyst}
## Overview
| Metric | Count |
|--------|-------|
| Individuals | X |
| Samples | X |
| Experiments | X |
| Analyses | X |
## Analysis Status
| Status | Count | % |
|--------|-------|---|
| SUCCEEDED | X | X% |
| FAILED | X | X% |
| IN PROGRESS | X | X% |
## Top Applications
| Application | Succeeded | Failed |
|-------------|-----------|--------|
| MUTECT | X | X |
| BATTENBERG | X | X |
## Issues Requiring Attention
- X failed analyses need investigation
- [List specific failures if any]
## Storage
Total: X.XX GBBased on the report, identify:
from datetime import datetime, timedelta
stale_cutoff = datetime.now() - timedelta(days=7)
stale = ii.get_analyses(
projects=PROJECT_PK,
status="STARTED",
modified__lt=stale_cutoff.isoformat()
)
if stale:
print(f"Stale analyses (started > 7 days ago): {len(stale)}")# All experiments in project
all_exps = set(e.pk for e in ii.get_experiments(projects=PROJECT_PK))
# Experiments with MUTECT analysis
mutect_exps = set()
for a in ii.get_analyses(projects=PROJECT_PK, application__name="MUTECT"):
mutect_exps.update(t.pk for t in a.targets)
# Missing
missing = all_exps - mutect_exps
print(f"Experiments without MUTECT: {len(missing)}")import pandas as pd
data = []
for a in analyses:
data.append({
"pk": a.pk,
"application": a.application.name,
"status": a.status,
"target": a.targets[0].system_id if a.targets else None,
"created": a.created,
})
df = pd.DataFrame(data)
df.to_csv("project_report.csv", index=False)~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.