Repository navigation
Conversation
… and structural Phase 0-4 sent every failed precondition probe to interactive mode with one reason, so an expired SSO session was reported as an environment that cannot be observed. Classify the failure first. A structural failure falls back as before. A recoverable one is an expired configured credential with a named login remediation that restores exactly the probe's access. With a user present at run start, it is offered once. The user, never the agent, re-authenticates, and the same probes must then return real data. Unattended launches still fall back, now with the true reason. Adds eval Case 18 and a structural expectation to Case 7, with results in the evaluation log. Refs #140 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…able Stage 1 review found that the canonical case could still fall back as structural: aws-cli's error for an sso-session profile (the default format) names no remediation. A remediation may now be derived from a read-only read of the failing probe's own credential configuration. That read uses no token cache and runs no credential-resolving command. An expired output with no identifiable remediation still falls back, quoting that output. The re-authentication boundary now also holds when renewal could complete headless or a runbook says to run it. Case 18 is rebuilt on output captured offline from aws-cli 2.38.6 and flux 2.10.0, gains variants (f) legacy profile and (g) headless runbook command, and is re-run. Refs #140 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Refs #140 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
An unfiltered kubectl config view redacts only token. It prints exec env values and auth-provider client-secret and refresh-token in clear. So the round-1 derivation could pull live secrets into context, and its redaction claim was false. Read the plugin's command and args with a jsonpath, and the profile's type key with aws configure get. Never read env, auth-provider, token, or secret keys. Correct the claim in workflow.md, eval-cases.md and evals.json. Refs #140 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The round-2 jsonpath read printed exec.args whole, and credential plugins take secrets there (kubelogin documents --oidc-client-secret as an exec arg). Filter in the same command with jq so only the exec command, leading subcommand words, and the values of --profile/--region/--cluster-name/--cluster-id reach output, record what the filter still prints as a Known limit, and log the verification run against a throwaway kubeconfig. Refs #140 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Split 0-4's recoverable conditions into nested bullets and move the remediation derivation into its own "Deriving a remediation" paragraph, with the jq command (unchanged) as a fenced block. Add the rule that a filtered output with no or an empty --profile derives nothing, and that a request for the agent to re-authenticate counts as the remediation not done. Record a remediated precondition in 1-5, tighten SKILL.md's derivation summary, and correct the stale eval-log paragraphs. Refs #140 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ctations Refs #140 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
aoshimash
marked this pull request as ready for review
October 28, 2026 17:17
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Stack
Stacked on #152 (
feat/137-renovate-prbodynotes-input), level 2.Merge #152 first. Once it has merged, this PR must target
mainbefore it is merged — GitHub retargets it if the base branch is deleted after that merge, and the next run of implement-issue retargets it otherwise; if neither has happened, retarget it by hand.Decisions & Deviations
Unable to locate credentials. You can configure credentials by running "aws login".Setting up access is not restoring it, and the issue names "no cluster credentials are configured" as structural. Eval Case 18 (e) pins this.Risk Areas
aws configure get sso_session. It reads no token cache and runs no credential-resolving command; since 71d8d33 the kubeconfig read is filtered through a jq allowlist (exec command, leading positional args, and--profile/--region/--cluster-name/--cluster-idvalues only), soenv,auth-providerand every other arg never reach output. Known limit: a secret passed as the value of an allowlisted flag would still print; without jq, nothing is derived. An expired output with no identifiable remediation stays structural but quotes that output. SKILL.md step 4 now matches 0-4. Case 18's base variant now uses the realsso-sessionstring. Stage 1 round 1: the issue's canonical case can still classify as structural.workflow.md:94condition (2) needs the remediation to be named by the probe's output or by repo docs. Only the legacy SSO profile format names one. Thesso-sessionformat, whichaws configure ssowrites by default, does not. Reproduced with aws-cli 2.38.6, a throwaway config, and an expired cached token.aws eks get-token --profile <p>exits 255 withaws: [ERROR]: Error when retrieving token from sso: Token has expired and refresh failed. That output names no remediation. A repo without a runbook line therefore falls back with the fixed reason ("structural"). That is the outcome merge-renovate-prs: split Phase 0 precondition failures into recoverable and structural #140 asks to remove.SKILL.md:71is narrower still: it requires the error itself to name the remediation and leaves out repo docs. Decide explicitly how an expired session with no remediation in its output is classified. Pin that decision with a variant that uses the realsso-sessionstring.aws: [ERROR]:/An error occurred (NoCredentials):prefixes, the flux✗ failed to get server groupswrapper, and exit codes 255, 253 and 1. Only the server URL is replaced. The legacy format is variant (f). The strings are listed in the eval log. Stage 1 round 1: Case 18 is not grounded in a captured artifact, although capture is cheap. The "Unable to locate credentials" failure (e) is one read-only command. With empty config,aws sts get-caller-identitygivesaws: [ERROR]: An error occurred (NoCredentials): Unable to locate credentials. You can configure credentials by running "aws login".(exit 253). Both expired-SSO formats are reproducible offline with an expired cached token in a throwawayHOME. The fixture uses only the message cores. It omits the realaws: [ERROR]:/An error occurred (NoCredentials):prefixes. It carries only the variant that names its remediation (see the previous entry). AGENTS.md says to "Model eval fixtures on real artifacts". Here the one real anchor is merge-renovate-prs: split Phase 0 precondition failures into recoverable and structural #140's one-sentence Observed note, which covers only variant (a). (eval-cases.md:222,:365,evals.json:283)eval-cases.md:371). The AC evidence "Case 18 (b) and (d) pass with the skill" is therefore no evidence that the skill text has any effect on that boundary. Add a variant where renewal could succeed non-interactively. One example is a runbook or tool that names a login command which completes headless, from a cached refresh token or a non-browser flow. Then check that the agent asks rather than runs it.kubectl config view --minify --context <ctx> -o jsonpath='{.users[0].user.exec.command} {.users[0].user.exec.args}'andaws configure get sso_session, and neverenv,auth-provider, a token or a secret key. Run as written against the repro kubeconfig, it printed onlyaws ["eks","get-token",…,"--profile","platform-admin"], and nothing for theoidccontext. The redaction claim is removed from workflow.md, eval-cases.md and evals.json, and 0-4 now states what an unfiltered view leaks. Stage 1 round 2: the remediation derivation can read secret material, and its redaction claim is rounded up.workflow.md:94has (2) read the probe's credential-plugin entry withkubectl config view --minify --context <ctx>, "which redacts embedded secrets unless--rawis passed", while requiring "never a secret value". Without--raw, kubectl redacts onlytoken(and omits certificate/key data). Reproduced with kubectl v1.37.1 on a throwaway kubeconfig: under--minify, an exec entry'senvvalues (e.g.AWS_SECRET_ACCESS_KEY) and anauth-providerentry'sclient-secretandrefresh-tokenprint in clear. OnlytokenshowedREDACTED. The round-1 check behind the claim covered only atoken(eval-cases.md:385), and Case 18 repeats the claim (evals.json:284, "which redacts secrets"). So the prescribed command can put live credentials into the agent's context, contradicting the PR's own "reads no secret material" constraint and AGENTS.md's rule against claims the mechanism does not deliver. The other three properties hold.aws configure get sso_sessionreads config only (exit 0 offline, no token load), nothing in the derivation runs a login, and the re-probe still needs real data. Fix: narrow the read to the non-secret fields (e.g.-o jsonpath='{.users[0].user.exec.command} {.users[0].user.exec.args}', verified to print onlyaws ["eks","get-token",…,"--profile","platform-admin"]), and state what kubectl redacts and what it does not.--oidc-client-secret=…, secretenv,auth-providerand adversarial arg layouts — no secret printed; residual leak of an allowlisted flag's value recorded in 0-4 Known limits). Stage 1 round 3: execargscan carry a secret, and the text does not say so. The round-2 leak is fixed. Run as written against the round-2 kubeconfig, the jsonpath read printed onlyaws ["eks","get-token","--cluster-name","prod","--profile","platform-admin"], and nothing foroidc.aws configure get sso_sessionprintedcorp. Noenvorauth-providervalue appeared. The 0-4 statement about what an unfiltered view redacts also holds (kubectl v1.37.1). Butworkflow.md:94reads{.users[0].user.exec.args}whole, and real configs put secrets there. int128/kubelogin'sdocs/setup.md(line 80) tells users to add--oidc-client-secret=YOUR_CLIENT_SECRETas an exec arg. With such an entry, the command as written printed--oidc-client-secret=ARGSECRET999in clear (exit 0). So the same paragraph's "Never read … a token, or a secret key" cannot be kept by the read it prescribes. The PR body's "It reads no token cache or secret value" andeval-cases.md:405("never … a token or a secret key") round the mechanism up the same way. Nothing records this as a known limit. Fix: either keep secret-bearing args out of the agent's context, for example by filtering the output in the same command so that only the values of named flags such as--profilesurvive, or state in 0-4's Known limits thatargscan carry a secret and that the read then puts it in context. Then align the PR body and the eval log.env-only profile resolves as structural with no rule behind it — (2) now says a missing or empty--profileidentifies no profile, derive nothing, never assume the default (Important). Minors: 0-4 restructured into nested conditions plus a Deriving a remediation paragraph with the jq command in a code block (byte-identical to 71d8d33's); SKILL.md step 4 says the derivation is filtered; 1-5 lists a remediated precondition; declining to run the login is defined as "not done → fall back"; stale eval-log paragraphs corrected.expected_outputbut not in the gradedexpectations, so 7/7 does not grade it; the eval log now says so.Acceptance Criteria → Evidence
Gate Results
claude-review, the only workflow triggered on this PR; the repository defines no test or lint workflow, and project checks run in pre-commit hooks)./code-reviewwithout--comment, see Correct claude-review draft behaviour in AGENTS.md #155).Changes
plugins/aoshimash-skills/skills/merge-renovate-prs/references/workflow.md: 0-4 failure classification, the recoverable branch and known limits; Mode selection wording.plugins/aoshimash-skills/skills/merge-renovate-prs/SKILL.md: Phase 0 step 4 summary; user-choice usage note.plugins/aoshimash-skills/skills/merge-renovate-prs/evals/evals.json: Case 18autonomous-precondition-recoverable; one more Case 7 expectation.plugins/aoshimash-skills/skills/merge-renovate-prs/references/eval-cases.md: Case 18 prose, a Case 7 bullet, the intro sentence, the evaluation log entry and a summary row.Closes #140
🤖 Generated with Claude Code