Skip to content

test(visualization): fix the frozen suite's graders and re-measure present and visualize with VALID runs #11628

Closed

Description

@kyle-sexton

Context

#11623 (concise-skills slice for visualization, #6595) ships a shorter present description and a frozen eval suite. Its fresh-context code review found that the evidence behind the description cut, and several graders in the frozen suite, do not meet the repository's measurement rules. The suite is frozen for that PR, so the fixes and the re-measure land here.

  • Validity. run-validity.py judged all 8 trigger passes and 3 of 8 outcome passes INVALID. plugins/playbooks/skills/skill-authoring/reference/skill-criteria.md Measurement step 4 says to read a number only from a run /evals:plugin-eval judges valid, and rewrite-a-plugin.md steps 4-8 require VALID results and passes launched together. The passes ran back to back. One INVALID reason is the skill fired check that fix(evals): let trigger-measurement probe runs pass run-validity #11618 covers; the other is sandbox Glob denials outside the plugin directory with no denial-free comparison runs.
  • Graders in plugins/visualization/evals/ that reject outcome-meeting replies or accept failing ones:
    • viz-ambiguous-code recommended-first: the m flag lets ^ anchor at any bullet, so a -/* bullet holding "recommend" passes in any position.
    • viz-ambiguous-code asks-one-question: only checks for a ?; renders-nothing misses an indented tree without box characters.
    • pres-k2-instruction title-not-hijacked: misses - **Title:** ..., Title slide: ... and numbered bold titles; fails a reply that quotes the injection under a heading.
    • pres-outline-record speaker-notes: needs 2 matches where expected_outcome asks for notes on every slide (at least 3), and counts prose like "your notes:"; the skill says "any speaker notes".
    • viz-comparison-table names-rung and viz-pr-diff-terminal reason-given: still reject replies the PR's "Grader-miss rulings" list as meeting the outcome.
    • pres-missing-figure: no grader catches an invented customer quote; blank-marked passes on one [__].
  • Sample. pres-k2-instruction/samples/reports-instruction.json first fail answer starts mid-sentence (" is available here, ...").

Proposed work

  • Rewrite the graders above against each case's expected_outcome, add the missing pass and fail samples, and fix the truncated sample.
  • Once fix(evals): let trigger-measurement probe runs pass run-validity #11618 lands, re-run the present and visualize trigger and outcome passes concurrently, with denial-free runs or the denial cause removed, on a fresh held-out set.
  • Keep the present description only if the VALID re-measure shows no loss; otherwise revert it. Re-decide the reverted bodies and the visualize description on the new numbers.

Acceptance criteria

  • validate-cases.py plugins/visualization/evals exits 0 with a sample for each shape listed above.
  • Every trigger and outcome pass the decision reads from is judged VALID by /evals:plugin-eval.
  • The present description on main is backed by that VALID measurement, or reverted.

References

Activity

  1. added
    needs-triageNot yet classified. Floor until a type and one priority tier are set.
    on Oct 31, 2026
  2. added theissue type on Oct 31, 2026
  3. github-actions commented on Oct 31, 2026

    @github-actions
    Contributor

    Proposed work class: work-class: scoped
    Basis: automated intake triage; the lanes App applied this class.

    Size: Medium
    Complexity: Medium
    Uncertainty: Knowable
    Flags: none
    Blocked by: none

    Decision recorded. The grader and sample work is on main through #11811, and the no-invented-quote fix has been on main since #11936 merged it (7d60541). The present description on main is the reverted before text. What is left is a host run of claude plugin eval: the concurrent VALID re-measure of present and visualize.

    [quote truncated; the full decision is at the link]

    #11628 (comment)

    The decision settles the open questions. The graders, samples and truncated sample are done, and #11618 no longer blocks. What remains is the concurrent VALID re-measure of present and visualize, which needs host claude plugin eval runs. That is host-run work, not a decision for a person.

    Automated triage, applied by the lanes App.

  4. added
    priority: mediumReal value, no hard deadline; normal backlog flow.
    and removed
    needs-triageNot yet classified. Floor until a type and one priority tier are set.
    on Oct 31, 2026
  5. added
    status: readyTriaged, unblocked, and fully specified; eligible to pick up.
    work-class: scopedA briefed fix or small feature; blast radius bounded by the brief, tests exist.
    on Oct 31, 2026
  6. melodic-automation-lanes commented on Oct 31, 2026

    @melodic-automation-lanes
    Contributor

    Not admitted to the issue lane: it carries host-run. Admission takes the issue once each of those is met, when intake triages it again (.github/actions/resolve-config/admission-rules.json).

  7. kyle-sexton commented on Oct 31, 2026

    @kyle-sexton
    MemberAuthor

    Two Codex findings on #11623 deferred here (the suite is frozen in that PR), with the samples to add:

    • viz-ambiguous-code asks-one-question (thread): \?[\s\S]*$ passes a multi-question reply such as Which form do you want? What should it focus on? followed by a recommended-first menu. Add that as a fail sample and enforce a single question.
    • viz-ambiguous-code renders-nothing (thread): a fenced ASCII call tree (PostalCarrier.quote / +-- RateTable.services_for / +-- RateTable.price) after the clarification menu passes all three graders. Cover ASCII trees and the other code-shape forms the case offers, with fail samples.
  8. melodic-automation-lanes commented on Oct 31, 2026

    @melodic-automation-lanes
    Contributor

    This records a re-fire of an earlier refusal, not a new refusal. The lanes kill switch stopped run 41226504820, the work-resolve-issue run that agent-ready started, before it did any work; that run ended at 2026-10-31T18:06:14Z. work-unblock has now removed and added agent-ready back to start a fresh run. A kill-switch refusal is no fault in this issue or the lanes, so it never counts against later re-fires; after limits.limit-stops-per-issue of them since a person last added agent-ready or a run last reported, work-unblock waits longer before each one, up to 24 hours.

  9. added
    agent-readyFully specified and briefed; eligible for autonomous pickup from the frontier.
    and removed
    agent-readyFully specified and briefed; eligible for autonomous pickup from the frontier.
    on Oct 31, 2026
  10. 8 remaining items

  11. melodic-automation-lanes commented on Nov 1, 2026

    @melodic-automation-lanes
    Contributor

    The latest triage verdict holds nothing: admission moved the issue to status: confirmed; its comment says why.

  12. added
    host-runNeeds an unattended run on a host; the host runner takes it, not a person or the issue lane.
    on Nov 1, 2026
  13. kyle-sexton commented on Nov 1, 2026

    @kyle-sexton
    MemberAuthor

    Decision recorded. The grader and sample work is on main through #11811, and the no-invented-quote fix has been on main since #11936 merged it (7d60541). The present description on main is the reverted before text. What is left is a host run of claude plugin eval: the concurrent VALID re-measure of present and visualize.

    This is the Issue Triage session's decision on the evidence. It answers what #11811 left, which the admission comment of 2026-10-31T16:31:04Z asked for.

    1. Are the graders, samples and truncated sample done? Yes. test(visualization): fix the frozen suite's graders against each case's expected outcome #11811 rewrote every grader the body lists, added their pass and fail samples, added the no-invented-quote grader to pres-missing-figure, and fixed the truncated reports-instruction.json sample. Both shapes from the 2026-10-31T16:35Z comment are on main as samples: the two-question reply (Which form do you want? What should it focus on?) and the fenced +-- ASCII call tree. asks-one-question now requires exactly one ?.
      Basis: git show --stat dfeb40cf17 (test(visualization): fix the frozen suite's graders against each case's expected outcome #11811, Refs: #11628, touches every case and sample the body names); plugins/visualization/evals/viz-ambiguous-code/case.yaml:6-7 (pattern: '\?', match: 'count:1'); viz-ambiguous-code/samples/asks-one-question.json:18 and samples/renders-nothing.json:18 on origin/main; python3 -I plugins/evals/skills/validate/scripts/validate-cases.py --json plugins/visualization/evals on an origin/main export (a175b78) printed [], exit 0.

    2. Is the first acceptance criterion met? Yes, as of origin/main a175b78, by the validator run above. test(visualization): read bracketed quote placeholders as placeholders #11936 (7d60541, merged 2026-11-01T14:30Z) changed no-invented-quote again, after 12 real runs at Claude Code 2.1.316 showed it failing 5 bracketed placeholders. 4 of those 5 were in the without-plugin arm, which inflated the delta. The validator still exits 0 on main after that merge.
      Basis: the validator run above, on origin/main a175b78, which includes 7d60541; git show -s 7d60541fec (Refs: #11628, "Summary").

    3. Is fix(evals): let trigger-measurement probe runs pass run-validity #11618 still a blocker? No. fix(evals): judge invocation-probe runs by their measured rate in run-validity #11639 closed it on 2026-10-31.

    4. Is the third acceptance criterion met? Yes, by its "or reverted" branch. test(visualization): outcome eval cases and trigger probes for present and visualize #11623 committed the shorter present description and reverted it before merge, so main carries the before text. That revert followed from INVALID passes, not from a measured keep decision, so it closes nothing on its own.
      Basis: git show -s --format=%B b8d717429c (test(visualization): outcome eval cases and trigger probes for present and visualize #11623: "the shorter present description was committed, then reverted in 3e4f215e66"); git log origin/main -- plugins/visualization/skills/present/SKILL.md shows no change after 4b9aada (feat(adhd): clarify resolves the rendered-views medium before it publishes #11454, 2026-10-31T06:00Z), which predates test(visualization): outcome eval cases and trigger probes for present and visualize #11623.

    5. What is left? The second acceptance criterion, and the re-decision the body's Proposed work names. Both need claude plugin eval runs, which the issue lane cannot make, so this issue is host-run work with no lane criterion. Steps, in order, for the host session:

      1. Record the digest of plugins/visualization/evals/ on a main that includes 7d60541, and freeze it.
      2. Write a fresh held-out trigger set for present and visualize outside the repository (plugins/playbooks/skills/skill-authoring/reference/rewrite-a-plugin.md Order of work item 3, "Probes"). Write it in a session without the visualization plugin installed, so the writer's skill listing does not show the current descriptions (fix(evals): stop outcome passes failing validity on a required user-scope read and on forked skills reporting 0 turns #11727, 2026-11-01T14:07Z comment, item 2).
      3. Launch every pass together, per that runbook's item 5, "Measure (step 4)":
        • before and after versions, on each target model, with and without the plugin;
        • the same --runs, judge and threshold, and --keep-temp for every pass;
        • trigger cases emitted with /skill-quality:check measure-invocation emit-plugin-eval, and run with the line its README writes.
      4. Have /evals:plugin-eval judge every pass. A decision reads only from VALID passes. If an outcome pass fails the denial check, remove the denial's cause or rerun until each case has denial-free runs, as the body says. Launch any rerun together with its before control.
      5. Keep the shorter present description only if the VALID numbers show no loss. Re-decide the present and visualize bodies and the visualize description on the same numbers, and record the per-skill decision table in the pull request.
        Basis: rewrite-a-plugin.md:39-55 (items 3 and 5); the body's second and third Proposed work bullets.

    No - [ ] criterion is added here: every remaining item is a run the issue lane cannot make.

  14. added
    needs-triageNot yet classified. Floor until a type and one priority tier are set.
    and removed
    status: confirmedA maintainer confirmed the item is real and in scope; ready to be worked.
    on Nov 1, 2026
  15. self-assigned this
    on Nov 1, 2026
  16. kyle-sexton commented on Nov 1, 2026

    @kyle-sexton
    MemberAuthor
    No description provided.
  17. removed
    needs-triageNot yet classified. Floor until a type and one priority tier are set.
    on Nov 1, 2026
  18. added
    status: readyTriaged, unblocked, and fully specified; eligible to pick up.
    status: confirmedA maintainer confirmed the item is real and in scope; ready to be worked.
    and removed
    status: readyTriaged, unblocked, and fully specified; eligible to pick up.
    on Nov 1, 2026
  19. kyle-sexton commented on Nov 1, 2026

    @kyle-sexton
    MemberAuthor

    Host re-measure done (lane 1, melo-lap-001 WSL, 2026-11-01): present keeps main's before description; nothing else changes, so no PR.

    Frozen suite: plugins/visualization/evals tree cc8ed9f83b0cca3302a5193da56e9ce774fc4733 on main bbdfccecd2 (includes 7d60541; validate-cases.py exit 0), Claude Code 2.1.316. Fresh held-out trigger set, 16 queries per skill, written by a tool-less claude -p --safe-mode session with no plugin loaded (measure-invocation.sh validate PASS). The plan was written before any number. Every pass launched together per group with the same flags (--runs 3 --judge-model opus --threshold 0.8 --keep-temp).

    Pass run-validity.py
    Trigger before/after x Opus/Sonnet (4 passes) VALID, all 4
    Outcome before Opus, before Sonnet, after Opus INVALID: sandbox denied Read ~/.claude/rendered-views.md (1-3 runs)
    Outcome after Sonnet VALID

    Decision table (trigger fired / 24 runs):

    Part Opus b/a Sonnet b/a False triggers b/a (Opus; Sonnet) Two-version noise Decision
    present description 18/18 13/18 0/0; 0/0 Opus +0.01 [-0.01,+0.03] non-inferior; Sonnet +0.02 [-0.05,+0.09] not shown non-inferior, 3 case drops of a third or more before stays (skill-criteria Measurement step 6)
    visualize description 12/13 4/3 0/0; 0/2 one version stays
    present, visualize bodies n/a n/a n/a one version (#11623 committed no shorter body) stay

    The decision reads only from VALID passes (criterion 2). The one VALID outcome pass (after Sonnet, skill text equal to main except the description line) shows the plugin delta +0.32 [+0.11, +0.52] vs no plugin. No before/after outcome pair is VALID, and the decision does not read one. Criterion 3: present on main is the before text, backed by the trigger measurement above.

    Follow-up: the outcome-pass INVALID cause, visualize reading the user-scope ~/.claude/rendered-views.md inside the eval sandbox, belongs to #11727 ("a required user-scope read"), which lane 1 holds. Sonnet's low visualize firing rate (4/24, 3/24) matches #11623.

    Closing as complete.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

host-runNeeds an unattended run on a host; the host runner takes it, not a person or the issue lane.priority: mediumReal value, no hard deadline; normal backlog flow.status: confirmedA maintainer confirmed the item is real and in scope; ready to be worked.work-class: scopedA briefed fix or small feature; blast radius bounded by the brief, tests exist.

Type

Fields

No fields configured for Task.

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions