mirror of
https://github.com/pbakaus/impeccable.git
synced 2026-09-12 06:06:37 +03:00
Stop the update directive from spelling out a command it forbids
Two defects the skill-behavior baseline had recorded as failing on main. `UPDATE_AVAILABLE` told the agent to ask once, then said "If they agree, run `npx impeccable update`", then said to continue without waiting. Nothing gated the run on an answer, and the same sentence removed the wait that could have produced one, so the command read as the next step and sonnet took it. The offer stays; the command leaves the turn. Running it mid-session rewrites the files the session is reading and only takes effect next session, so there is nothing to gain by running it now, and the directive says that rather than relying on the model to infer it. Failed 3 of 3 before, passes 3 of 3 after. Scenario 15 was a broken fixture, not a routing defect. The iOS workspace held PRODUCT.md and nothing else, so `audit the app in this workspace` named an app that was not there: sonnet spent its step budget hunting for it, including a `find /` across the filesystem, and read no reference file at all. The assertion reported "loaded audit.md instead of the variant" when the truth was "loaded neither". One SwiftUI screen makes the request answerable, and the scenario then passes on unmodified main, which is the evidence that the skill text was never at fault. This is the convention MINIMAL_LANDING_HTML already established for the web scenarios; the native fixture never received it. Written with AI assistance (Claude Code). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
c489335799
commit
07663f5fbd
@@ -1013,14 +1013,22 @@ async function fetchLatestSkillVersion() {
|
||||
}
|
||||
}
|
||||
|
||||
// Two instructions used to sit in one directive: ask, and "if they agree, run
|
||||
// it". Nothing gated the second on an answer, and the same sentence said to
|
||||
// continue without waiting, so a run that could never establish agreement was
|
||||
// still spelled out as the next command. The offer stays; the command leaves
|
||||
// this turn entirely, because installing over the skill mid-session changes
|
||||
// files the session is reading and only takes effect in the next one anyway.
|
||||
function buildUpdateDirective(localVersion, latestVersion) {
|
||||
return (
|
||||
`UPDATE_AVAILABLE: A newer Impeccable skill is available ` +
|
||||
`(installed v${localVersion}, latest v${latestVersion}). ` +
|
||||
`Before continuing, ask the user once: "A newer Impeccable (v${latestVersion}) is available. ` +
|
||||
`Mention it once, in this form: "A newer Impeccable (v${latestVersion}) is available. ` +
|
||||
`Update now? It runs \`npx impeccable update\`." ` +
|
||||
`If they agree, run \`npx impeccable update\` (the update applies to the next session, not this one). ` +
|
||||
`Either way, continue the current task without waiting, and do not raise this again.`
|
||||
`Do not run \`npx impeccable update\` in this turn, whatever the user answers: it rewrites the skill files ` +
|
||||
`this session is reading, and the update only takes effect in the next session, so there is nothing to gain now. ` +
|
||||
`Run it in a later turn, only after the user has asked for it in their own words. ` +
|
||||
`Continue the current task now without waiting, and do not raise this again.`
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user