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.
npx agentmods add skills/vanillagreencom/kendex/preflightnpx skills add vanillagreencom/kendex --skill preflightgit clone --depth 1 https://github.com/vanillagreencom/kendexWhat 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.
| Model | Per session | Once 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 |
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.
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.
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 |
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.
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.
- today Changed · -2 lines fc0ceb7d34b3
- 2d ago First seen · 87 lines · 14 tokens per session scan A 2bb3c218e457
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.
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.
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.
text-search
Search indexed text corpora with qmd. For indexed content, prefer qmd over grep.
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…
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.
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.