preflight

A preflight checker for changed repository files. It examines only relevant added lines and runs checks such as shell syntax and ShellCheck for shell code.

In plain words
What is it for?
Use it before committing, on staged changes, against a chosen base branch, or across all tracked files.
Why use it?
It catches certain errors before a change is committed or reviewed. Its diff-based checks keep findings focused on the current change.

Skill for Claude CodeCodex

Install

Getting it into your agent

One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.

agentmods
npx agentmods add skills/vanillagreencom/kendex/preflight
Any agent
npx skills add vanillagreencom/kendex --skill preflight
Clone the repo
git clone --depth 1 https://github.com/vanillagreencom/kendex

Made for: Claude Code, Codex.

Per session 14 Skills are progressive disclosure: only the name and description are preloaded; the body loads when the skill is used.
When invoked 2,116 The whole file, excluding the scripts and references it only reads on demand.
Security scan A 0 findings. Scan, not verified.
Origin original No closer match found in the catalogue.
Token cost

What it costs to keep this loaded

Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.

ModelPer sessionOnce invoked
Fable 5 $0.00014 $0.02116
Opus 5 $0.00007 $0.01058
Sonnet 5 $0.00003 $0.00423
Haiku 4.5 $0.00001 $0.00212

Measured today against content hash fc0ceb7d34b3, method: parsed. Prices are Anthropic first-party input rates as of 2026-08-30, from the pricing page.

Security

Grade A, and why

preflight scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured today.

The scan reads SKILL.md. This mod also ships 3 executable files (tests/lanes-must-fail.test.sh, tests/modes.test.sh, tests/precision.test.sh), listed below but not scanned — reading those needs a real analyzer, not pattern matching.

A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.

Nothing flagged

None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.

.agents/skills/preflight/SKILL.md · 85 lines

How it starts

The opening of the file, as written. The whole thing — 85 lines — stays where its author put it; the contents beside it link to each section on GitHub.

Preflight

Problem with this skill? Run kendex report — it files to the owning repo automatically. Do not hand-file.

Every lane is diff-scoped and fail-only: findings land only on lines this change ADDED; a lane that cannot decide reports nothing. There is no warnings tier. CONTENT decides which lines a lane may read, never an attribute: the diff is taken with --text, so a .gitattributes -diff or binary row cannot withhold the lines a change adds, and a file whose own bytes are binary contributes no lines in any scope.

.agents/skills/preflight/scripts/preflight              # vs the default branch's merge base
.agents/skills/preflight/scripts/preflight --staged     # staged changes (pre-commit)
.agents/skills/preflight/scripts/preflight --all        # every tracked file, every line

--base REF sets the comparison point; --repo PATH runs against another checkout. The default base is origin/HEAD, then origin/main, then main; if none resolve, the run fails closed.

Lanes

Lane Fails on Tool
shell-syntax A changed shell file bash cannot parse. bash -n
shellcheck-errors Any error-severity finding, anywhere in a changed shell file. shellcheck
masked-returns SC2155/SC2311 on an added line — a declaration whose exit status hides the command's. shellcheck
fail-open An =$(mktemp …) assignment added to a file without errexit; a new script that never sets -e, -u and pipefail, unless git records it non-executable under a scripts/lib/ tree, where nothing can run it and the preamble would set the sourcing caller's mode instead; an added grep/find/git/jq/diff/cmp, at a command position, whose status is discarded by || true (or || :). The same text quoted inside a message is not a finding. built in
unwired-suite A new suite file — tests/*.test.sh, tests/test-*.sh, *.test.ts, *.test.js, *.test.mjs; fixtures excluded — that no tracked runner invokes. Runners are .github/workflows/*.yml, tools/validate*, scripts/validate*, package.json, Makefile, justfile, and any run-all.sh; wiring is the suite named outright, a path-shaped glob its path satisfies, a directory it lives under, a manifest below the repo root whose subtree holds it, a runner beside it globbing its own directory, or a runner invoking bare vitest/jest at a command position — directly, chained after ;/&/` , behind a directly preceding npx/pnpm/yarn/exec/dlx, with NAME=value assignment words (values plain or quoted) allowed before the runner word — whose default include glob covers the suite (*.test.ts/js/mjs) under the directory the runner runs from. A comment (full-line or trailing), dependency key, or package path is not an invocation, and — except a colon-opened value beginning with the runner word, accepted erring quiet — neither is a prose mention; a path-prefixed binary (node_modules/.bin/vitest) is not recognized, and a pinned explicit include/testMatch` is not evaluated. An empty or unreadable runner set: lane stays quiet.
mktemp-trap A new shell file with an added mktemp invocation — the word at a command position, not named in a comment or a string — and no trap … EXIT anywhere in it. built in
hardcoded-temp-path An added directory-creating call taking a literal absolute temp path (/tmp/…, /var/tmp/…) as (part of) its first argument — mkdtemp/mkdir and their Sync variants (JS/TS), mkdtemp/makedirs/mkdir (Python), create_dir_all (Rust), and a shell mkdir -p at a command position. Not the shape: the literal as a value (config field, fixture string, path nothing creates), a $TMPDIR-derived path, or a commented-out call. built in
docs-cited-paths An added backticked path in a .md file, inside a directory the repo really has and the doc's own subtree, that names nothing tracked or on disk. Also the reverse: an added source line citing a .md path that names nothing tracked or on disk — URL spans and double-quoted strings are stripped first; data files (JSON/TOML/YAML/lock), test-named files, and installed-artifact subtrees (.agents/ and the harness dirs' skills/agents/hooks/rules/instructions/packages/kendex trees) are out of scope; the same directory guards apply. built in
applied-migration-edited A path the MERGE BASE carries, changed, deleted or renamed, matching a configured migrations glob. refinery and Flyway record a checksum over a versioned migration's name and text and refuse to run against a database whose recorded checksum moved; the correction is a new migration, never an edit here. PREFLIGHT_MIGRATION_GLOBS replaces the set, default **/migrations/V*__*.sql and **/db/migration/V*__*.sql, which is those two runners' filename shape under the two directory names they use, Flyway's own being the singular one, and nothing else: a runner recording an applied version without a checksum (golang-migrate, Goose, Alembic, Django) reopens its database after an edit, so naming its files would hard-fail a legitimate change. Every other layout is opt-in, sqlx and Flyway repeatable migrations (R__*) included. A leading **/ matches at any depth and is the only depth crossing, so a * never reaches past its own path component. Not the shape: a migration added at a new version, one this branch added and then corrected (the staged scope diffs against HEAD and is qualified against the base for exactly that), and a mode change, which moves no text. --all reads every tracked line as added and a repository with no base to read answers nothing, so both stay quiet, as does an empty value. built in
data-syntax A changed .json or .toml file no parser accepts. jq, taplo or python3

Read the full file on GitHub · 85 lines

Files

What ships with it

5 files beside SKILL.md in the same directory: the scripts, references and assets a skill reads on demand. Not counted in the per-session cost; read them before you install if any of them is executable.

Changes

What this file has done since we first saw it

Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.

  1. today Changed · -2 lines fc0ceb7d34b3
  2. 2d ago First seen · 87 lines · 14 tokens per session scan A 2bb3c218e457

Subscribe to this mod's changes

preflight is a skill published in the GitHub repository vanillagreencom/kendex (65 stars, last pushed today), licensed MIT. It adds 14 tokens to every session and 2,116 once invoked, about $0.0001 per session on Opus 5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-30.

Related

Other skills, from other repositories

surf

Control Chrome browser via CLI for testing, automation, and debugging. Use when the user needs browser automation, screenshots, form filling, page inspection, network/CPU emulation, DevTools streaming, or AI queries via ChatGPT/Gemini/Perplexity/Grok/AI Studio.

w-winter/dot314 · 60 tokens

prose-review

Review prose written for others -- user-facing docs, prompts for other LLMs, inline comments, docstrings, and other-facing messages -- for local jargon leakage, orphaned references, missing grounding, and audience or genre misfit.

w-winter/dot314 · 50 tokens

text-search

Search indexed text corpora with qmd. For indexed content, prefer qmd over grep.

w-winter/dot314 · 22 tokens

repoprompt-tool-guidance-refresh

Refresh RepoPrompt tool guidance when the CLI/MCP surface changes. Tracks RepoPrompt CE (rpce-cli, the maintained target) across versions, and can diff the frozen Classic CLI (rp-cli) against CE. Uses /.pi/agent/skills/repoprompt-tool-guidance-refresh/scripts/track-rp-version.sh to capture/diff --help and -l (tool…

w-winter/dot314 · 115 tokens

xcodebuildmcp

Build/test Xcode projects via the XcodeBuildMCP MCP server using a local CLI wrapper for pi (no MCP support). Use when the user mentions Xcode, xcodebuild, iOS builds/tests, or XcodeBuildMCP.

w-winter/dot314 · 56 tokens

agent-browser

Automates browser interactions for web testing, form filling, screenshots, and data extraction. Use when the user needs to navigate websites, interact with web pages, fill forms, take screenshots, test web applications, or extract information from web pages.

w-winter/dot314 · 51 tokens