fix(tests): repoint the model-options vacuity guard at the Python mock - #2442
fix(tests): repoint the model-options vacuity guard at the Python mock#2442cezara98t wants to merge 1 commit into
Conversation
`list_model_options` (#2361, Jul 30) asserts the sh mock's redirect `>> "$(dirname "$0")/calls.log"` to prove its `projects list-models` negative guard is not vacuous. #2375 (Aug 3) rewrote mocks/uip in Python, deleting that line, so the criterion could no longer pass — the task scored 10.0/11.0 = 0.91 in the 2026-08-04 nightly with every substantive check green. Assert the Python mock's `FLAT_LOG` assignment instead: calls.log is the sink the guard above grades, so this names the coupling directly. The mock README already documents this trap ("It broke once already"); #2375 updated the README but missed this task, authored four days earlier. Comment now points at the mock so the next refactor catches it. Not a blanket rename: mock_template_ambiguous and mock_template_taxonomy are still sh mocks and legitimately keep the old redirect. Both are overlays listed second, so they shadow the Python mock in the two tasks that use them. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
Claude finished @cezara98t's task in 1m 26s —— View job SummaryRepoints the vacuity guard in Change-by-Change Review1.
|
| Area | Status | Notes |
|---|---|---|
| Frontmatter | N/A | No skill frontmatter changed |
| E2E Tests | OK | Task YAML fix is correct; total weight preserved |
| Skill Body | N/A | No skill body changed |
| References & Assets | N/A | No references changed |
| Repo Hygiene | OK | Scoped change, no secrets, no cross-skill deps |
Issues for Manual Review
None found.
Conclusion
Clean, well-motivated fix. The asserted string is byte-exact in the Python mock, weight totals are preserved, and the expanded comment should prevent recurrence. Approve.
|
Claude finished @cezara98t's task in 2m 49s —— View job Coder-eval task lint (advisory)1 task YAML changed; verdict counts: 0 Critical, 1 High, 0 Medium, 0 Low, 0 OK (but see note — the High is only the passing-run claim, not a task-design issue). Rubric: .claude/commands/lint-task.md. This check is advisory and never blocks merge. Evidence of passing run❌ High — PR body does not claim the changed task has been run and passed. The author writes:
The reasoning is sound (mechanical string replacement, YAML parses, weights unchanged at 11.0, and CI will validate), but the rubric requires a past-tense claim. Please edit the PR description after CI passes to add a line like: Per-task lint
|
|
Closing — superseded by planned harness-level support for a structured JSONL invocation log, not because the diagnosis changed. Recorded so the finding isn't lost with the PR. In the 2026-08-04 nightly, path: "mocks/uip"
includes: ['>> "$(dirname "$0")/calls.log"'] # weight 1.0#2375 rewrote For whoever migrates this task to the structured log: delete that criterion, do not port it. Once the harness itself fails a negative assertion against a missing log, and generates the recorder rather than each suite hand-writing one, there is no mock source text left to assert against. Translating the sentinel into a jsonl-era equivalent would carry the anti-pattern into the new mechanism — the negative guard should simply become an invocation assertion with a zero-count bound. Also relevant to that migration: Until that migration lands, this task stays at 0.91 — a known, deterministic false negative, not a skill regression. |
Problem
list_model_optionsscored 0.91 in the 2026-08-04 nightly with every substantive check green. Only its vacuity guard failed:That asserts the sh mock's redirect. #2375 (Aug 3) rewrote
mocks/uipin Python and deleted that line, so the criterion can no longer pass. Weights are1.5+1.5+3.0+1.0+3.0+1.0 = 11.0; losing the 1.0 gives10.0/11.0 = 0.909— exactly the observed score.This task (#2361) landed Jul 30, four days before the rewrite. #2375 updated the mock README — which even documents this trap ("It broke once already") — but missed the task.
Fix
Assert the Python mock's
FLAT_LOGassignment instead.calls.logis the sink the guard above grades, so this names the coupling directly. The comment now points at the mock so the next refactor catches it.Not a blanket rename.
mock_template_ambiguousandmock_template_taxonomyare still sh mocks and legitimately keep the old redirect — both are overlays listed second, so they shadow the Python mock in the two tasks that use them.Verification
_shared/mock_template/mocks/uip🤖 Generated with Claude Code