Probe skill lifecycle, resume and interactive mode across harnesses - #991
Conversation
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Hook and plugin install paths stay on sb.repo; only ask()'s launch dir moves. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…ns (#961) capability-matrix.md regenerated: existing rows gain seven n/a (not run) cells. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Each daemon driver now spawns once and takes several ask() turns on the same process, and the fake adapter grows a resumable session and a frozen-catalogue /reload for the TUI driver in the next task. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The fake tui vendor's reply now matches the queried skill's name against its catalogue, since a stale entry for a different skill would otherwise be mistaken for the answer. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…eam (#961) A turn parsed from its raw stream must not see the previous turn's frames, or a silent second turn would inherit the first turn's token. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…961) Codex deletes its last-message file before each run: a resumed turn would otherwise read the previous turn's answer from it. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…tor (#961) FakeAdapter's startup-hook path also moves from a scalar to a per-sandbox map: one adapter instance now runs every scenario's arms in turn, and a stale hook path from an earlier arm's already-torn-down sandbox otherwise crashes the next one's turn. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
#961) A vendor streams its answer beside a spinner that redraws in place, so the concatenated bytes interleave the two; the interactive prompt also has to ask for a marked line, and a screen without one is a failure to measure rather than a skill that was absent. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude redraws the trust list after first painting it: a selection moved during that paint is reset, and the Enter behind it then confirms the default, which is to quit. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…961) Claude's resumed turns come back as refusals with no output and Codex rejects the sandbox flags on resume: both were landing as 'the skill was not there'. A later turn now asks for the token the skill carries now, so a session answering from its own context is wrong rather than lucky. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…961) Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
#961) Cursor repaints its whole transcript, so the previous turn's reply is still on screen after the clear; a later turn now asks for a mark only it carries. Its composer also swallows an Enter sent straight behind the text, and a failed screen keeps its log. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The hook captured stdin for two seconds to survive a vendor that never closes it; on a terminal that input is the UI's, and OpenCode sat waiting for a keystroke the hook had eaten. Claude also raises an auto-mode wizard between turns, which took the next prompt as its own input. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
A service left behind by an earlier sandbox leaves the interactive UI drawing nothing at all, and would serve that sandbox's catalogue to this one. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
A live session sees a new skill only on Codex and Kiro; a rewrite also reaches Pi, Cursor and OpenCode, while Copilot serves what it read at startup. Three harnesses ignore the repository root when launched from a subdirectory. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
PR Summary by QodoExtend skill probes for lifecycle, resume, and interactive sessions
AI Description
Diagram
High-Level Assessment
Files changed (30)
|
Code Review by Qodo
1.
|
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 4e80f165ad
ℹ️ 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".
| "if [ ! -t 0 ]; then\n" | ||
| " { exec 3<&0; } 2>/dev/null || exec 3</dev/null\n" |
There was a problem hiding this comment.
Guard the terminal check against closed stdin
When a vendor invokes the startup hook with fd 0 closed, this test -t condition causes /bin/sh to exit with status 2 before the fallback on the next line can run. This is reproduced by HookScriptTests.test_script_tolerates_a_closed_stdin, which now fails; because the mutation and fired stamp are written before this point, lifecycle scenarios can record the hook as fired even though the vendor received a failing hook and may change or abort startup behavior. Make the terminal test itself tolerate an invalid descriptor.
Useful? React with 👍 / 👎.
) A read ends wherever the kernel split it, so a cursor sequence cut in half was rendered as screen text. A session whose startup failed is closed by the starter, since nobody else holds it, and a hook proves fd 0 is readable before exec dups it. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The workspaceOpen hook writes into a plugin directory it returns, so the arm was checking a path nobody creates and could only ever record untested. Both the project file and the user file deliver the skill. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
8e40b6c
into
alexeyzimarev/ai-2829-verify-repo-local-skill-discovery-and-startup-ordering
Closes #961 — AI-2829
What & why
Pass 1 answered where a repo-local skill has to be to reach a session's first request. Pass 2 answers what happens afterwards: whether a session already running sees a skill added, rewritten or deleted, whether a resumed session does, which tree a harness searches when it starts in a subdirectory or a linked worktree, and whether one session sees another's startup hook. It adds a third launch mode that drives each vendor's own interactive UI on a pseudo-terminal, since that is where a reload command exists at all. Nine harnesses, three modes, two runs per arm. No production code changes.
Where to look
findings.md"Consequences for #778 and #962". Writing into a live session works only on Codex and Kiro; a rewrite also reaches Pi, Cursor and OpenCode, while Copilot serves the body it read at startup and its only live route is/skills reload, which exists in the interactive UI alone. Claude keeps serving a rewritten skill's old body and refuses the question outright after a resume. Pi, Kiro and Cursor ignore the repository root when the session starts in a subdirectory, so a materializer anchored there is invisible to three of nine. Every harness reads its own linked worktree and none reads a sibling's, and oneinfo/excludecovers them all.A run that produces no answer is recorded as a failure to measure, never as a negative. That rule is what separates Claude's refusals and Codex's rejected resume flags from a skill that was genuinely absent.
Verification
🤖 Generated with Claude Code