Skip to content

Skill eval harness + eval-validated skill/CLI improvements: Common Tasks, inline-image discoverability (issue #207)#251

Merged
schpetbot merged 3 commits into
mainfrom
skill-eval-207
Jul 23, 2026
Merged

Skill eval harness + eval-validated skill/CLI improvements: Common Tasks, inline-image discoverability (issue #207)#251
schpetbot merged 3 commits into
mainfrom
skill-eval-207

Conversation

@schpetbot

@schpetbot schpetbot commented Jul 18, 2026

Copy link
Copy Markdown
Collaborator

Related to #207.

Two eval-validated changes to the skill (and, in the second case, the CLI), sharing one codex-based eval harness.

1. Skill eval harness + Common Tasks section (experiment 1)

Builds an eval that empirically measures the issue's claim — that an agent reading the skill skips dedicated CLI subcommands and reaches for raw GraphQL via linear api — then uses it to baseline the current skill and validate a "Common Tasks" recipes section.

Metric (36 trials/condition, codex gpt-5.6-sol, low effort) Baseline Post-change
Supported tasks: full success (route + all required flags) 30/30 29/30
Holdout prompts only 15/15 15/15
Controls (GraphQL genuinely required): chose linear api 6/6 6/6

The premise of #207 did not reproduce in this setup. With the skill actually read (verified per-trial via the codex event stream), routing was already perfect before any change. Per the outcome rules declared before the baseline ran (evals/linear-cli-skill/README.md), that is reported as the finding rather than manufacturing harder prompts after the fact. The Common Tasks section is therefore shipped as validated non-regressing — in particular, the new recipes did not overcorrect the controls away from legitimate linear api use — not as a measured improvement.

The one post-change failure was a subject first trying the skill's documented npx alternative (npx --yes @schpet/linear-cli issue create …); the frozen grader counts any npx use as a bypass. It was not a GraphQL fallback, and the trial then completed correctly via linear issue create.

2. Inline-image discoverability fix (experiment 2)

Agents asked to put a visible screenshot on an issue reach for issue attach, which creates a sidebar link attachment that never renders inline — while its success output convinces them the image is visible. The working path, issue comment add --attach, has existed since v2.0.0 but nothing pointed at it. (Observed in real-world agent use; reproduced by the eval below.)

Three coordinated changes:

  • Skill: a Common Tasks recipe for visible images via issue comment add --attach, with an explicit warning about issue attach's sidebar-only behavior.
  • CLI: issue attach now reports "Sidebar link attachment created" and, for images, prints a copy-pasteable hint suggesting issue comment add --attach (shell-quoted, --public preserved). Help descriptions updated on both commands.
  • Eval: a new frozen image family (trap-phrased development prompt, comment-phrased holdout) plus a sidebar control graded on positional args, with pre-declared outcome rules, run under separate condition names (image-baseline / image-post-change) so experiment 1's committed results stay frozen. Both conditions run all 15 cases, so the old families double as a regression guard.
Metric (45 trials/condition, same subject/settings) Baseline Post-change
image-development ("attach the screenshot … so it is visible") 0/3 3/3
image-holdout ("add a comment … visible inline") 3/3 3/3
All experiment-1 supported cases 33/36 36/36
Sidebar control: still route to issue attach 3/3 2/3*

Every baseline image-development trial fell into the trap — ran issue attach, "verified" via issue view --json, and wrongly reported success. Every post-change trial routed directly to the recipe (no runtime-hint recovery needed). With baseline image-family success at 3/6, the pre-declared rules place this in the partial-baseline band: reported as consistent with improvement (exploratory one-sided Fisher p = 0.09), not statistically confirmed.

* The sidebar-control miss is the same known npx-version-check grader artifact as experiment 1's single failure — the trial routed correctly. All 18 image/control trials were additionally gold-labeled by a Claude Opus subagent blind to the deterministic grades: 17/18 agreement, with the sole disagreement being that npx trial (labeler: goal achieved). A post-experiment grading hardening (verify the target issue id) is disclosed in the findings; regrading the committed records under it changed no counts.

Full findings: evals/linear-cli-skill/results/image-comparison.md.

schpet added 3 commits July 23, 2026 09:37
Issue #207 claims agents reading the skill skip dedicated CLI subcommands
and reach for raw GraphQL via `linear api`. Before changing the skill text,
this adds an eval that can actually measure that: codex exec runs each task
prompt in a fully isolated environment (fresh CODEX_HOME + fake HOME so the
globally installed skill can't leak in, recording shims for linear/curl/
npx/npm, workspace-write sandbox) and a deterministic grader classifies
route choice and flag correctness from the recorded invocations.

Cases: five recipe families with development + holdout prompts, plus two
controls where GraphQL is genuinely the right route. Outcome rules were
declared before the baseline ran (see evals/linear-cli-skill/README.md).

Baseline result, 36 trials at low effort on gpt-5.6-sol: 30/30 supported
tasks full success, 6/6 controls on linear api. The premise of #207 did not
reproduce in this configuration — with the skill actually read, routing is
already perfect. Two earlier baseline runs were voided during harness
development because stateless canned outputs (issue view contradicting the
subject's own update; ENG-prefixed identifiers for OPS-team requests)
baited subjects into GraphQL investigation and contaminated the signal;
the shim is now consistency-aware.

Related to #207
…ated

Adds ~7 copy-pasteable recipes near the top of SKILL.template.md (and the
generated SKILL.md): filtered queries via issue query (with the issue
list/mine alias gotcha spelled out), my-issues, create with
--description-file and --no-interactive, update state/assignee/labels
(noting label replacement semantics), comment from file, view/URL. The
boundary note stays generic so it doesn't teach the eval's control answers.

Post-change eval, same frozen 36-trial protocol as the baseline: 29/30
supported tasks full success, holdout 15/15, controls 6/6 still correctly
choosing linear api — no overcorrection from the new recipes. The single
failure was a subject first trying the skill's documented npx alternative
(npx @schpet/linear-cli issue create ...), which the frozen grader counts
as a bypass; it was not a GraphQL fallback and the task then completed
correctly via the CLI. With the baseline already at 30/30, the eval finds
no measurable routing headroom at this configuration; the change is
validated as non-regressing rather than as an improvement. See
evals/linear-cli-skill/results/comparison.md.

Related to #207
Agents asked to put a visible screenshot on an issue reach for
`issue attach`, which uploads the file but creates a sidebar link
attachment that never renders inline — while the success output
("Attachment created") convinces them the image is visible. The working
path, `issue comment add --attach`, has existed since v2.0.0 but nothing
pointed at it: the skill had no image guidance and the flag was buried in
a reference table.

Three coordinated changes, validated as experiment 2 of the skill eval:

- Skill: a Common Tasks recipe for visible images via
  `issue comment add --attach`, with an explicit warning about
  `issue attach`'s sidebar-only behavior.
- CLI: `issue attach` now says it created a sidebar link attachment,
  and for images prints a copy-pasteable hint suggesting
  `issue comment add --attach` (shell-quoted, --public preserved).
  Help descriptions updated on both commands.
- Eval: new frozen image family (trap-phrased development prompt,
  comment-phrased holdout) plus a sidebar-control case graded on
  positionals, with pre-declared outcome rules, CLI/API control split,
  binary-safe fixture checks, and version-matched shim output.

Result (rules frozen before baseline): image-development went 0/3 to 3/3
— every baseline trial fell into the attach trap and wrongly reported
success; every post-change trial routed straight to the recipe. Image
family 3/6 to 6/6 lands in the pre-declared partial-baseline band, so it
is reported as consistent with improvement (exploratory Fisher p = 0.09)
rather than confirmed. Controls held except one known npx-version-check
grader artifact, adjudicated by an Opus gold-label pass (17/18 agreement
with the deterministic grader).
@schpetbot schpetbot changed the title Skill eval harness + eval-validated Common Tasks section (issue #207) Skill eval harness + eval-validated skill/CLI improvements: Common Tasks, inline-image discoverability (issue #207) Jul 23, 2026
@schpetbot
schpetbot merged commit 78f1812 into main Jul 23, 2026
15 checks passed
@schpetbot
schpetbot deleted the skill-eval-207 branch July 23, 2026 17:46
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants