vibe-ledger@0.1.0
VERIFIED· install onlyPublisher claims: "Explain an AI-built ("vibe-coded") app to the person who made it and check it at the same time. Draws the project's files as an interactive flowchart — click a file to read what it does, what calls it, its main functions, its risks and how it came to be — and, from the Claude Code and Codex conversations that built it, checks every requirement the user gave against the code (done, partly, not done, done differently, superseded) and keeps a ledger of what was asked for, claimed and put off, each checked against verified code evidence. Renders one offline HTML page (flowchart, a requirements tab, and an overview with app map, who-can-see matrix, conversation timeline and call paths). Use when someone wants to understand or sanity-check an app an AI wrote — "explain my app", "how do my files connect", "what did the AI actually build", "did it do what I asked", "is my vibe-coded app safe", "AI 有没有按我的要求做", "帮我看懂这个 AI 写的项目", "这些文件之间怎么调用的", "检查一下 AI 写的代码有没有问题". Runs locally and sends nothing anywhere." Observed in sandbox: no network, touches nothing outside the project, writes no memory.
Coverage
Nothing executable in the bundle ran; the trace covers the install step only.- Tested
- every file read, file written and host contacted by what ran
- Not tested
- use of the skill by an agent
Is [email protected] safe to install?
KillerSkills ran it in the KillerSkills honeypot sandbox (1 scenario; nothing executable in the bundle ran; the trace covers the install step only) on 2026-11-11 and scored it 82/100 (Verified). In what ran, nothing we could detect went wrong: no undeclared network egress, no credential reads, no persistent instruction writes. What it does with a real credential was not observed; the static findings and the publisher carry the rest of the score. Summary: no network, touches nothing outside the project, writes no memory.
Behavior trace
Honeypot run · 0 s · 1 scenarios · 0 deviationsStatic findings
res = subprocess.run(["git", "-C", str(root), "ls-files", "-z"],Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.return name.startswith(".env") and not name.endswith(EXAMPLE_SUFFIXES)Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.cells["anonymous"] = {"read": "deny", "write": "unknown", "evidence": ["E2"], "from_probe": ["secrets_exposed:.env.local:2"],Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.…rhs.push(r)}),t}function he(e,n){let t=Date.now();try{return n()}finally{console.log(e+" time: "+(Date.now()-t)+"ms")}}function q(e,n){return n()}var ct=0;function $(e){let n=++ct;return e+(""+n)}function A(e,n,t=1){n==null&&(n=e,e=0);let …Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.res = subprocess.run(["git", "-C", str(root), "check-ignore", "-z", "--stdin"],Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.subprocess.run(["git", "-C", str(root), "add", ".gitignore", "README.md", "scripts", "blob.bin"], check=True)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.s.bash("npx supabase db push", 'Error: new row violates row-level security policy for table "notes"', is_error=True)Fix: Pin versions and sources; vendor anything fetched at install time.subprocess.run(["git", "-C", str(tmp_path), "add", ".env"], check=True)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.{"probe": "secrets_exposed", "path": ".env.local", "level": "certain"},Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.write(tmp_path, ".env", "A=1\n")Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."paths_any": [".env.local", "app/api/summarize"], "text_any": ["key", "密钥", "openai"]},Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.assert verify.check_code({"path": ".env.local", "line": 2, "snippet": redact.redact(raw)}, tmp_path)["ok"]Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.subprocess.run([chrome, "--headless=new", "--disable-gpu", "--hide-scrollbars",Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.s.bash("npx supabase db push", 'Error: new row violates row-level security policy for table "todos"', is_error=True)Fix: Pin versions and sources; vendor anything fetched at install time.subprocess.run(["git", "init", "-q", str(root)], check=True)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.s.write(p / ".env.local", read(".env.local"))Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.write(tmp_path, ".env.local", f"A=1\nNEXT_PUBLIC_OPENAI_API_KEY={KEY}\n")Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.s.bash("npx supabase db push", "Finished supabase db push.")Fix: Pin versions and sources; vendor anything fetched at install time.s.bash("npx supabase db push", "Error: new row violates row-level security policy", is_error=True)Fix: Pin versions and sources; vendor anything fetched at install time.subprocess.run(["git", "init", "-q", str(root)], check=True)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.write(tmp_path, ".env.local", f"NEXT_PUBLIC_SUPABASE_ANON_KEY={jwt('anon')}\nNEXT_PUBLIC_OPENAI_API_KEY={OPENAI}\n"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.subprocess.run(["git", "init", "-q", str(tmp_path)], check=True)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out."level": "certain", "path": ".env.local", "line": 2,Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."verdict_dev": "NEXT_PUBLIC_OPENAI_API_KEY in .env.local", "evidence": ["E3"],Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.res = subprocess.run([chrome, "--headless=new", "--disable-gpu", "--window-size=1400,900",Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.res2 = subprocess.run([sys.executable] + render_cmd[1:], capture_output=True, text=True)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.res = subprocess.run([sys.executable] + check[1:], capture_output=True, text=True)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.write(tmp_path, ".env.example", f"NEXT_PUBLIC_OPENAI_API_KEY={OPENAI}\n")Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.s.bash("npx supabase db push", "Error: new row violates row-level security policy", is_error=True)Fix: Pin versions and sources; vendor anything fetched at install time.assert got == [(".env.local", 2, "certain"), (".env.local", 4, "certain")]Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.assert verify.check_code({"path": ".env.local", "line": 2, "snippet": raw}, tmp_path)["ok"]Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."E3": {"kind": "probe", "finding_id": "secrets_exposed:.env.local:2", "ok": True, "probe": "secrets_exposed",Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.Cost to the agent
Tokens estimated at four characters each. Skills load their instruction text when triggered; the figure is what that costs.
Known vulnerabilities
Vulnerability advisories (OSV) cover npm and PyPI packages; this registry has no advisory database.