Skip to content
CodeVetter docs
Esc
↑↓navigate↵open⌘Jpreview
On this page

Selective CodeVetter review, testing and performance skills, local invocation evidence, and product-value evaluation.

Agent workflow skills

CodeVetter provides three execution-oriented skills and one evaluation skill. Agents use the matching skill automatically when the task fits, complete the relevant authorized flow, and log whether it helped before handing the task back. A runnable requested check should proceed beyond discovery/planning. Selection does not authorize every execution mode in the skill.

Skill Use it for
codevetter-review Exact agent change, acceptance binding, preflight and qualified review evidence.
codevetter-testing Failure reproduction and changed browser/API behavior with explicit coverage.
codevetter-performance Workload planning, bounded diagnosis and paired optimization verification.
codevetter-evaluate Whether these flows improve agent outcomes enough to justify their overhead.

The tracked sources live in skills/. The CodeVetter plugin bundles these same sources and their recorder; it is the preferred distribution path. Standalone user-level installation uses links to those sources; an existing unrelated skill must never be overwritten. Install them with pnpm skills:install; --destination on the underlying script can select an isolated skill directory. The installer checks every collision before creating links and refuses to replace unrelated state. A new Codex session may be needed for its skill inventory to discover the installation. The current conversation can load the source files explicitly. The agents/openai.yaml files keep implicit invocation enabled.

CodeVetter plugin

Build a new local marketplace package, without overwriting an existing one:

pnpm plugin:build --output artifacts/codevetter-plugin-local
codex plugin marketplace add ./artifacts/codevetter-plugin-local
codex plugin add codevetter@codevetter-local --json

The builder copies an explicit public file allowlist into plugins/codevetter inside that output directory. It includes portable and Codex compatibility manifests, four skills, recorder dependencies and a local stdio MCP bridge. It omits tests, caches, private artifacts, repository code and dependency directories. Sources must be regular files, never symlinks. package-receipt.json binds each packaged file to its SHA-256. Keep the marketplace directory for refreshes. For an update, increment both manifest versions together and build a new directory. Codex refuses to add the same marketplace name from a different source: remove its registration with codex plugin marketplace remove codevetter-local, register the new directory, then run the install command again. This does not delete the old package or the invocation ledger. Do not overwrite a qualified package.

The local plugin requires Python 3 and the installed CodeVetter CLI; it does not bundle the desktop application or install dependencies. No provider key or remote server is needed for its MCP tools. Local stdio is for compatible local clients, not a hosted ChatGPT connector or public directory submission. The install command uses Codex’s plugin manager rather than editing settings. Start a new session after installation to discover its tools and skills. Implicit selection remains host/model behavior and must be evaluated on real tasks; package qualification alone does not prove automatic selection.

The bridge exposes discover_targets, plan_performance, list_invocations, inspect_invocation and assess_invocation. Discovery and planning launch only those fixed CLI operations, with a 60-second recorder timeout; project/runtime/provider execution remains in the existing authorized skill flows. There is no arbitrary command, executable, ledger override or lifecycle hook in the tool input schema. Planning targets must stay within the supplied repository. The local bridge serializes calls; long execution and background jobs are deliberately not exposed through it.

CLI attempts use the existing recorder and ledger, including launch failures and negative assessments. Ledger inspection and assessment do not fabricate new verification runs. Existing standalone installation and receipts remain compatible. When both skill sources are visible, follow one workflow and run each command once; do not count the two installation paths as two invocations. Use the shared use-and-log procedure for transport selection and closing feedback.

Invocation evidence

The shared recorder launches the existing installed CLI without a shell. It resolves a launcher symlink to the executable before launching, so bundled runtime resource lookup works. It does not patch the installed application or change its permissions.

Example, run from the target repository:

python3 <skill-directory>/../codevetter-evaluate/scripts/invoke.py \
  --skill codevetter-performance --repo "$PWD" -- \
  performance --operation plan --adapter node-test \
  --target <repository-relative-test> --json

The recorder stores private per-invocation metadata and canonical JSON in ~/Library/Application Support/CodeVetter/skill-invocations/ on macOS, or ~/.local/share/codevetter/skill-invocations/ elsewhere. --ledger-dir selects an isolated destination for qualification. It stores no argument values or raw stderr in the summary index; fixed allowlisted blocker codes explain recognized failures. A failing receipt’s fixed status maps to unsupported_scope (no_runnable_scope) or admission_blocked (blocked execution plan); a run without a complete receipt is missing_receipt, never a measurement. Full canonical receipts remain local evidence. The CLI’s existing receipt redaction remains authoritative.

Records include originating skill, repository, command/operation, timestamps, wall duration, wrapper and CLI exit status, state, receipt path and SHA-256. Failed launch, timeout, interruption, invalid output and completed attempts remain separate states. Benefit assessment starts as unassessed. New records add opaque task and parent invocation IDs, an explicitly supplied originating agent, receipt schema identity, and execution context. Context includes Git HEAD and dirty-state disclosure before/after, CLI executable and recorder-source hashes, platform, architecture, Python version, capture bound and outer timeout. Context collection duration is measured separately from supervised CLI duration; both contribute overhead. Dirty contents are not captured, so dirty-state observations cannot establish exact source identity. Unknown or absent historical context stays unknown; it is not backfilled.

Generate a task UUID once and reuse recorder flags --task-id <uuid> --agent codex across the task. Link dependent calls using --parent-id <invocation-id>; the parent must belong to the same repository and task. Keep retries as separate invocations. Full task prompts and private labels never become correlation IDs.

python3 <evaluate-skill-directory>/scripts/invoke.py \
  --list --repo "$PWD" --offset 0 --limit 50

The list reports total matching records and supports pagination. It covers skill-mediated commands only. Direct CLI calls, desktop runs, MCP inspection and ordinary repository tests are not fabricated as skill invocations. Unreadable metadata is disclosed separately. A crashed recorder may leave a running record; it does not become a successful terminal invocation.

The recorder has a 2 MiB receipt capture bound and a default 20-minute outer timeout. Engine workload timeouts remain independently enforced. Incomplete or oversized output is not retained as a canonical receipt. Cleanup and workspace mutations use their separately authorized product flows. If process-group signalling is denied, the recorder signals its owned CLI process and discloses that fallback in supervision_warnings; descendant termination is not inferred from that fallback. Terminal metadata is retained.

Surgical evidence access

Filter the list by --task-id, --skill, --state, or --assessment-filter. total counts matching records before pagination, including failed attempts and unassessed records where they match. Unreadable metadata stays explicit.

python3 <evaluate-skill-directory>/scripts/invoke.py \
  --list --task-id <task-uuid> --skill codevetter-performance \
  --assessment-filter did_not_help --offset 0 --limit 50

python3 <evaluate-skill-directory>/scripts/invoke.py \
  --show <invocation-id>

python3 <evaluate-skill-directory>/scripts/invoke.py \
  --show <invocation-id> --pointer /result/diagnosis

Full detail includes the original invocation, canonical receipt and retained assessment revisions, newest first. Field inspection returns only the requested receipt field, pointer and receipt identity. JSON pointer escaping and array indices are supported; empty values remain inspectable. Both modes check saved receipt bytes against the originating SHA-256 before returning evidence. Changed, missing or symlinked evidence fails explicitly. A run that never captured a receipt remains inspectable as metadata with receipt_integrity: not_recorded.

Integrity establishes which recorded bytes were read, not whether an agent’s usefulness claim is correct. The list is a lightweight projection; use detail inspection when verifying evidence integrity. Raw command argument values, environment variables and raw stderr remain excluded. Unknown operation names are summarized as unrecognized rather than retaining arbitrary values.

Closing the usefulness log

Every recorded invocation needs a closing assessment: helped, did_not_help, inconclusive, or blocked. Explain what it contributed, what the agent did with the result, or why it added no useful result. The maintained use-and-log procedure owns the exact command and outcome meanings.

python3 <evaluate-skill-directory>/scripts/invoke.py \
  --assess <invocation-id> --outcome did_not_help \
  --reason unactionable_result \
  --summary 'The diagnosis did not identify an actionable source hotspot.' \
  --evidence-pointer /result/diagnosis

Positive reports require nonempty evidence pointers into a hash-matching canonical receipt. Failed checks can provide useful reproduction evidence; unavailable, interrupted, timed-out and output-limited runs cannot be reported as helped. Operational blockers without receipts can still be logged. Empty explanations and unresolved/changed evidence are rejected.

Assessments append without modifying originating receipts or previous assessments. Listing projects the latest assessment and retains unassessed records, making missing feedback visible. Entries retain measured invocation duration and explicitly unavailable cost. They are agent_reported, with independently_verified: false; they are feedback from actual use, not an independently established productivity result. Never count all positive observations as unique task wins.

Selective use

Review starts with exact task/source preflight and target discovery. Provider execution remains explicit; dual review stays opt-in. Testing keeps the project’s existing runner and reports uncovered acceptance behavior. Installed CodeVetter has no standalone test subcommand. Performance starts with an exact workload plan and requires qualified paired evidence for speedup claims.

Browser execution that can launch apps or take focus follows the repository’s fresh idle-screen authorization rule. Watchers can post statuses; they are not part of ordinary implicit testing. These skills do not introduce new provider, MCP, publishing, deployment, cleanup or secret-reading authority.

Evaluate the value

The evaluation protocol compares the same agent with and without one CodeVetter flow under matched source, task, runtime and total attempt/time budgets. It uses independently adjudicated review outcomes, hidden acceptance checks and canonical paired performance verdicts. Keep false positives, missed bugs, unavailable evidence, extra elapsed time and measured cost visible.

An invocation is activity. A test receipt is evidence for a check. A measured workload speedup is a code outcome. Improved agent productivity requires a controlled task-level comparison. These facts must remain separate in the Runs invocation ledger.

Issue #348 owns the skillification and value-dashboard work. The native Runs viewer now consumes the Rust-owned codevetter.invocation-events/v1 projection. Choose an explicit recorder directory; no personal transcript discovery or legacy backfill occurs. Repository, task UUID, skill, state and observation filters are applied by Rust before 100-row pagination. Page totals, unreadable/unattributed records, ingestion issues and provenance remain visible. The inspector separates hash integrity and agent observations from independent benefit, which remains unknown without a qualified comparison. Recorded receipt paths are informational and never followed by the viewer. Explicit receipt inspection asks Rust to read only the selected session’s fixed receipt.json after checking scope, identity, schema and its captured hash. An optional JSON pointer selects one field; the UI clips display at 16 KiB and can export the complete selected view. Page export preserves the exact projected bytes; neither export rewrites receipts or synthesizes benefits. Saved verification results remain accessible in a separate tab, including existing exact-run handoffs. Skill invocations does not start that tab’s legacy database query. Local preview launchers must still use CODEVETTER_APP_DATA_DIR for an isolated Rust database: a preview bundle identifier isolates native preferences, not the CLI’s application-data directory.

This source implementation has background fixture/contract checks. Actual native interaction on the exact 810c5392 preview verified task/observation filters, receipt integrity, honest unknown independent benefit and scoped no-confidence performance evidence. This is preview evidence, not an installed upgrade. The owner dropped additional matched-agent trials on 9 October; independent productivity remains unknown. Offscreen renders are not native interaction evidence. Current value evidence and limits are recorded in the value baseline. The completed Fleet performance trial records all 43 project outcomes, including blockers and a disputed source recommendation. The testing-speed study prioritizes measured experiments; neither report establishes agent productivity.

Qualification

pnpm test:agent-skills
pnpm test:agent-plugin
python3 -m unittest discover \
  -s skills/codevetter-evaluate/scripts -p 'test_*.py'

Recorder contracts cover concurrent identity, pagination, failed launch, failed receipts, invalid output, timeout, interruption, private-file modes, argument exclusion, launcher resolution and protected cleanup boundaries. Detail contracts cover task/parent correlation, filtered pagination, source changes, executable identity, legacy unknowns, assessment revisions, empty and escaped pointer fields, and rejection of changed or unsafe evidence. The skill-creator validator checks each skill’s metadata and scaffold state. These gates do not establish product value or general automatic-selection accuracy. Live planning smoke uses the installed CLI and retains both failed and successful invocations.

Was this page helpful?