Recursive dependency auditing, transitive trust scoring, and supply chain vulnerability detection for AI agent skills. Layer 2 of the Moltcombinator verification stack.
Build a directed acyclic graph from skill dependencies using NetworkX. Each skill is a node, each import is a directed edge. Detect circular dependencies via DFS cycle detection. Calculate depth for every node in the chain.
PageRank-variant algorithm with 0.85 damping factor. Trust decays 15% per hop: trust(A→C) = trust(A→B) × trust(B→C) × 0.85^depth. The weakest link in any path determines the chain's floor.
2-layer Graph Attention Network: GATConv(8,16,heads=4) → ELU → GATConv(64,1,heads=1) → Sigmoid. 8-dim features per node: trust, dep count, depth, pinned ratio, author diversity, version age, update frequency, community score. Falls back to PageRank if torch unavailable.
Flag unpinned versions (+0.15), deep chains beyond 5 levels (+0.10/level), single-author concentration (+0.20), unverified deps (+0.25), circular dependencies (+0.30), and known vulnerable packages (+0.40). Each signal is independently scored and combined.
// Request { "skill_id": "my_agent_skill", "skill_manifest": { "skills": [ { "skill_id": "my_agent_skill", "name": "My Skill", "version": "1.2.0", "author": "alice", "dependencies": ["http_client", "json_parser"] }, { "skill_id": "http_client", "name": "HTTP Client", "version": "2.1.0", "author": "bob", "dependencies": ["tls_lib"] } ], "trust_scores": { "my_agent_skill": 0.95, "http_client": 0.88 } }, "resolve_depth": 10 } // Response { "skill_id": "my_agent_skill", "dependency_count": 3, "max_depth": 2, "risk_score": 0.32, "risk_level": "medium", "transitive_trust": 0.71, "vulnerabilities": [...] }
// Request { "skills": [ { "skill_id": "root", "name": "Root", "dependencies": ["dep_a", "dep_b"], "trust_score": 0.9 } ], "edges": [ { "source": "root", "target": "dep_a", "is_pinned": true } ] } // Response { "nodes": 5, "edges": 6, "max_depth": 3, "circular_dependencies": [], "risk_hotspots": [{ "skill_id": "dep_b", "risk_score": 0.72 }] }
// Request { "skill_id": "my_skill", "trust_scores": { "my_skill": 0.95, "dep_a": 0.88, "dep_b": 0.72 }, "edges": [ { "source": "my_skill", "target": "dep_a", "is_pinned": true }, { "source": "dep_a", "target": "dep_b", "is_pinned": false } ] } // Response { "skill_id": "my_skill", "transitive_trust": 0.52, "trust_chain": [...], "weakest_link": { "skill_id": "dep_b", "trust_score": 0.72, "depth": 2 } }
// Response { "skill_id": "my_skill", "overall_risk": 0.45, "risk_level": "medium", "transitive_trust": 0.52, "risk_breakdown": { "unpinned": 0.15, "deep_chain": 0.0, "single_author": 0.0, "unverified": 0.25, "circular": 0.0 }, "recommendations": ["Pin all dependency versions..."] }
curl -X POST http://localhost:8000/audit/skill \
-H "Content-Type: application/json" \
-d '{
"skill_id": "my_skill",
"skill_manifest": {
"skills": [{"skill_id": "my_skill", "name": "My Skill",
"author": "alice", "dependencies": ["dep_a"]}],
"trust_scores": {"my_skill": 0.9, "dep_a": 0.8}
}
}'