Context Tree Review
first-tree-ai/first-tree
Review a GitHub pull request or GitLab merge request against the workspace-bound Context Tree when a trusted server-authored Context Reviewer run supplies provider-scoped authority.
Audit an existing Foldkit program against the architecture, conventions, and quality bar.
$ npx skills add foldkit/foldkit --skill audit-program -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install foldkit/foldkit audit-program --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/foldkit/foldkit.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/audit-program .claude/skills/audit-program && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "audit-program" agent skill from https://github.com/foldkit/foldkit/tree/main/skills/audit-program into .claude/skills/audit-program/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "audit-program", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/foldkit/foldkit/tree/main/skills/audit-programType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add foldkit/foldkit --skill audit-program -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install foldkit/foldkit audit-program --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/foldkit/foldkit.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/audit-program .agents/skills/audit-program && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "audit-program" agent skill from https://github.com/foldkit/foldkit/tree/main/skills/audit-program into .agents/skills/audit-program/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "audit-program", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add foldkit/foldkit --skill audit-program -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install foldkit/foldkit audit-program --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/foldkit/foldkit.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/audit-program .cursor/skills/audit-program && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "audit-program" agent skill from https://github.com/foldkit/foldkit/tree/main/skills/audit-program into .cursor/skills/audit-program/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "audit-program", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/foldkit/foldkit.git --path skills/audit-program--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add foldkit/foldkit --skill audit-program -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install foldkit/foldkit audit-program --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/foldkit/foldkit.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/audit-program .gemini/skills/audit-program && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "audit-program" agent skill from https://github.com/foldkit/foldkit/tree/main/skills/audit-program into .gemini/skills/audit-program/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "audit-program", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install foldkit/foldkit audit-programInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add foldkit/foldkit --skill audit-program -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/foldkit/foldkit.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/audit-program .github/skills/audit-program && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "audit-program" agent skill from https://github.com/foldkit/foldkit/tree/main/skills/audit-program into .github/skills/audit-program/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "audit-program", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add foldkit/foldkit --skill audit-program -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install foldkit/foldkit audit-program --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/foldkit/foldkit.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/audit-program .opencode/skills/audit-program && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "audit-program" agent skill from https://github.com/foldkit/foldkit/tree/main/skills/audit-program into .opencode/skills/audit-program/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "audit-program", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
audit-programAudit an existing Foldkit program against the architecture, conventions, and quality bar.
Audit Program is an agent skill from foldkit/foldkit. Audit an existing Foldkit program against the architecture, conventions, and quality bar. Use when the user wants to review their Foldkit code, check for anti-patterns, accessibility gaps, or quality regressions. Triggers on phrases like "audit my app", "review this Foldkit code", "check for anti-patterns", "is this idiomatic?", or "what would the reviewer find?"
Its SKILL.md is about 7.2k tokens, which your agent loads only when the skill is triggered. The skill folder holds 2 other files (for example `agents/openai.yaml`).
It sits in Frontend & Design, covering Customer feedback analysis. It works with Git. The licence is MIT.
7 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit ffbbde1. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
npmgitnodeFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use npm and git, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Audit Program loads about 7.2k tokens when it runs. Until then it costs about 95 tokens; SKILL.md has 3,202 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from foldkit/foldkit at commit ffbbde1, republished under its MIT licence (© foldkit). 3,202 words, ~7,171 tokens.
.claude/skills/audit-program/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.Audit an existing Foldkit program against the same bar generate-program targets: this code should be indistinguishable in quality from hand-written code in packages/typing-game/client/src/ or packages/website/src/. Not "works." Not "structurally valid." Typing-game quality.
Recommended setup: the audit is dramatically higher fidelity when
repos/foldkit/is vendored as a git subtree in the audited project. Without it, you grade against the snapshots ingenerate-program/architecture.mdandconventions.md. With it, you grade against the live exemplars (examples/,packages/typing-game/,packages/website/), which is what those snapshots are summarizing in the first place. If the subtree is missing, recommend adding it before the audit begins, pinned to the release git tag matching the installedfoldkitpackage so the exemplars match the APIs the project compiles against:git subtree add --prefix=repos/foldkit https://github.com/foldkit/foldkit.git "foldkit@$(node -p "require('./node_modules/foldkit/package.json').version")" --squash. For a canary install, whose version (x.y.z-canary.<commit>) has no tag, pin to the full hash of the commit it names instead, which GitHub expands athttps://github.com/foldkit/foldkit/commit/<commit>.
The audit is read-only through Phase 6. The output is a structured report. Never edit a file before the user has seen the report and explicitly approved fixes, no matter how unambiguous a finding seems, no matter how trivial the change, no matter how confident you are. Phase 7 (Offer fixes) is opt-in and gated on user consent per item or per batch.
Concretely, this means:
Edit, no Write, no Bash commands that modify files.The audit's job is to surface findings the user can act on, not to act on them silently.
Resolve $ARGUMENTS:
src/ end-to-end against every dimensiona11y, effects, naming, decomposition, forms, routing, subscriptions, submodels, types, testing) → audit src/ along that dimension onlyIf the argument is ambiguous (could be a path OR a focus), ask which. Don't guess.
Sketch the audit plan in one sentence and confirm before reading code:
"I'll audit
src/page/room/for naming, decomposition, and Effect-TS idiom consistency, comparing against typing-game's room page. Sound right?"
Skip this confirmation only when the scope is unambiguous (single file, single focus). For everything else, the sketch is cheap and the user can redirect before you spend cycles on the wrong target.
Read these in order. Every audit, no shortcuts. They're the spec the audit grades against.
These four files are a snapshot. When the audited project vendors repos/foldkit/, the live source wins over anything here: read the .d.ts or the example rather than grading against a remembered signature.
Do not skim. The audit's signal-to-noise depends on the auditor having internalized the bar before reading the audited code.
Before deep review, build a model of the audited code:
update.ts: handlers for ClickedSubmit, UpdatedEmail, ...).AsyncData, Calendar, File, Http, Update, Port, Subscription, Command, Mount, ManagedResource, CustomElement, Dom from foldkit, plus foldkit/fieldValidation and any component imported from @foldkit/ui. HTTP usage shows up as HttpClient / HttpClientRequest imported from effect/http, not as a foldkit import, so grep for those separately; Http from foldkit is only the layer that provides the client. Tells you which checklist sections apply.${CLAUDE_SKILL_DIR}/../../examples/counter/src/main.ts, ${CLAUDE_SKILL_DIR}/../../examples/stopwatch/src/main.ts${CLAUDE_SKILL_DIR}/../../examples/weather/src/main.ts, ${CLAUDE_SKILL_DIR}/../../examples/form/src/main.ts${CLAUDE_SKILL_DIR}/../../examples/routing/src/main.ts${CLAUDE_SKILL_DIR}/../../examples/kanban/src/${CLAUDE_SKILL_DIR}/../../examples/auth/src/, ${CLAUDE_SKILL_DIR}/../../examples/job-application/src/${CLAUDE_SKILL_DIR}/../../packages/typing-game/client/src/page/room/@foldkit/ui, also read ${CLAUDE_SKILL_DIR}/../../examples/ui-showcase/src/main.ts and ${CLAUDE_SKILL_DIR}/../../examples/ui-showcase/src/ui/ for the wiring pattern.The exemplar is the comparison target. When you find a pattern that smells off, ask: does the exemplar do this differently? If yes, flag it.
@foldkit/oxlint-plugin ships 24 AST rules covering much of what this audit
grades: keyed mapped rows, no array-index keys, hard-coded route strings,
empty-object tagged calls, Rel on external links, spread inside modifyFields, Got*
wrapping of child output, PascalCase Command.define bindings, Mounts whose
execute ignores its element, module-level mutable state, and NoOp Messages.
They parse the code, so they catch what a grep misses.
Establish whether the rules are actually active, which is not the same as
finding the package name. The config is the authority here, not the lint
output. Locate the config before reading anything out of it. A lint script may
name one with --config, and in a workspace the config usually sits above the
app rather than beside it:
grep -n '"lint"' package.json
find . .. ../.. -maxdepth 1 -name '.oxlintrc.json' 2>/dev/nullFinding no config is a different outcome from finding one without Foldkit in
it, and the two look identical if you only read stdout. A grep against a
missing file and a grep against a config that doesn't mention Foldkit both print
nothing. Branch on whether the find located a file at all:
foldkit. A hit under extends pointing at
the plugin's recommended.json, which is what the scaffold writes, or a
jsPlugins entry naming the plugin by path specifier, which is how a monorepo
or vendored setup wires it and how the Foldkit repo itself does it, means the
rules are Active. No hit, but the config has an extends entry pointing
somewhere else, means follow that file and repeat: a shared internal config can
wire the plugin one level up. No hit and nothing left to follow is Not active.Lint output can confirm activation but can never rule it out. Diagnostics are
labelled foldkit(rule-name), so seeing foldkit( proves the rules ran, and
grepping for foldkit/ finds nothing even when every rule is running. Zero
foldkit( matches proves nothing at all: that is what a passing project looks
like. Never infer "not active" from a quiet lint run.
foldkit(...) diagnostic is a
finding, reported like any other, and it outranks a grep hit on the same
subject because the rule actually parsed the code. Do not re-derive those
findings by hand.file:line, which a missing
devDependency doesn't have. Filing it there would also fail every hand-written
app on tooling grounds alone. It is still usually the highest-leverage fix in
the audit, so lead the QUALITY list with it: one devDependency and one
extends line buy continuous enforcement of two dozen invariants, where this
audit is a snapshot. Then fall back to the greps, and say in the report that
they are a weaker substitute, since they miss wrapped calls and renamed
helpers. A clean grep run on an unlinted project is weak evidence, not a pass.foldkit(...)
diagnostic as the Active case, since one diagnostic settles the question. With
no diagnostics, fall back to the greps as above, but say the wiring was
undetermined rather than missing, and name the paths you searched. Do not
recommend installing a plugin that may already be enforcing these rules.A project scaffolded by create-foldkit-app has the plugin installed and wired
by default, so an audited project lacking it usually predates the scaffold or
dropped the config.
Run the canonical greps from the Mechanical scans block in ../generate-program/checklist.md. That checklist is the source of truth. It covers ground no rule touches (API drift, @foldkit/ui adoption, Effect idiom, a11y detail, test shape) plus the deliberate edges of rules that are narrow by design; each such grep names the rule it complements and where that rule stops. Don't duplicate the commands here, and don't delete a scan just because a rule shares its subject: check whether the rule actually covers the case. Note too that recommended.json disables every rule for **/*.test.ts and **/*.test.tsx, so the linter contributes nothing to the test-shape checks in Subagent E. Each hit is either a finding or a // NOTE: justification. Silent hits aren't allowed.
For every hit, decide:
// NOTE: above it justifying the deviation?@foldkit/ui components have small inline-constructable models, and the controlled render helpers have none at all), "the interaction is too custom" (the toView callback handles arbitrary HTML), "we don't want to wire toParentMessage" (that's the unavoidable cost of a11y-correct interactive widgets, paid once per use).Mechanical scans catch the cheap stuff. They're the floor of the audit, not the ceiling.
Walk every category in ../generate-program/checklist.md against the code. Every category, every item, against the actual files.
For non-trivial audits, parallelize. Spawn subagents in a single message so they run concurrently. Each owns one dimension and reads the canonical reference plus the relevant audited files in parallel.
Use Agent with subagent_type: general-purpose. Suggested fan-out:
Subagent A (Structural correctness). Model schema completeness, Message union coverage, Message.match exhaustiveness, every Succeeded* paired with Failed*, every Command identity defined as a PascalCase constant via Command.define, every route variant rendered, no dead state variants. Native web components bound via CustomElement.define, not via OnMount + Subscription + tag-name registry. Flag any custom element wired through OnMount when its surface is just typed properties + observed attributes + dispatched CustomEvents.
Subagent B (Effect-TS idioms). Check that pipe keeps a transformed value as the subject of clear left-to-right data flow rather than merely rearranging an ordinary call. A single transformation is valid when that order carries meaning, including attaching an OutMessage to an existing update return. Prefer Option.match over Option.map(...).pipe(Option.getOrElse(...)), Array.match for empty/non-empty branching, Array.match over .length === 0 / .length > 0 for branching on a Model array (the isArrayEmpty / isArrayNonEmpty predicates take a mutable Array<A> and reject ReadonlyArray), modifyFields over spread, point-free modifyFields setters when they only transform the current field, callable constructors over as Type, Array.fromOption for "zero or one Command", Equal.equals in predicates, and no Effect.ignore on infallible Effects. Check AsyncData over a hand-rolled remote-data union. Inline an update return type when one Message.match is its only use. Create an UpdateReturn alias when another matcher, helper, or exported signature reuses the type. Do not repeat a return annotation on an update already constrained by Message.match<UpdateReturn>.
Use Update.Return<Model, Message> when an update cannot emit an OutMessage. A missing outMessage field means that update emitted nothing. The outMessage?: never guard prevents a result containing an OutMessage from entering code that would keep only its Model and Commands. A hand-written alias must preserve that guard. Producers omit commands when they statically create none. They return computed Commands collections without checking whether they are empty, and never write the literal commands: [].
Keep each result bound to an operation-named value and consume it with dot access. Do not destructure or rename model, commands, or outMessage. Optional Commands pass directly to Command.mapMessages; result.commands ?? [] is for operations that require a concrete array. Dot access keeps the operation and all of its returned fields visible together but does not prevent someone from ignoring outMessage. See repeated-scaffolding and manual-update-return-unpacking in blindSpots.md.
Flag same-Model operations that manually thread result.model and result.commands when a later operation consumes the Model produced by an earlier one; they should use Update.combine. Update.combine needs two or more Steps. Do not wrap one Step in Update.combine; call that operation directly, and name an inline Step parameter stepModel when combining several. When the OutMessage is already known while constructing a new result, include it directly. Use Update.withOutMessage for an existing plain return or a value with the type OutMessage | undefined: pipe an existing return into the helper, and pass a new result literal first. Flag local helpers or conditional spreads that duplicate Update.withOutMessage.
A child fold includes toParentOutMessage only when at least one child OutMessage should continue to the current Submodel's parent. For partial forwarding, match every child variant and return undefined for the variants that stop here. Omit the property when every variant stops here. foldOutMessage still handles each variant locally, including variants that continue upward. Flag toParentOutMessage: () => undefined.
Subagent C (Naming and decomposition). maybe* reserved for Option<T>, is* for booleans, no opaque abbreviations or unexplained single-letter names, conventional domain shorthand allowed, Updated* not Changed*, Completed* mirrors Command name verb-first, named helpers use specific verbs not generic ones, handlers over ~15 lines extracted, view branches over ~30 lines extracted, no function exceeds ~40 lines.
Subagent D (Foldkit UI and accessibility). Hand-rolled input / textarea / button / dialog flagged unless NOTE-justified, label/input pairing via For(id) + Id(id), dynamic errors announce via Role('alert') or AriaLive('polite'), icon-only buttons have AriaLabel, external links carry Rel('noopener noreferrer'), exactly one h1 per route, semantic landmarks (main, nav, header, footer) over div soup, focus visibility preserved (no outline-none without focus-visible: replacement).
Subagent E (Testing, Tier 3+). story.test.ts exists with story pipelines, every fallible Command tested for both Succeeded* and Failed* paths, at least one multi-step interaction test, Submodel tests assert outMessage, Commands resolved via Command.resolve(Definition, resultMessage) not by running Effects directly. scene.test.ts is REQUIRED at Tier 3+ and is a BLOCKER if absent. Each scene block must contain at least one expect(...) or interactive resolution. Locators must be accessible (role, label, text) over placeholder or CSS selectors.
Each subagent prompt is self-contained: the canonical references to read, the file list to audit, the dimension to grade, and the report format from Phase 6. Each returns its findings as a slice of the eventual report.
For Tier 1-2 or focused audits, do the review inline. The surface is small enough that subagent fan-out adds more overhead than it saves.
Walk every entry in ../generate-program/blindSpots.md. That file is the canonical list, shared with generate-program's review loop, so the two skills grade against one bar. For each entry, output one line in your notes: <slug>: clean | flagged at <file:line>: <issue>. Silence is not a pass.
Pick one audited file at random and read it next to the equivalent file in the tier-matching exemplar. Ask:
If the answer to any of those is "no" or "I'd notice", flag the file in the report.
Output the report in EXACTLY this structure. No editorializing, no padding. Every line is a finding the user can act on.
## BLOCKERS
Items that are structurally wrong, logically buggy, or violate
Foldkit invariants. Must fix.
Each item: `path/to/file.ts:line: <what's wrong>. Fix: <action>`.
If none: write `None.`
## QUALITY
Items that work but fall short of the bar: generic naming, inline
handlers that should be extracted, native methods instead of Effect
modules in pipes, views that should be decomposed, branch keys or
key-only wrapper elements that view identity makes redundant, etc. Should fix.
Each item: `path/to/file.ts:line: <the gap>. Idiomatic version: <what to write>`.
Cite the exemplar when relevant: "typing-game does this as X at
page/home/update/handleKeyPressed.ts:33-40".
If none: write `None.`
## NICE-TO-HAVE
Polish items that would push quality further but aren't required:
additional tests, slightly better names, minor refactors.
If none: write `None.`
## VERDICT
One of:
- `PASS`: the code is at the bar.
- `NEEDS-WORK`: there are BLOCKERS or QUALITY items to address.Be specific. Be brutal. Don't grade on a curve. If unsure whether something is at the bar, compare to the exemplar. If the exemplar wouldn't write it that way, flag it.
For every finding, include enough context that a reader can act without re-reading the file:
update.ts:47: naming issueupdate.ts:47: Message named 'ChangeEmail' should be 'UpdatedEmail' to match the verb-first past-tense convention used elsewhere in this file (UpdatedPassword, UpdatedUsername)When findings overlap (e.g. one helper has both a naming issue and a length issue), report each separately. Don't merge: the user needs to act on each independently.
Stop after delivering the report. Send it as its own message. Do not stage edits, do not pre-write a fix plan that bundles changes, do not include "I'll start applying these" in the same response as the report.
Then, in a separate turn, ask whether to apply fixes. Group by reversibility and blast radius:
({}) → ()): offer to batch as one pass. Even the batch needs explicit consent. "Apply all 12 mechanical fixes?" is a real question with a real answer; don't proceed on assumed yes.@foldkit/ui components): offer one at a time, confirm each, show the diff before applying.Don't apply fixes silently. Don't apply fixes the user didn't approve. Don't bundle a structural change into a "mechanical" batch. If the user said "audit my app" without saying "and fix what you find", treat that as report-only and ask before doing anything else.
If the user declines fixes, the audit ends with the report.
If they accept some, apply those, then run the four gate commands and report whether they pass:
npm run format # FIRST: rewrites files
npm run lint
npm run typecheck
npm run testRun format first because it rewrites files. Lint, typecheck, and test then verify the exact code that will be committed. If any gate fails after applying fixes, surface the failure verbatim. Don't auto-revert. Don't suppress.
End with a summary diff: which findings were resolved, which were declined, which remain open.
When $ARGUMENTS narrows to a focus area, Phase 5 reduces to the relevant subagents and blind spots. The report still uses the BLOCKERS / QUALITY / NICE-TO-HAVE / VERDICT structure, just scoped.
Blind spots are named by their slug in ../generate-program/blindSpots.md. Cross-reference by slug, never by position.
| Focus | Subagents | Blind spots |
|---|---|---|
a11y | D | hand-rolled-widgets, a11y-gaps, aria-role-confusion |
effects | B | repeated-scaffolding, manual-update-return-unpacking, functions-doing-two-things, effect-module-inconsistency, stuttery-modifyFields-setters, hand-rolled-async-state, manual-cache-orchestration |
naming | C | naming-drift, messages-naming-the-effect, view-named-after-namespace |
decomposition | C | repeated-scaffolding, functions-doing-two-things |
forms | D + form-specific (Input / Textarea adoption, fieldValidation usage, label/input pairing) | hand-rolled-widgets, a11y-gaps |
routing | A + routing-specific (bidirectional parser usage, route views as identity boundaries with no keyed route branches, urlToString in Internal case) | hard-coded-route-paths, data-derived-keys |
subscriptions | A + subscription-specific (Subscription.make shape, {} fields for always-active, message mapping inside Stream.map) | state-machine-edges |
testing | E | missing-scene-test |
submodels | A + submodel-specific (Got* wrapping, optional outMessage returns, parent ↔ child Message isolation) | manual-update-return-unpacking, flat-parent-message-union, view-named-after-namespace |
types | (inline) type-shape and aliasing | manual-update-return-unpacking, array-type-syntax, unearned-type-aliases, hand-rolled-async-state |
For focused audits, skip Phase 4's full grep block and run only the greps relevant to the focus (e.g. for a11y, run label without For, outline-none without focus-visible, and the _blank scan, reading each hit's attribute block for Rel).
© foldkit, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 1 other file in skills/audit-program of foldkit/foldkit.
Open the folder on GitHubat commit ffbbde1
Audit Program next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Audit Program this skillfoldkit/foldkit | 912 | — | ~7.2k | Automated safety check: Pass | MIT | |
| Context Tree Reviewfirst-tree-ai/first-tree | 154 | — | ~8k | Automated safety check: Pass | Apache-2.0 | |
| App Reviewluxury-yacht/app | 442 | — | ~818 | Automated safety check: Pass | GPL-3.0 | |
| Port Componenttheexperiencecompany/gaia-ui | 221 | — | ~2.9k | Automated safety check: Pass | MIT | |
| Nutui Build Local Verifyjdf2e/nutui-react | 1.2k | — | ~472 | Automated safety check: Pass | None | |
| Compare Array Bundle SizePostHog/posthog-js | 613 | — | ~599 | Automated safety check: Pass | Custom licence |
first-tree-ai/first-tree
Review a GitHub pull request or GitLab merge request against the workspace-bound Context Tree when a trusted server-authored Context Reviewer run supplies provider-scoped authority.
luxury-yacht/app
Audit broad Luxury Yacht systems or cross-cutting concerns for structural simplification, hardening, optimization, or refactoring; use for app-wide reviews and phased structural plans, not branch…
theexperiencecompany/gaia-ui
Ports a UI component from the gaia mono repo (theexperiencecompany/gaia) into the gaia-ui registry.
jdf2e/nutui-react
NutUI 比例缩放本地验证——写回 src/packages 下同路径组件 SCSS(跳过 src/packages//demo.scss 与 demos);--mirror 写 scale-verify/;不写 build。
PostHog/posthog-js
Quickly compare the posthog-js array.js bundle size in the current working tree against a git baseline using the repository's esbuild proxy.
h0x91b/dev-3.0
Create the initial Product UX Bible for an existing web or full-screen web app by deeply auditing the repository, using sub-agents when available, and generating docs/ux manifests, schemas, budgets…
foldkit/foldkit
Create a git commit in the Foldkit monorepo with changeset enforcement and formatting.
foldkit/foldkit
A skill your agent uses whenever working with Foldkit. An agent skill from foldkit/foldkit.
foldkit/foldkit
Generate a complete, idiomatic Foldkit program from a natural language description.
foldkit/foldkit
Concise PR finalization changesets. An agent skill from foldkit/foldkit.
foldkit/foldkit
Dependency maintenance. An agent skill from foldkit/foldkit.
foldkit/foldkit
Review, discuss, or finish a Foldkit pull request opened by an external contributor.
Works with
Categories
Audit an existing Foldkit program against the architecture, conventions, and quality bar. Audit Program is an agent skill from foldkit/foldkit. Audit an existing Foldkit program against the architecture, conventions, and quality bar.
Audit Program fits situations like: the user wants to review their Foldkit code; check for anti-patterns; accessibility gaps; quality regressions.
Run `npx skills add foldkit/foldkit --skill audit-program -a claude-code`. Or copy the skill folder (skills/audit-program in foldkit/foldkit) into .claude/skills/audit-program in your project. Claude Code loads it when a task matches its description.
Run `npx skills add foldkit/foldkit --skill audit-program -a codex`. Or copy the skill folder (skills/audit-program in foldkit/foldkit) into .agents/skills/audit-program in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add foldkit/foldkit --skill audit-program -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/audit-program, .gemini/skills/audit-program, .github/skills/audit-program and .opencode/skills/audit-program in your project.
Going by SKILL.md and its folder, Audit Program needs the command-line tools its instructions call (npm, git and node).
SKILL.md contains no URLs. Its commands use npm and git, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Audit Program is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 7.2k tokens (SKILL.md is roughly 29k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Audit Program: Context Tree Review (first-tree-ai/first-tree, 154 stars), App Review (luxury-yacht/app, 442 stars), Port Component (theexperiencecompany/gaia-ui, 221 stars) and Nutui Build Local Verify (jdf2e/nutui-react, 1.2k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
foldkit (a GitHub organization) maintains it in foldkit/foldkit, which has 912 GitHub stars. The repository holds 17 skills in this directory. The repository was last updated on October 7, 2026.
Source: foldkit/foldkit on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.