Skip to content

docs(harness-ops): ship eval-gated held rows and three stale-fact fixes - #15469

Open
kyle-sexton wants to merge 8 commits into
mainfrom
docs/harness-ops-held-rows-pilot
Open

kyle-sexton wants to merge 8 commits into
mainfrom
docs/harness-ops-held-rows-pilot

Conversation

@kyle-sexton

@kyle-sexton kyle-sexton commented Nov 11, 2026 •

Copy link
Copy Markdown
Member

No related issue: the held-rows eval pilot for harness-ops (owner decision D24); it has no tracking issue.

Summary

The stage-3 skill re-audit held 24 harness-ops rows (1 cut, 23 rewrites) because no eval suite could see them. This pilot built nine cases for them, ran a detection control (each row's text removed) to find which rows a case can see, and gated each detectable row on base vs head, three runs per arm, with-plugin arm only, on Opus 5.5 and Fable 5.2 (judge opus, deterministic graders only). Three rows ship. The other 21 stay held, with their numbers below.

Fix

  • Row 113 (plugins): the shallow-clone reason for comparing only installs at the clone's HEAD now points at What background auto-update does with credentials. Before, it restated the re-clone beside an unanchored link.
  • Row 74 (lanes): the cloud-session note points at List sessions as JSON, and the schtasks limit points at the /tr row that the config already cites.
  • Row 45 (audit-skill-visibility): usage-counters.md names the binary reading behind the plugin-use definition, and drops an unsourced 1 Hz polling rate and an unlinked "public report".
  • Row 84, fix route (observability): data-sources.md 4.5 and output-format.md no longer describe cli-flag-verify as a PostToolUse hook. It runs at push time in guardrails' reference-verify git hook: plugins/guardrails/git-hooks/entries.json:43-52 lists it as a pre-push entry carrying hooks/cli-flag-verify.sh, and hooks.json registers no cli-flag-verify hook. The section now reports "not collected" instead of reading an empty count as clean.
  • Row 108, fix route (plugins): on Claude Code 2.1.322, claude plugin list prints one row per install record, each with its own scope and version (fresh run plus --help). It no longer prints the highest version across scopes. The record keeps its version, date and trigger, and the rule (never read list or details as what loads here) stays.
  • Row 110, fix route (plugins): changelog 2.1.268, fetched live, says closing /plugin applies changes with no /reload-plugins afterwards. Install a plugin says the panel runs the reload itself after Run /reload-plugins to apply.. The two-step keeps bare-first and --force only on the cache warning. That pointer block drops its as-of/trigger under the pointer rule (contract 6.0.0, docs: a stored value is a copied or measured number or string #15468).
  • Nine new cases under plugins/harness-ops/evals/ stay as coverage.

Verification

Detection uses the base and control trees on Opus 5.5. A row counts as detectable when its grader dropped by at least 2 of 3 runs. Ship needs the documented compare verdict, non-inferior at margin 0.05, on both models. All runs used docker-links.py run -- (the link swap: DOCKER_CONFIG was unset, both links point under /mnt/, and there is no tls/), --ablation none, and TMPDIR=$HOME/.ev.

row case detectable (base → control, Opus) Opus base → head Fable base → head verdict
113 pl-install-summary-and-rollback-lines yes (3/3 → 0/3) 1/3 → 3/3 3/3 → 3/3 shipped
74 la-compaction-resume-and-cloud yes (2/3 → 0/3) 3/3 → 1/3 (CLI); 3/3 → 2/3 after the grader fix 3/3 → 3/3 shipped
45 asv-absent-key-subagent-use-counts yes (3/3 → 1/3) 3/3 → 3/3 3/3 → 3/3 shipped
107 pl-list-version-and-orphan-records yes (3/3 → 0/3) 6/6 → 6/6 6/6 → 5/6 held: Fable not shown non-inferior (lower bound -0.08)
108 pl-list-version-and-orphan-records yes (3/3 → 0/3) n/a n/a fixed as a stale fact (fix route)
20, 29 ap-, pl-install- no (1-run drop) held
15, 17, 25, 34, 38, 50, 64, 66, 71, 90, 115, 120 various no (control did not drop) held
48, 49 cl-one-cluster-stays-inline no held: on base text, Opus already keeps one cluster in-session
84 ob-cost-and-flag-verify no (INVALID: plugin-dir Grep denials; base = control) fixed as a defect (fix route), not eval-gated
52 none no case designable held

The compare runs on the three shipped cases were VALID on both models: Opus non-inferior (lower bound -0.04), Fable non-inferior (+0.00). Spot-reads found three graders that failed correct answers (the cloud wording, the HEAD-compare wording, and "not what loads"). I fixed those graders and reran the compares. An OAuth token revocation during the rerun errored the two pl- cases on three arms, so those were rerun and merged per case.

Other checks, rerun after the fix commit: validate-cases.py exit 0; markdownlint 0 issues; check-skill.sh on harness-ops 18 passed, 0 failed; check-changelog-fragments.sh --check valid; typos clean. Row 110 was held as a rewrite; it is now fixed through the fix route. Eval spend is a list-price estimate: $32.73 on Opus, $30.40 on Fable.

Related

  • Row 64 belongs to cross-plugin item 1 (the pre-compute "one shell invocation" reason).

🤖 Generated with Claude Code

https://claude.ai/code/session_01VcupojQwC9uJAfmSt4EHZm

kyle-sexton and others added 2 commits November 11, 2026 18:46
Pilot of the held stage-3 rows on harness-ops (owner decision D24). Nine
eval cases cover 23 of the 24 held rows; a detection control (each row's
text removed) showed which ones a case can see, and base-vs-head runs on
Opus 5.5 and Fable 5.2 gated each detectable row.

Shipped (non-inferior on both models):
- 113: the shallow-clone reason points at the host-marketplace section
  that describes the re-clone instead of restating it beside a bare link.
- 74: the cloud-session note points at agent view's "List sessions as
  JSON"; the schtasks limit points at the /tr row the config cites.
- 45: usage-counters names the binary reading the plugin-use definition
  rests on and drops an unsourced polling rate and public-report remark.

The new cases stay as coverage.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VcupojQwC9uJAfmSt4EHZm
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Nov 11, 2026 •

Copy link
Copy Markdown
Codex Review Summary: ✅ Completed

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-11-11T23:51:46.710502Z 2e66e9e PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 2e66e9efd7

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

kyle-sexton and others added 2 commits November 11, 2026 19:05
- observability: cli-flag-verify runs at push time in the guardrails
  reference-verify git hook (entries.json:43-52), not as a PostToolUse hook.
- plugins: claude plugin list prints one row per install record on 2.1.322,
  recorded with version and date; the never-trust-list rule stays.
- plugins: since 2.1.268 the /plugin panel runs the reload itself on close;
  the two-step keeps bare-first, --force only on the cache warning.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VcupojQwC9uJAfmSt4EHZm
@kyle-sexton kyle-sexton changed the title docs(harness-ops): ship three eval-gated held re-audit rows docs(harness-ops): ship eval-gated held rows and three stale-fact fixes Nov 12, 2026
@kyle-sexton kyle-sexton added the do-not-merge Hard merge gate: do not merge while applied. label Nov 12, 2026
@github-actions

github-actions Bot commented Nov 12, 2026 •

Copy link
Copy Markdown
Contributor

claude-security-review reviewed e3ee1b43274a3126b65b8e5424e181569c3c769d: read 8 of 8 changed file(s); 0 finding(s), 0 as inline comments.

Security review (incremental, 944fead → e3ee1b4)

I found no security issues in this push. I read every hunk of all 8 files on the incremental list.

What changed

  • Changelog fragment (.changes/harness-ops/docs-harness-ops-held-rows-pilot-7b29b2d0.md): one bullet is reworded. It is prose only.
  • Eval graders:
    • cl-drift-dedupe-sees-closed/case.yaml and ob-cost-and-flag-verify/case.yaml replace a regex with a sentence-scoped pattern that handles negation, and change the flags from i to im.
    • Two sample files gain new pass/fail examples.
    • These regexes run only against the eval's own last_message. They are not a trust boundary, and they gate no lane, token or merge.
  • Eval prompt frontmatter (ob-cost-and-flag-verify/prompt.md, pl-list-version-and-orphan-records/prompt.md): only the description strings change. allowed_tools, max_turns and timeout_seconds are unchanged.
  • Skill context (plugins/harness-ops/skills/plugins/context/scope-semantics.md):
    • The text no longer states as fact that the /plugin panel runs /reload-plugins on close. It now points to the docs for what the panel does.
    • Step 1 of the two-step now has the user check what the panel did before asking for a bare /reload-plugins.
    • Instruction-surface lens: this narrows a claim about what the harness does; it removes no rule against an action. The --force step and the rule that the shell-path sync install still needs a reload are unchanged. I checked it by consequence: without the old text, nothing reaches a destructive, credentialed or outward action unchecked. I did not consult the protected-class register (docs/contracts/instruction-exception-register/README.md) for this narrow prose change.

Checks

  • Trusted paths and trust controls: none of the incremental files match a TRUSTED PATHS: glob. None touch a trusted-actor list, a token request or the broker, the kill switch, a merge hold, a workflow or .github/actions/.
  • Plugin manifests: no plugin.json or marketplace.json change, so there is nothing to report under manifest.
  • PR context and settled threads: no embedded text is directed at the review lane.
  • Prior findings: this lane's earlier review (head 944fead) reported 0 findings, so nothing carries forward.

Mode: this review was blocking only (blocking only: yes), so SUGGESTION findings would have been dropped. None came up.

Spend (not a hold): the eval cases use prepaid API credit or subscription usage when they run. Nothing here can start a real charge.

critical-findings: 0

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

claude-review: 5 inline finding(s) on 944fead9b9953762393e0c48a40ce3f711f2162f; the summary is in this lane's pull request comment.

claude-lane: claude-review

@github-actions

github-actions Bot commented Nov 12, 2026 •

Copy link
Copy Markdown
Contributor

claude-review reviewed e3ee1b43274a3126b65b8e5424e181569c3c769d: read 8 of 8 changed file(s); 2 finding(s), 2 as inline comments.

Code review: incremental, 944fead → e3ee1b4 (blocking only)

This lane already reviewed an earlier head, so this pass reports blocking findings only and drops advisory ones. I read every hunk of the 8 files in the incremental diff. I also read the head case.yaml, prompt.md and sample files of both regraded cases.

What the push fixed. All five earlier findings are addressed, and their threads are settled by the owner's replies at this head:

  • the two grader rewrites
  • the ob-cost-and-flag-verify description
  • the pl-list-version-and-orphan-records description
  • the scope-semantics.md paragraph, which is back to links-only, with step 1 deferring to the pointer

The changelog fragment now matches the reworded plugins text.

Findings (2, both inline). Both come from the new sentence-anchored form of the graders, and both are new problems on the rewritten lines. Neither repeats a settled point.

  1. cl-drift-dedupe-sees-closed/case.yaml:6: dedupe-includes-closed now fails correct answers. Before this push, --state all matched anywhere in the answer. Now it only counts in a sentence that has no negation word anywhere and no . before the claim. So "…so it's found and no duplicate is filed" fails, and so does an answer that cites native-drift.md first.
  2. ob-cost-and-flag-verify/case.yaml:11: no-posttooluse-claim (not_contains) now passes stale answers. A not or doesn't anywhere in a sentence suppresses the match, and so does a dotted filename before the claim. A sentence that asserts the PostToolUse hook and negates something else gets through.

Unverified. I ran nothing; I traced both regexes by hand. The validate-cases.py and check-matchers results in the owner's replies are author-claimed.

Spend (not a finding). The regraded eval cases spend prepaid API credit or subscription usage whenever they run.

No plugin manifest changed in this push, so there are no manifest lines.

- ob-cost-and-flag-verify: the not_contains grader now judges a sentence
  and skips one that negates the claim, so the case's own expected outcome
  passes; that wording is a pass sample.
- cl-drift-dedupe-sees-closed: dedupe-includes-closed fails a negated or
  "only open" reply; both added as fail samples.
- Case descriptions no longer cite pre-fix text (data-sources 4.5, "highest
  across scopes").
- scope-semantics: the /plugin summary paragraph returns to the links-only
  form; the two-step keeps checking what the panel did before a bare reload.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VcupojQwC9uJAfmSt4EHZm

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

claude-review: 2 inline finding(s) on e3ee1b43274a3126b65b8e5424e181569c3c769d; the summary is in this lane's pull request comment.

claude-lane: claude-review

kyle-sexton and others added 2 commits November 11, 2026 19:47
- ob-cost-and-flag-verify: no-posttooluse-claim checks negation only in the
  words just before PostToolUse, and ends a clause at ; or a terminal . so
  a filename dot or a later "not" no longer hides a stale claim. Three such
  answers are fail samples.
- cl-drift-dedupe-sees-closed: --state all and "all states" match anywhere
  again; the negation check applies only to the verb-plus-closed form. Two
  correct answers that tripped the sentence check are pass samples.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VcupojQwC9uJAfmSt4EHZm
@kyle-sexton

Copy link
Copy Markdown
Member Author

Held until #15468 (upstream-drift contract 6.0.0) merges: this PR applies that contract. The fable-5-2 effort session removes do-not-merge when #15468 is on main.

@kyle-sexton kyle-sexton removed the do-not-merge Hard merge gate: do not merge while applied. label Nov 12, 2026
@kyle-sexton

Copy link
Copy Markdown
Member Author

Hold released: #15468 merged, so the merge-order hold (pr-hold reason=merge-order) ends. Updating from main next.

This branch has not been deployed

No deployments
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.

1 participant