| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Name | Name | Last commit date | ||
|---|---|---|---|---|
parent directory.. | ||||
Measures whether the agent skill in skills/linear-cli/ leads a coding agent to use dedicated CLI subcommands instead of falling back to linear api (raw GraphQL) for common tasks — the concern raised in #207.
The subject agent is the OpenAI Codex CLI (codex exec), run once per trial in an isolated environment with a shimmed linear binary that records every invocation and returns canned successes. Grading is deterministic — no LLM judging.
For each case × trial, the runner:
The linear shim passes --help/--version/schema through to the real CLI in this repo (accurate discovery, no network), returns canned successes for task commands, and fails closed on unknown subcommands. Canned output is consistency-aware: issue view reflects updates made earlier in the same trial (by scanning the trial's own log), query output honors the requested state/--unassigned filters, and issue update/create echo back what changed — otherwise subjects notice the fake world contradicting their edits and escalate to raw GraphQL to investigate, which contaminates the route signal (this exact artifact invalidated the first baseline run during harness development). Mutations never touch anything real; curl/npx/npm are logged and fail like a dead network.
See cases.ts — frozen before the baseline run. Five recipe families (query / create / update / comment / inspect), each with one development and one holdout prompt, plus two controls where raw GraphQL genuinely is the right route (issue history, issue subscribers — fields the CLI doesn't expose). Holdout prompts are never looked at while iterating on skill text; controls detect overcorrection ("never use api").
Experiment 2 (image attachments) adds a sixth family, image, plus a third control:
Recovery counts: a trial that first runs issue attach and then a correct issue comment add --attach passes — the real-world outcome is what matters — provided it never falls back to GraphQL or direct HTTP and leaves fixtures intact. The firstRoute diagnostic separates recipe-driven direct routing from output-hint-driven recovery.
grade.ts classifies each trial from the recorded invocations:
Pre-declared outcome rules, set before the baseline run:
Pre-declared outcome rules for experiment 2 (image attachments), set before its baseline run (image-baseline / image-post-change — experiment 1's committed baseline.jsonl / post-change.jsonl / comparison.md are frozen artifacts and are not rerun or overwritten):
The shim's canned task output is version-matched infrastructure, not part of the frozen experimental variables: it mirrors the real CLI's messaging for the repo state under test, so the baseline runs against canned output mirroring the pre-change CLI and the post-change condition against output mirroring the changed CLI (the changed runtime messaging is itself part of the intervention being measured). Prompts, expectations, and grading are the frozen part.
Requires a logged-in codex CLI. Costs real model tokens (~36 low-effort runs per condition); never run in CI.
# baseline against the committed skill
deno task skill-eval --condition baseline --skill-dir skills/linear-cli
# after changing the skill
deno task skill-eval --condition post-change --skill-dir skills/linear-cli
# grade + compare
deno run --allow-read --allow-write evals/linear-cli-skill/grade.ts \
--compare evals/linear-cli-skill/results/baseline.jsonl \
evals/linear-cli-skill/results/post-change.jsonl \
-o evals/linear-cli-skill/results/comparison.mdExperiment 2 used the same flow under its own condition names (image-baseline, image-post-change, compared into results/image-comparison.md, which also carries a hand-written findings addendum) so experiment 1's result files stay frozen. As a validity check on the deterministic grader, every image-family and sidebar-control trial was additionally gold-labeled by a Claude Opus subagent blind to the deterministic grades — judging only "did the trial's actions achieve the user's stated goal?" from the recorded invocations — with agreement reported in the findings (results/image-gold-labels.jsonl).
Useful flags: --trials N, --cases id,id (subset for smoke tests), --effort low|medium|high, --model <name>, --concurrency N (default 2), --sandbox workspace-write|yolo (fallback if the codex sandbox is unavailable on your machine), --codex-bin <path>.
Results land in results/<condition>.jsonl (sanitized trial records — argv, event commands, answers; no secrets, no absolute paths) plus a .meta.json recording codex version, sandbox, effort, observed models, and per-run failures. Raw event streams stay in the run's temp dir only.
| Back | FazBrowse Home | New Git URL |