RepoTrust

Leaderboard github.com

elthommy/privy-council

A private council of AI personas that debates your questions, on local models, your Claude subscription, or both.

  • View repository ↗
  • Python
  • ★ 1
  • commit c869ce38e8b7
  • scored 2026-11-14
  • scoring prov-5+qual-2+sec-2

AI provenance

12%

explicit

Confidence
85%
Coverage
100%

Estimated share of AI-generated code. Explicit attribution is a lower bound.

Code quality

89/100

strong

Confidence
90%
Coverage
100%

Complexity, duplication, lint density, tests, CI, docs and review process.

Security

80/100

adequate

Confidence
85%
Coverage
100%

Secrets, static analysis, vulnerable dependencies, CI and supply-chain posture.

AI provenance

12% explicit

Explicit AI attribution on 12% of first-party code added; an estimated 12% including velocity signals.

How the score is built

  • Explicitly attributed share12%
  • Unattributed share in AI-pace bursts0%
  • Estimated AI-generated share12%
  • AI tool configuration files1
  • Work sessions at AI pace0
  • Releases at AI pacenot measured
  • Coding-style index (1.0+ means possible)0.00

Attributed AI tools

ToolCommitsLines addedFirst seenLast seen
Claude Code534,1922026-10-282026-11-13

Lines added per month all AI-attributed share

  1. 2026-1030,988 · 2% AI
  2. 2026-113,494 · 100% AI

Findings in AI-attributed lines vs the rest

From git blame: 2,603 lines trace to AI-attributed commits, 18,489 to others. Reported, not scored.

Findings per 1,000 linesAI-attributedOtherRatio
Code quality1.540.493.16×
Security0.000.490.00×

Evidence by analyzer

Explicit AI attributionok26 items
attributed_commit_share
85.5%
attributed_commits
53
attributed_loc
4,192
attributed_loc_share
12.2%
commits
62
effective_loc
34,482
tools_detected
1
AI tool configurationok1 item
artifacts
1
earliest_adoption
2026-10-28
tools_configured
1
workflow_agents
0
Commit velocityok
excluded_import_loc
30,290
flagged_loc
0
flagged_loc_share
0.0%
flagged_units
0
max_loc_per_hour
242.57
measured_loc
4,192
median_loc_per_hour
70.75
pr_timed_units
0
pre_ai_era_burst_loc
0
pre_ai_era_bursts
0
pre_ai_era_measured_loc
0
work_units
22
Release velocityskipped
Coding styleok
count:assistant_voice
0
count:emoji_in_code
0
count:narrated_steps
0
count:placeholder
0
files:assistant_voice
0
files:emoji_in_code
0
files:narrated_steps
0
files:placeholder
0
index
0
lines_scanned
21,092
per_kloc:assistant_voice
0
per_kloc:emoji_in_code
0
per_kloc:narrated_steps
0
per_kloc:placeholder
0
Findings in AI-written linesok
ai_lines
2,603
blame_failures
0
files_blamed
107
other_lines
18,489
quality:ai_findings
4
quality:ai_per_kloc
1.54
quality:other_findings
9
quality:other_per_kloc
0.49
quality:ratio
3.16
security:ai_findings
0
security:ai_per_kloc
0
security:other_findings
9
security:other_per_kloc
0.49
security:ratio
0

Code quality

89 strong

Code quality is strong: test-to-source ratio 0.62, CI runs tests; 3% of function code in complex or long functions; 1% duplicated lines. Weakest area: type safety.

How the score is built

  • Complexity90
  • Duplication94
  • Lint and smells74
  • Tests and CI100
  • Documentation85
  • Type safety60
  • Review processnot measured

Evidence by analyzer

Complexity (lizard)ok10 items
complex_functions
11
function_nloc
11,044
functions
1,089
long_functions
0
many_param_functions
7
mean_ccn
3.97
p90_ccn
8
risky_nloc_share
3.4%
Duplication (jscpd)ok10 items
compared_lines
16,108
duplicated_lines
180
duplicated_share
1.1%
files
107
Lintok
category:best-practice
3
category:correctness
2
category:maintainability
8
findings
13
scanned_lines
21,092
weighted_findings
25
Tests and CIok3 items
  • CI config: .github/workflows/ci.yml .github/workflows/ci.yml
  • CI runs tests (pytest)
  • CI runs linters (ruff, pre-commit)
check:ci_present
yes
check:ci_runs_lint
yes
check:ci_runs_tests
yes
check:has_tests
yes
check:test_ratio
yes
check:tests_cochange
yes
ci_files
1
cochange_commits
33
cochange_share
81.8%
source_lines
21,092
test_lines
12,988
test_ratio
0.62
Documentationok3 items
  • README.md README.md
  • LICENSE LICENSE
  • CHANGELOG.md CHANGELOG.md
check:changelog
yes
check:contributing
no
check:license
yes
check:readme
yes
readme_lines
255
Type safetyok1 item
  • Python strict type checking: pyproject.toml pyproject.toml
check:low_escape_density
no
check:strict_config
yes
escapes
167
escapes_per_kloc
7.94

Security

80 adequate

Security posture is adequate: 8 high-severity SAST findings; 5 high-severity workflow issues. Weakest area: ci actions.

How the score is built

  • Secrets100
  • Static analysis (SAST)90
  • Vulnerable dependencies100
  • CI workflows32
  • Security posture40
  • OpenSSF Scorecardnot measured

Evidence by analyzer

OpenSSF Scorecardskipped

no published OpenSSF Scorecard result for this repo

Package registriesok
checked
14
declared
14
lookup_errors
0
missing
0
recent
0
Secrets (gitleaks)ok
secrets_current
0
secrets_history
0
secrets_low_confidence
0
secrets_nonprod
0
Static analysis (opengrep)ok
findings
9
findings_high
8
findings_low
0
findings_medium
1
parse_errors
5
scanned_lines
21,092
weighted_findings
6.25
Dependencies (osv-scanner)ok
penalty
0
vulnerabilities
0
vulnerable_packages
0
vulns_critical
0
vulns_high
0
vulns_low
0
vulns_medium
0
vulns_unknown
0
CI workflows (zizmor)ok
findings
10
findings_high
5
findings_low
3
findings_medium
2
penalty
68.90
workflows
1
Security postureok1 item
  • Dependency updates: .github/dependabot.yml .github/dependabot.yml
check:dependency_updates
yes
check:lockfiles
yes
check:security_policy
no
check:signed_commits
no
signed_commit_share
12.9%
unpinned_manifests
0
Release downloadsok
binary_assets
0
signals
0
suspicious
0

Findings

19 high10 medium3 low

SeverityRuleLocationMessageTool
high opengrep/python.lang.best-practice.arbitrary-sleep scripts/live_session.py:135 time.sleep() call; did you mean to leave this in? Lint
high opengrep/python.lang.best-practice.arbitrary-sleep scripts/live_session.py:153 time.sleep() call; did you mean to leave this in? Lint
high opengrep/python.lang.best-practice.arbitrary-sleep scripts/num_batch_bench.py:59 time.sleep() call; did you mean to leave this in? Lint
high opengrep/python.lang.maintainability.useless-inner-function src/privy_council/chat/discord_bot.py:260 function `ask` is defined inside a function but never used Lint
high opengrep/python.lang.maintainability.useless-inner-function src/privy_council/chat/discord_bot.py:271 function `run` is defined inside a function but never used Lint
high opengrep/python.lang.maintainability.useless-inner-function src/privy_council/chat/discord_bot.py:280 function `handover` is defined inside a function but never used Lint
high zizmor/unpinned-uses .github/workflows/ci.yml:20 unpinned action reference [confidence high] CI workflows (zizmor)
high zizmor/unpinned-uses .github/workflows/ci.yml:21 unpinned action reference [confidence high] CI workflows (zizmor)
high zizmor/unpinned-uses .github/workflows/ci.yml:41 unpinned action reference [confidence high] CI workflows (zizmor)
high zizmor/unpinned-uses .github/workflows/ci.yml:62 unpinned action reference [confidence high] CI workflows (zizmor)
high zizmor/unpinned-uses .github/workflows/ci.yml:63 unpinned action reference [confidence high] CI workflows (zizmor)
high opengrep/python.lang.security.audit.dangerous-subprocess-use-audit scripts/live_session.py:163 Detected subprocess function 'Popen' without a static string. If this data can be controlled by a malicious actor, it may be an instance of command injection. Audit the use of this call to ensure it is not controllable by an external... Static analysis (opengrep)
high opengrep/python.lang.security.audit.dangerous-subprocess-use-audit scripts/ollama_import_sharded.py:72 Detected subprocess function 'run' without a static string. If this data can be controlled by a malicious actor, it may be an instance of command injection. Audit the use of this call to ensure it is not controllable by an external... Static analysis (opengrep)
high opengrep/python.lang.security.audit.dangerous-asyncio-create-exec-audit scripts/spike_claude.py:76 Detected 'create_subprocess_exec' function without a static string. If this data can be controlled by a malicious actor, it may be an instance of command injection. Audit the use of this call to ensure it is not controllable by an... Static analysis (opengrep)
high opengrep/python.lang.security.audit.dangerous-asyncio-create-exec-audit scripts/spike_claude_stream.py:50 Detected 'create_subprocess_exec' function without a static string. If this data can be controlled by a malicious actor, it may be an instance of command injection. Audit the use of this call to ensure it is not controllable by an... Static analysis (opengrep)
high opengrep/python.lang.security.audit.dangerous-asyncio-create-exec-audit scripts/spike_claude_stream.py:86 Detected 'create_subprocess_exec' function without a static string. If this data can be controlled by a malicious actor, it may be an instance of command injection. Audit the use of this call to ensure it is not controllable by an... Static analysis (opengrep)
high opengrep/python.lang.security.audit.dangerous-asyncio-create-exec-audit src/privy_council/backends/claude_cli.py:204 Detected 'create_subprocess_exec' function without a static string. If this data can be controlled by a malicious actor, it may be an instance of command injection. Audit the use of this call to ensure it is not controllable by an... Static analysis (opengrep)
high opengrep/python.lang.security.audit.dangerous-asyncio-create-exec-audit src/privy_council/search/container.py:45 Detected 'create_subprocess_exec' function without a static string. If this data can be controlled by a malicious actor, it may be an instance of command injection. Audit the use of this call to ensure it is not controllable by an... Static analysis (opengrep)
high opengrep/python.lang.security.audit.dangerous-asyncio-create-exec-tainted-env-args src/privy_council/search/container.py:45 Detected 'create_subprocess_exec' function with user controlled data. You may consider using 'shlex.escape()'. [confidence low] Static analysis (opengrep)
medium opengrep/python.lang.correctness.common-mistakes.string-concat-in-list scripts/label_rounds.py:214 Detected strings that are implicitly concatenated inside a list. Python will implicitly concatenate strings when not explicitly delimited. Was this supposed to be individual elements of the list? Lint
medium opengrep/python.lang.maintainability.return-not-in-function src/privy_council/compare/store.py:59 `return` only makes sense inside a function Lint
medium opengrep/python.lang.maintainability.return-not-in-function src/privy_council/engine/budget.py:61 `return` only makes sense inside a function Lint
medium opengrep/python.lang.maintainability.return-not-in-function src/privy_council/models/research.py:32 `return` only makes sense inside a function Lint
medium opengrep/python.lang.correctness.common-mistakes.string-concat-in-list src/privy_council/repl.py:130 Detected strings that are implicitly concatenated inside a list. Python will implicitly concatenate strings when not explicitly delimited. Was this supposed to be individual elements of the list? Lint
medium opengrep/python.lang.maintainability.is-function-without-parentheses src/privy_council/tui/app.py:312 Is "is_running" a function or an attribute? If it is a function, you may have meant w.is_running() because w.is_running is always true. Lint
medium opengrep/python.lang.maintainability.is-function-without-parentheses src/privy_council/tui/widgets.py:460 Is "is_empty" a function or an attribute? If it is a function, you may have meant self.selection.is_empty() because self.selection.is_empty is always true. Lint
medium zizmor/dependabot-cooldown .github/dependabot.yml:20 insufficient cooldown in Dependabot updates [confidence high] CI workflows (zizmor)
medium zizmor/dependabot-cooldown .github/dependabot.yml:6 insufficient cooldown in Dependabot updates [confidence high] CI workflows (zizmor)
medium opengrep/python.lang.security.audit.dynamic-urllib-use-detected scripts/spike_ollama.py:33 Detected a dynamic value being used with urllib. urllib supports 'file://' schemes, so a dynamic value controlled by a malicious actor may allow them to read arbitrary files. Audit uses of urllib calls to ensure user data cannot control... Static analysis (opengrep)
low zizmor/artipacked .github/workflows/ci.yml:20 credential persistence through GitHub Actions artifacts [confidence low] CI workflows (zizmor)
low zizmor/artipacked .github/workflows/ci.yml:41 credential persistence through GitHub Actions artifacts [confidence low] CI workflows (zizmor)
low zizmor/artipacked .github/workflows/ci.yml:62 credential persistence through GitHub Actions artifacts [confidence low] CI workflows (zizmor)

Tools and coverage

Every analyzer that ran on this commit. A failed or skipped tool is a coverage gap: its share of the score is left out and the coverage figure drops.

AnalyzerPillarStatusVersionFindingsNote
AI tool configurationAI provenanceoksignatures-v10
Explicit AI attributionAI provenanceoksignatures-v10
Release velocityAI provenanceskipped—0
Coding styleAI provenanceok—0
Commit velocityAI provenanceokprov-40
Findings in AI-written linesAI provenanceokgit-blame0
Complexity (lizard)Code qualityoklizard 1.25.10
DocumentationCode qualityok—0
Duplication (jscpd)Code qualityokrepotrust-dup-w60
LintCode qualityokopengrep 1.33.1; rules f1d2b562b41413
Tests and CICode qualityok—0
Type safetyCode qualityok—0
CI workflows (zizmor)Securityokzizmor 1.32.010
Dependencies (osv-scanner)Securityokosv-scanner version: 2.7.10
Release downloadsSecurityok—0
Security postureSecurityok—0
Package registriesSecurityok—0
Static analysis (opengrep)Securityokopengrep 1.33.1; rules f1d2b562b4149
OpenSSF ScorecardSecurityskipped—0no published OpenSSF Scorecard result for this repo
Secrets (gitleaks)Securityokgitleaks 8.30.10

Score history

Scores from different scoring versions aren't directly comparable.

ScoredCommitScoringAI provenanceQualitySecurity
2026-11-14c869ce38e8b7prov-5+qual-2+sec-212%8980
2026-11-14c869ce38e8b7prov-4+qual-2+sec-212%8980

Embed a badge

Maintainers can show these in a README. Badges update when the repository is re-scored.

[![RepoTrust ai](https://repotrust.synapticcyber.com/badge/github.com/elthommy/privy-council/ai.svg)](https://repotrust.synapticcyber.com/r/github.com/elthommy/privy-council/)
[![RepoTrust quality](https://repotrust.synapticcyber.com/badge/github.com/elthommy/privy-council/quality.svg)](https://repotrust.synapticcyber.com/r/github.com/elthommy/privy-council/)
[![RepoTrust security](https://repotrust.synapticcyber.com/badge/github.com/elthommy/privy-council/security.svg)](https://repotrust.synapticcyber.com/r/github.com/elthommy/privy-council/)
Full text report

Scores

Pillar Score Signal Confidence Coverage
AI provenance (estimated AI-generated share) 12 explicit 85% 100%
Code quality 89 strong 90% 100%
Security 80 adequate 85% 100%

AI provenance

Explicit AI attribution on 12% of first-party code added; an estimated 12% including velocity signals.

  • Explicitly attributed share (lower bound): 12.2%
  • Unattributed share in AI-consistent velocity bursts: 0.0%
  • Estimated AI-generated share: 12.2%
AI tool Attributed commits Lines added
Claude Code 53 4,192
  • AI tooling configured in repo: claude-code

Current source lines last changed by AI-attributed commits: 2,603 of 21,092.

Findings per 1,000 lines AI-attributed Other Ratio
Quality 1.537 0.487 3.16x
Security 0.0 0.487 0.0x
Month Lines added Attributed to AI
2026-10 30,988 2%
2026-11 3,494 100%

Evidence

  • Claude Code: trailer 'Co-Authored-By: Claude' (3c10c9abdd0d)
  • Claude Code: trailer 'Co-Authored-By: Claude' (4015b75c6ed9)
  • Claude Code: trailer 'Co-Authored-By: Claude' (4fea7746cba0)
  • Claude Code: trailer 'Co-Authored-By: Claude' (dbcacb9dbd0b)
  • Claude Code: trailer 'Co-Authored-By: Claude' (65a87cd9c922)
  • Claude Code: trailer 'Co-Authored-By: Claude' (95aa47a487e7)
  • Claude Code: trailer 'Co-Authored-By: Claude' (11fd3d7d91a8)
  • Claude Code: trailer 'Co-Authored-By: Claude' (ecf81bc06ca6)
  • Claude Code: trailer 'Co-Authored-By: Claude' (1c4a02830dd1)
  • Claude Code: trailer 'Co-Authored-By: Claude' (39e446530420)
  • Claude Code: trailer 'Co-Authored-By: Claude' (105035dbd399)
  • Claude Code: trailer 'Co-Authored-By: Claude' (4a0f4be64478)
  • Claude Code: trailer 'Co-Authored-By: Claude' (d7899d2f537f)
  • Claude Code: trailer 'Co-Authored-By: Claude' (36c3c76e536d)
  • Claude Code: trailer 'Co-Authored-By: Claude' (8267b6e572f0)

AI provenance describes how code was produced; it is not a quality judgment. Unless attribution is explicit, these are signals consistent with AI generation, not proof. Squash/rebase workflows, imported code, and rewritten history reduce accuracy.

Code quality

Code quality is strong: test-to-source ratio 0.62, CI runs tests; 3% of function code in complex or long functions; 1% duplicated lines. Weakest area: type safety.

Area Score
Complexity (lizard) 90
Duplication 94
Code smells (Opengrep) 74
Tests and CI 100
Documentation 85
Type safety 60
Process (Scorecard review/maintenance) n/a
  • Functions: 1,089; mean complexity 4.0, 90th percentile 8; 11 complex and 0 long functions
  • Duplicated lines: 1.1% of 16,108 compared
  • Tests: 12,988 test lines for 21,092 source lines (ratio 0.62); CI test commands: pytest; 82% of recent source commits also change tests
  • Docs missing or thin: contributing

Most complex functions:

Security

Security posture is adequate: 8 high-severity SAST findings; 5 high-severity workflow issues. Weakest area: ci actions.

Area Score
Secrets (gitleaks, tree + history) 100
Static analysis (Opengrep) 90
Vulnerable dependencies (OSV) 100
CI workflows (zizmor) 32
Posture (policy, updates, signing, lockfiles) 40
OpenSSF Scorecard n/a
  • Posture checks passed: dependency updates, lockfiles; missing: security policy, signed commits

Top findings

Severity Finding Location
high opengrep/python.lang.security.audit.dangerous-subprocess-use-audit: Detected subprocess function 'Popen' without a static string. If this data can be controlled by a malicious actor, it may be an instance of command injection. Audit the use of this call to ensure it is not controllable by an external resource. You may consider using 'shlex.escape()'. [confidence low] scripts/live_session.py:163
high opengrep/python.lang.security.audit.dangerous-subprocess-use-audit: Detected subprocess function 'run' without a static string. If this data can be controlled by a malicious actor, it may be an instance of command injection. Audit the use of this call to ensure it is not controllable by an external resource. You may consider using 'shlex.escape()'. [confidence low] scripts/ollama_import_sharded.py:72
high opengrep/python.lang.security.audit.dangerous-asyncio-create-exec-audit: Detected 'create_subprocess_exec' function without a static string. If this data can be controlled by a malicious actor, it may be an instance of command injection. Audit the use of this call to ensure it is not controllable by an external resource. You may consider using 'shlex.escape()'. [confidence low] scripts/spike_claude.py:76
high opengrep/python.lang.security.audit.dangerous-asyncio-create-exec-audit: Detected 'create_subprocess_exec' function without a static string. If this data can be controlled by a malicious actor, it may be an instance of command injection. Audit the use of this call to ensure it is not controllable by an external resource. You may consider using 'shlex.escape()'. [confidence low] scripts/spike_claude_stream.py:50
high opengrep/python.lang.security.audit.dangerous-asyncio-create-exec-audit: Detected 'create_subprocess_exec' function without a static string. If this data can be controlled by a malicious actor, it may be an instance of command injection. Audit the use of this call to ensure it is not controllable by an external resource. You may consider using 'shlex.escape()'. [confidence low] scripts/spike_claude_stream.py:86
high opengrep/python.lang.security.audit.dangerous-asyncio-create-exec-audit: Detected 'create_subprocess_exec' function without a static string. If this data can be controlled by a malicious actor, it may be an instance of command injection. Audit the use of this call to ensure it is not controllable by an external resource. You may consider using 'shlex.escape()'. [confidence low] src/privy_council/backends/claude_cli.py:204
high opengrep/python.lang.security.audit.dangerous-asyncio-create-exec-audit: Detected 'create_subprocess_exec' function without a static string. If this data can be controlled by a malicious actor, it may be an instance of command injection. Audit the use of this call to ensure it is not controllable by an external resource. You may consider using 'shlex.escape()'. [confidence low] src/privy_council/search/container.py:45
high opengrep/python.lang.security.audit.dangerous-asyncio-create-exec-tainted-env-args: Detected 'create_subprocess_exec' function with user controlled data. You may consider using 'shlex.escape()'. [confidence low] src/privy_council/search/container.py:45
high zizmor/unpinned-uses: unpinned action reference [confidence high] .github/workflows/ci.yml:20
high zizmor/unpinned-uses: unpinned action reference [confidence high] .github/workflows/ci.yml:21
high zizmor/unpinned-uses: unpinned action reference [confidence high] .github/workflows/ci.yml:41
high zizmor/unpinned-uses: unpinned action reference [confidence high] .github/workflows/ci.yml:62
high zizmor/unpinned-uses: unpinned action reference [confidence high] .github/workflows/ci.yml:63
medium opengrep/python.lang.security.audit.dynamic-urllib-use-detected: Detected a dynamic value being used with urllib. urllib supports 'file://' schemes, so a dynamic value controlled by a malicious actor may allow them to read arbitrary files. Audit uses of urllib calls to ensure user data cannot control the URLs, or consider using the 'requests' library instead. [confidence low] scripts/spike_ollama.py:33
medium zizmor/dependabot-cooldown: insufficient cooldown in Dependabot updates [confidence high] .github/dependabot.yml:6
medium zizmor/dependabot-cooldown: insufficient cooldown in Dependabot updates [confidence high] .github/dependabot.yml:20
low zizmor/artipacked: credential persistence through GitHub Actions artifacts [confidence low] .github/workflows/ci.yml:20
low zizmor/artipacked: credential persistence through GitHub Actions artifacts [confidence low] .github/workflows/ci.yml:41
low zizmor/artipacked: credential persistence through GitHub Actions artifacts [confidence low] .github/workflows/ci.yml:62

Static signals only: the scorer never runs the project's code. Secret findings are pattern matches that were not verified, and secret values are never stored.

Repository profile

  • Source lines: 21,092; test lines: 12,988
Language Lines
Python 34,015
Shell 65