thought-layer-deploy — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited thought-layer-deploy (Agent Skill) and scored it 92/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 2 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 2 flagged
The text {match} tells the agent to skip the normal "ask the user first" gate. Used adversarially it removes the human-in-the-loop check before destructive or sensitive actions, turning a normally-gated agent into a fire-and-forget executor.
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
This is the last step of the loop: rigor -> spec -> build -> a live, owned URL. You are not writing a deploy script by hand; you run the kit's deploy tool, which reads the build manifest and takes the publish directory live. BYOK, nothing phones a central account, no lock-in.
The deploy reads .thought-layer/build.json (written by the thought-layer-build skill or the tl_scaffold tool), co-located with the state file. Honor the same selection as the rest of the kit: an explicit --path / tool path wins, then THOUGHT_LAYER_STATE, then the default .thought-layer/state.json.
build.json with a publishDir that exists on disk. If it is missing, stop and point the user at /tl-build (full build) or the tl_scaffold tool (an instant deployable landing floor). Do not invent a publish dir.build.json.publishDir + entry are load-bearing; hasBackend decides the static-only warning below.Use the tool, never a hand-written curl/netlify invocation:
deploy tool. Start with deploy { dryRun: true } to show the plan, then deploy {} to go live (add anonymous: true to force the no-account path, siteId to re-deploy to the same site).tl deploy (via npx -y @hobocode/thought-layer tl deploy). Use --dry-run first, then tl deploy. Flags: --anonymous, --name <slug>, --site <id>, --path <file>.Always dry-run first and show the user the file list and the target, then deploy.
The tool picks automatically; explain which one ran.
--site <id> (the id is in the deploy output and deploy.json). The token is read only from the environment - never ask the user to paste it into the chat, and never put it in a tool parameter or a file.--allow-anonymous, so the tool checks):--create-site, owned immediately, no claim), or re-deploys to --site <id>.--allow-anonymous) with a one-hour claim link that transfers ownership to whatever account the user logs into. We never reverse-engineer that handshake; it needs a current CLI (npm i -g netlify-cli@latest; the flag shipped 2026-03).If neither a token nor a usable CLI is available, relay the tool's guidance honestly (set a token, install/update the CLI, or drag the publish dir onto https://app.netlify.com/drop) instead of pretending it deployed. If the user explicitly asked for an anonymous deploy but the CLI is logged in, the tool says it went to their account instead and that netlify logout first would make it anonymous - pass that on.
If build.json.hasBackend is true and the build declared a serverless backend, the tool ships it automatically alongside the static front end:
DATABASE_URL is bring-your-own by default (the tool also reads NETLIFY_DATABASE_URL / NETLIFY_DATABASE_URL_UNPOOLED). Two opt-in flags go further: --provision-db / provisionDb provisions Neon with the user's own NEON_API_KEY, and --apply-schema / applySchema applies schema.sql with psql. Both are off by default.BACKEND.md for the manual steps.Relay what actually happened: which site got the backend, which functions shipped, which env names were set versus missing. Do not imply a backend is running when it is not (for example, when only the front end shipped because the CLI was absent).
Report, plainly:
--site <id>);.thought-layer/deploy.json record was written (URL, mode, site/deploy ids) next to build.json.If the tool returned ok: false, do not claim success - surface its message (the next honest step) verbatim.
The deploy is a real-world side effect, not validation state, so it lives in deploy.json on disk, not in the portable state.json. The only optional state touch is a best-effort cursor bump - tl_state cursor (or tl cursor) with { "phase": "deployed" } - pure provenance; if it fails, the deploy still happened.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.