Skip to content

Lazaretto, a hosted scanner for agent skills #69

Open

Description

@jamesdfinance-dev

Scanner name

Lazaretto

Upstream URL

https://github.com/jamesdfinance-dev/lazaretto-plugins/tree/main/clawscan

Request type

New built-in scanner adapter

CLI/API shape

Following docs/scanners.md, I started with a user-defined command scanner for a custom profile rather than asking for a built-in adapter up front:

node clawscan/lazaretto-scanner.mjs {{target}}

{{target}} is a local skill directory (SKILL.md is scanned, every other file is listed as not scanned) or a published ClawHub skill as owner/name[@Version] (the whole package is scanned server side). One JSON object on stdout. Exit 0 when a scan completed, exit 1 with a reason when there is no result, so a failed scan never reads as clean. A sample profile with gate rules is in profile.example.yaml.

Credentials and setup

Env vars: LAZARETTO_API_KEY (declared under secretEnv). A free key: curl -s -X POST https://lazaretto.dev/v1/trial
Install: Node 20 or newer. No dependencies; the script reads files and makes one HTTPS request.

Expected artifact

JSON with status, verdict (clear, flagged, malicious), risk, findings (rule_id, severity, file, line, detail), scanned, not_scanned, complete, target_hash and scan_id. On failure: status "error", a reason, and not_an_all_clear: true.

Example proof

Fixtures and results are in the README. Against the live API on 2026-10-20, a skill that templates the conversation into a rendered image URL is flagged high (rule pi.markdown_exfil), and a plain skill comes back clear with its unscanned helper script listed. I have not yet run it under ClawScan itself.

Two questions before going further:

  1. Is a hosted, metered scanner (free tier, then paid per call) something you would consider for a profile, and at what volume would cost become the deciding factor?
  2. How should a scanner that is rate limited or unavailable report, so the harness treats it as skipped rather than clean?

Activity

  1. added
    clawsweeper:intake:featurePreliminary submission classification; full source review pending.
    P3Low-risk cleanup, docs, polish, ergonomics, or speculative feature.
    clawsweeper:fix-shape-clearClawSweeper found a clear likely implementation shape for this issue.
    clawsweeper:needs-maintainer-reviewClawSweeper marked this issue as needing maintainer review before automation.
    clawsweeper:needs-product-decisionClawSweeper marked this issue as needing a product or behavior decision.
    clawsweeper:no-new-fix-prClawSweeper does not recommend queueing a new automated fix PR for this issue.
    and removed
    clawsweeper:intake:featurePreliminary submission classification; full source review pending.
    on Oct 20, 2026
  2. clawsweeper commented on Oct 20, 2026

    @clawsweeper

    Codex review: this still needs some work.

    Summary
    Keep this issue open for an adoption decision: current main supports custom scanners but does not include Lazaretto, so the repository’s implemented-only close policy is not met.

    Reproducibility: This is an adoption proposal rather than an established ClawScan defect; the author supplies external 0.2.0 evaluation evidence, and no live reproduction was performed.

    Maintainer decision needed

    • Question: Should Lazaretto remain external, receive a documented custom profile, or become a built-in scanner?
    • Recommendation: Evaluate a documented custom profile: Check current-main compatibility and benchmark value before accepting integration documentation.
    • Why: The extension contract accommodates the proposal, but implementation evidence cannot settle adoption value, service terms, cost, or maintenance ownership.

    Next step
    Assess current-main compatibility, benchmark value, service terms, cost, and ownership before choosing external-only, documented-profile, or built-in support.

    Review details

    Best possible solution:

    Evaluate the existing custom profile on current main and shared benchmarks before committing to repository-maintained Lazaretto support.

    Do we have a high-confidence way to reproduce the issue?

    This is an adoption proposal rather than an established ClawScan defect; the author supplies external 0.2.0 evaluation evidence, and no live reproduction was performed.

    Is this the best way to solve the issue?

    Custom-profile evaluation follows the documented adoption process; built-in support should follow agreement on value, ownership, target coverage, and current failure semantics.

    AGENTS.md: found and applied where relevant.

    Remaining risk / open question:

    • Comparative detection value, acceptable metered cost, hosted data terms, and ongoing integration ownership remain undecided.
    • The external evaluation targets ClawScan 0.2.0; compatibility with current main has not been independently exercised.

    Codex review notes: model internal, reasoning medium; reviewed against 3308fba908e3.

    Label changes

    Label changes:

    No label changes.

    Label justifications:

    • P3: Optional scanner adoption has an existing custom-profile path and establishes no urgent user impact or broken ClawScan contract.
    Evidence reviewed

    What I checked:

    • Current default branch and repository policy: GitHub identifies main as the default branch and its SHA matches the checkout. The complete root AGENTS.md was read; scanner registration, raw evidence, secret declarations, and Docker guidance apply. The explicit single-reviewer instruction overrides the bundled autoreview requirement. (AGENTS.md:1, 3308fba908e3)
    • Requested adoption remains absent: The built-in registry and profile inventory contain no Lazaretto adapter or profile, and a case-insensitive repository search found no Lazaretto integration. (internal/runner/scanner_registry.go:201, 3308fba908e3)
    • Documented adoption process: Scanner guidance calls for custom-profile evaluation and maintainer discussion before built-in adoption, including ownership of dependencies, target support, output contracts, and fixture-backed validation. (docs/scanners.md:93, 3308fba908e3)
    • Current command and failure contracts: Custom adapters preserve valid JSON on eligible nonzero exits. Failed scanners do not fire rules, but finishArtifact marks their overall artifact incomplete with gate error; TestRunDeclarativeGatePolicySkipsInfrastructureFailureEvidence asserts this. The discussion’s earlier claim that reserved infrastructure failures leave the overall gate passing is outdated. (internal/runner/lifecycle.go:123, 3308fba908e3)
    • Discussion and related work: The full issue, all comments, and paginated timeline were inspected. Searches for Lazaretto, hosted and metered scanners, custom scanners, and the author found no separate adoption item or paired open PR. The merged references fix(runner): quote docker mount fields that contain commas #64, fix: finish AIG cleanup before returning caller interrupts #83, and fix: inspect canonical Markdown prose without swallowing shell operands #124 address mount serialization, AIG interruption cleanup, and Markdown parsing rather than Lazaretto adoption.
    • Credited external correction and evaluation: The author’s linked correction adds error_kind output and an unavailable-status gate rule. The linked evaluation run https://github.com/jamesdfinance-dev/lazaretto-plugins/actions/runs/39491582860 completed successfully; its workflow installs ClawScan 0.2.0, with rate-limit and credit failures simulated outside Docker. This supports the external integration claim but does not establish current-main compatibility. (.github/workflows/clawscan-eval.yml:35, 42215c5bb2c5)

    Likely related people:

    • Patrick Erichsen: Raw commit 7343e0e adds internal/runner/lifecycle.go:140 relative to its recorded parents. This identifies author metadata, not feature responsibility or a PR merger. (role: source-line author; confidence: high; commits: 7343e0e013a7; files: internal/runner/lifecycle.go)
    How this review workflow works
    • ClawSweeper keeps one durable marker-backed review comment per issue or PR.
    • Re-runs edit this comment so the latest verdict, findings, and automation markers stay together instead of adding duplicate bot comments.
    • A fresh review can be triggered by eligible @clawsweeper re-review comments, exact-item GitHub events, scheduled/background review runs, or manual workflow dispatch.
    • PR/issue authors and users with repository write access can comment @clawsweeper re-review or @clawsweeper re-run on an open PR or issue to request a fresh review only.
    • Maintainers can also comment @clawsweeper review to request a fresh review only.
    • Fresh-review commands do not start repair, autofix, rebase, CI repair, or automerge; those execution lanes are retired.
    • Maintainers can comment @clawsweeper explain to ask for more context, or @clawsweeper stop to stop active automation.

    Reviewed October 30, 2026, 3:40 PM ET / 19:40 UTC.

  3. added
    clawsweeper:intake:featurePreliminary submission classification; full source review pending.
    and removed
    clawsweeper:fix-shape-clearClawSweeper found a clear likely implementation shape for this issue.
    clawsweeper:intake:featurePreliminary submission classification; full source review pending.
    on Oct 20, 2026
  4. jamesdfinance-dev commented on Oct 20, 2026

    @jamesdfinance-dev
    Author

    Thanks for the review. The gate finding was right: an unreachable service exited 1 with valid JSON, ClawScan recorded the scanner as completed, and the example profile had no rule for it, so the gate passed.

    Fixed in jamesdfinance-dev/lazaretto-plugins@42215c5

    • Every no-result path now reports status "error" with an error_kind (unavailable, rate_limited, no_credits, config) and exits 1, and the profile gates on status "error". Exit 1 is deliberate: a reserved exit would mark the scanner failed, and failed scanners fire no gate rules.
    • Evaluated under ClawScan 0.2.0 in the Docker sandbox against the live service, with the scanner directory mounted read-only (--sandbox-mount) and the key passed with --sandbox-env: https://github.com/jamesdfinance-dev/lazaretto-plugins/actions/runs/39491582860
    case sandbox scanner gate rule fired
    flagged skill docker completed warn lazaretto-flagged
    clean skill, helper not scanned docker completed warn lazaretto-partial
    unreachable docker completed (exit 1) warn lazaretto-unavailable
    rate limited off completed (exit 1) warn lazaretto-unavailable
    out of credits off completed (exit 1) warn lazaretto-unavailable

    The rate-limited and out-of-credits cases use a local stand-in, run with --sandbox off because the container cannot reach the host loopback. The key appears in no artifact; ClawScan records it as present. The evaluation runs on every change and weekly, and keeps the artifacts.

    For the cost and data question: there is a free tier of 10 scans a day per key, then $0.03 a scan or prepaid packs. A local scan sends SKILL.md; a ClawHub reference sends only the slug. We keep the hash and verdict metadata, not the content.

    Open question for maintainers: keep this as a documented custom profile, or evaluate it for a built-in adapter alongside the existing socket scanner?

  5. 183 remaining items

  6. added
    clawsweeper:intake:featurePreliminary submission classification; full source review pending.
    and removed
    clawsweeper:intake:featurePreliminary submission classification; full source review pending.
    on Oct 30, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    P3Low-risk cleanup, docs, polish, ergonomics, or speculative feature.clawsweeper:needs-maintainer-reviewClawSweeper marked this issue as needing maintainer review before automation.clawsweeper:needs-product-decisionClawSweeper marked this issue as needing a product or behavior decision.clawsweeper:no-new-fix-prClawSweeper does not recommend queueing a new automated fix PR for this issue.enhancementNew feature or requestissue-rating: 🌊 off-meta tidepoolIssue quality rating does not apply to this item.

    Type

    No type

    Fields

    Priority

    None yet

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions