clembot/doorman

Developer Walkthrough & Skill Management

From fresh init to production protection

A complete, step-by-step developer guide for initializing a new Claude Code / Clembot build, recommending pre-vetted MCP tools from actual prompt history, and managing existing skill rosters so you never spend money or tokens on redundant capabilities.

Step 1: Fresh Init Step 2: Recommendations Step 3: Verification

Protocol Inspector
JSON-RPC 2.0
8,420 pkts Inspected Calls
6,290 chars Injection Blocked
0.4ms Hook Latency
180 lines Bash Gate Hook

Click canvas or button to inject a rogue tool and watch the scanner cage it

Step 1 · Fresh Init & Baseline Inspection

Inspecting a net-new build with doorman doctor

When you run claude init in an empty repository, Claude Code sets up project scaffolding (such as CLAUDE.md and .claude/settings.json). Before installing third-party tools, you need to know exactly what an agent in that directory can currently reach.

Installation

Zero runtime dependencies. Local, read-only, and costs no tokens.

# Global CLI Install via npm
npm install -g clembot-doorman
# Or via Claude Code Marketplace:
claude plugin marketplace add clemenswan/clembot-doorman && claude plugin install clembot-doorman

# 1. Open Local Visual HTML Dashboard (zero servers, zero ports, zero cloud dependencies)
doorman dashboard

# 2. Instant Terminal Posture Doctor
doorman doctor

# 3. Reverse-Mine Prompt Needs from team session history
doorman needs

# 4. Unified Audit & Grading Sweep
doorman audit

# 5. Schedule Automated Fleet Audits (GitHub Actions, crontab, /schedule)
doorman schedule

Verbatim terminal output on a fresh Claude Code build:

Terminal · doorman doctor
# Your build

`C:\Users\username\my-new-project`

Read-only. Nothing here was executed, sent anywhere, or billed.

## Harness

- **Claude Code** (CLAUDE.md)

## MCP servers this project can reach

None declared. Nothing to grade yet, and nothing to gate.

## Agents

No .claude/agents/ directory.

## The gate

**not installed**

- hook present: no
- wired in settings.json: no
- registry present: no

---
_doorman doctor. Static, local, free. It reports what is here; it does not
say whether any of it works. That is doorman report and doorman eval._
Wire the Security Gate

Run doorman install to wire the deterministic offline security hook.

This copies mcp-gate.sh into your project, creates registry/allowlist.json, and registers the hook in .claude/settings.json. Any unapproved tool call or injected payload is blocked locally at exit 2 before the agent's context window can be compromised.

Step 2 · Prompt-Driven Recommender

What does your build actually keep reaching for?

Once you work in your project for a few sessions, don't guess which MCPs or skills to install. doorman needs reads your local transcript history from ~/.claude/projects/, extracts human prompts, maps them across 12 capability taxonomies, and cross-references them against the free public scorecard feed.

12Taxonomies

Concrete Disciplines

Docs lookup, cloud deploy, live web search, browser automation, database queries, observability, payments, comms, and design.

0¢Local Privacy

Prompts Never Leave

Transcripts are parsed and matched locally on your machine. The only network call is an anonymous GET for public grades.

3Explicit Verdicts

Honest Output

UNMET with vetted candidates, blocked with hard-fail reasons, or GAP when the ecosystem lacks coverage.

Terminal · doorman needs .
doorman needs — 42 prompts read from this build’s own history
  history: ~/.claude/projects/C--my-new-project
  feed: 24 graded rows

UNMET    Current documentation for a library it does not know
         14 prompts across 3 sessions  ·  matched "latest docs", "deepwiki"
         > …can you look up the latest docs for drizzle orm…
         > …check the documentation for cloudflare workers assets…
         worth-measuring  DeepWiki MCP           [A (85.7)]  matched "docs"
                          https://mcp.deepwiki.com/mcp
         worth-measuring  Cloudflare Docs MCP    [A (94.2)]  matched "documentation"
                          https://docs.mcp.cloudflare.com/mcp

UNMET    Driving a real browser
         6 prompts across 2 sessions  ·  matched "screenshot the page", "playwright"
         > …take a screenshot of the landing page at 390px…
         worth-measuring  Peek Browser MCP       [C (66.7)]  matched "screenshot"
                          https://mcp.peek.com

UNMET    Reading the live web
         5 prompts across 1 sessions  ·  matched "search online"
         > …search online for the error code…
         blocked          WebZum Search          [F (49.0)]  matched "search"
                          hard fail: injection-shaped content in tool:host_site.description
                          https://webzum.com/api/mcp

GAP      Production errors and logs
         3 prompts across 1 sessions  ·  matched "tail the logs"
         > …tail the logs from production…
         nothing graded covers this. The feed has the gap, not your build.

3 unmet, 1 of them with nothing graded to offer.

What this is: your own prompts, counted, against capability text those
candidates published about themselves. Nothing here was driven, so
nothing here is a claim that a server works. `worth-measuring` means
exactly that — run `doorman eval` with your key and find out.

Step 3 · Roster Management

What if your build already has a lot of skills?

If you already have a rich collection of skills (e.g., in .claude/skills/ or .agents/skills/), the most important job of a package manager is saying no to redundant tools.

1. Automatic Suppression

coveredBy(inv) in Needs

When you run doorman needs, it checks your active MCP servers and tools held by subagents. If a capability is already covered, it prints COVERED · already covered by: [tool] and suppresses candidate recommendations so your terminal is never cluttered with tools you already have.

2. Adverse Drift Guard

already-installed in Watch

doorman watch continuously monitors the public feed. Any server your project already runs is tagged already-installed. If an installed server is downgraded or caught with hostile prompt injection in a newer audit, watch alerts you to revoke it from your allowlist.

3. Frontmatter Arithmetic

30 KB vs 640 KB

Doorman reads only the YAML frontmatter (name, description) of your skills, never the full markdown bodies. In our production vault, reading full bodies was 642 KB; reading frontmatter was 30 KB. Only frontmatter fits safely in a single model turn without blowing out context.

4. The Two-Phase Fit Review

Fit First, Money Second

Before spending any tokens or paying a scorecard, node scripts/vet.mjs <target> --dry-run runs the Fit Review. If an existing skill already covers the task, the verdict is REDUNDANT, cites your exact skill name, and halts at Phase 1 ($0.00 spent).

Terminal · node scripts/vet.mjs https://github.com/example/git-mcp --dry-run
  candidate  https://github.com/example/git-mcp
  inventory  C:\Users\username\my-project — 3 agents, 22 skills, 1 mcp servers

  FIT        REDUNDANT
             Already covered by existing skill: git-pr covers reviewing and merging pull requests.

  Already covered by:
    - skill git-pr: handles GitHub pull requests and diff review locally

  STOPPED before the paid grade. $0.00 spent.
           Nothing was sent to the scorecard, and no client was built.

Step 4 · Agent Integration

Can I just run Doorman as a skill or slash command?

Yes. Doorman is engineered to run seamlessly inside your agent loop rather than requiring you to juggle a separate terminal window.

Workflow A Interactive CLI

The /vet Slash Command

.claude/commands/vet.md

In Claude Code, drop a command definition into .claude/commands/vet.md that calls node scripts/vet.mjs $ARG --dry-run. When you encounter a tool link in chat, type /vet <url>: your agent tests fit against your existing skills and reports the verdict in-line.

Workflow B Isolated Sandbox

Dedicated Doorman Subagent

.claude/agents/doorman.md

Isolate tool adoption from your coding session. The doorman subagent is provisioned with read-only tools and access to the Bazantic Scorecard gateway. It audits unknown tools in a sandbox and never exposes your primary codebase to unallowlisted code.

Workflow C Multi-Harness

Native Harness Skill

.claude/skills/doorman/SKILL.md · .agents/skills/doorman/SKILL.md

Equip any agent harness with the Doorman skill. When the agent is tasked with adding a capability (like searching the web or inspecting database schemas), it triggers doorman needs or doorman report to evaluate options before asking you to install them.

Workflow D Automation & CI/CD

Scheduled Audits & Reports

doorman schedule --github · /schedule

Configure continuous tool governance without manual overhead. Run doorman schedule --github to install a weekly GitHub Action that audits project posture and tool recommendations, or trigger periodic scans via your agent harness or crontab.

Step 5 · What the Doorman Checks

Six probes and a second pass

Two do not always run. A probe that did not apply is recorded with its reason and left out of the average, rather than counted as a failure the server never earned. A seventh step is not a probe at all: it re-runs the cold open with the recipe, to find out whether the recipe works.

01

Handshake and inventory

Connect, list tools, lint the schemas. A server with no tools exits here without spending anything on probes.

Is there anything here at all?

02

Cold open

A fresh agent, the server's own descriptions, and a task built from what the subagent actually needed. Scored on first-try tool choice, first-try schema validity, completion, and how much wandering it took.

Can an agent that has never seen this succeed on the first try?

03conditional

Ambiguity gauntlet

Fires only when two tool descriptions genuinely overlap. The task is worded in the wrong tool's vocabulary, so only a description that draws a real line will save it.

Do these two descriptions actually distinguish themselves?

04

Bad input recovery

Omit a required parameter on purpose, then measure the error. What is graded is the message, not the agent. "Invalid input" and "missing required repoName (string, e.g. facebook/react)" are the same failure and completely different products.

Can an agent fix itself from this error in two turns?

05conditional

Chain test

Two steps, where the second must consume a real value the first returned. Servers that look fine tool by tool fall over here. Skipped under three tools.

Do these outputs compose, or only look like they should?

06

Injection sniff

Scan-only. Reads every description an agent sees before choosing a tool, looking for content shaped like an instruction rather than documentation. It never calls a tool: we do not execute a server to find out whether it is hostile.

Is this documentation, or is it giving my agent orders?

07second pass

Guidance delta

The same cold task again, with the drafted recipe in the agent's system prompt. Scored as recovered headroom, so a server that was already strong is not punished for having little room to improve. It is kept out of the behavioural average: folding it in would pay a server twice for one recovery.

We told it exactly what went wrong. Did that fix it?

Methodology FAQ & Hard-Fail Rubric

What triggers an automatic F? Two findings cap a grade at F outright: injection-shaped content in advertised strings, and a non-TLS transport. A hard fail immediately overrides high static scores.

Are unmeasured layers counted as zero? No. A layer that did not run has its weight removed, renormalising remaining layers so honest partial audits are not penalized.

What does the guidance delta prove? It measures recovered headroom when the agent receives the drafted recipe. A server that recovers can be safely adopted behind a recipe; a server that still fails cannot be saved by documentation.

Step 6 · Production Status

How built out is this?

Here is the honest status of what is tested and running vs. what requires configuration:

Component Status Test Suite & Live Proof
Static Scannerdoorman report Production Ready Live SSE handshake, tool schema validation, 6-pattern injection detection. Caught WebZum 6,290-char injection in real-time.
Needs Recommenderdoorman needs Production Ready Parses real JSONL transcripts, deduplicates resumed sessions, matches 12 capability taxonomies against live feed.
Harness Doctordoorman doctor Production Ready Zero-dependency scanner for Claude Code, Cursor, Windsurf, Copilot, Gemini. Audits agent-to-tool exposure ratios.
Security Gatemcp-gate.sh Production Ready 180-line offline Bash hook. Passed 29/29 tests in test-gate.sh. Blocks rogue tools and enforces 5s timeout.
Fit Reviewfit-review.mjs Production Ready Compares candidates against skill frontmatter. Enforces temperature 0, strict JSON schema, and hallucination rejection.
Budget Ledgerbudget.mjs Production Ready Enforces per-run ($1) and per-day ($5) caps in USDC on Base; auto-releases unspent reserves on error.
Bazantic Gatewayx402 & MCP Live in Production clembot-doorman.bazgateway.com returns live x402 challenge ($0.01 USDC on Base) + MCP SSE tool stream.
Multi-Directory Ingest.agents/skills Configuration Detail Reads .claude/skills/*/SKILL.md by default. Configure DOORMAN_INVENTORY_ROOT for alternate directory layouts.

Developer Q&A

Frequently Asked Implementation Questions

Can I run Doorman without global npm permissions?

Yes. You can install it directly as a Claude Code Marketplace plugin (claude plugin install clembot-doorman) or invoke it on demand using npx clembot-doorman audit. In both cases, zero global permissions or dependencies are needed.

How does the unified `doorman audit` command work?

doorman audit aggregates L0 doctor (wiring & inventory inspection), L0.5 prompt needs (capability gap extraction), and L2 feed watch into a single executive report. Pass --out .doorman/audit.md to save a markdown summary or --json for machine-readable output.

How are spend limits enforced on paid audits?

Doorman's local budget.mjs checks and reserves funds against your configured caps ($1.00 per run, $5.00 per day) in an offline append-only ledger (.claude/registry/ledger.jsonl) before any HTTP request is dispatched. If the network call fails, the reservation is immediately released.

View GitHub Repository Try Interactive Simulator