Repository navigation
Make every shell block in the handoff skill parse, and stop calling /rename the only act there is (#78, #79) - #200
Merged
Merged
Conversation
… the stale claim that /rename is the only act there is (#78, #79) The regression tests only, committed before the fix so the failing state is on the branch: skills/handoff/SKILL.md:755's bare `lclaude <profile>` does not parse under bash -n, and step 5's comment still calls the operator's /rename "the only act there is". The SKILL.md edits are not made yet. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…rename the only act there is (#78, #79) #78: the late-recovery example in skills/handoff/SKILL.md printed `lclaude <profile>`, and bash reads `<` and `>` as redirections, so a person who pasted the block got a parse error instead of a command. The command was renamed from `pclaude` to `lclaude` and the bare placeholder carried through untouched, because nothing here parsed an example block inside a SKILL.md. The placeholder now sits in the quoted parameter expansion step 5 already uses, `lclaude "${CLAUDE_PROFILE_NAME:-<profile>}"`, with only the argument quoted: quoting the whole command, as the issue suggested, would name a program literally called "lclaude ...". #79: step 5's comment said the operator's `/rename <lane>` is "the only act there is". Amendment 12's name guard (the SessionStart hook, `lanes-edit.sh session-start`, and the UserPromptSubmit guard, `lanes-edit.sh guard`) types the rename into the session's own pane, so the operator's is the fallback. "No API renames a running session from inside" stays: a keystroke is not an API. tests/test_skill_shell_blocks.py walks every skills/*/SKILL.md, runs `bash -n` on every fenced sh/bash block, and names the file and line of any that does not parse; it also refuses an untagged or unclosed fence, so a block cannot leave the check by losing its tag. It fails on main's SKILL.md at :755 and passes here. The same file asserts the stale #79 sentence is gone and the guard is named. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Reviewer's GuideThe PR fixes the malformed late-recovery shell example, corrects stale rename guidance to reflect Amendment 12’s automatic name guard, and adds focused regression coverage that parses every fenced shell block in shipped skills. Sequence diagram for automatic session rename with fallbacksequenceDiagram
participant Session as Claude session
participant Hook as SessionStart hook
participant Guard as UserPromptSubmit guard
participant Tmux as Session tmux pane
participant Operator
Hook->>Guard: lanes-edit.sh guard
Guard->>Tmux: guard_type /rename <lane>
Tmux->>Session: type rename command
alt guard cannot run or type
Operator->>Session: /rename <lane>
end
Flow diagram for shell block validationflowchart TD
Skills["skills/*/SKILL.md"] --> Extract[fenced_blocks]
Extract --> Tagged{sh/bash/shell fence?}
Tagged -->|yes| Parse[parse_problems]
Tagged -->|no| Skip[skip tagged non-shell block]
Parse --> Bash[bash -n]
Bash --> Result{parses?}
Result -->|yes| Pass[validation passes]
Result -->|no| Report[report file, line, and block text]
File-Level Changes
Assessment against linked issues
Possibly linked issues
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
This was referenced Oct 13, 2026
brettheap
marked this pull request as ready for review
October 17, 2026 21:01
|
Sorry @brettheap, you've used your own review budget of 250,000 diff characters for the last 7 days. You can request another review in 3 hours and 15 minutes by commenting |
…R on today's main GitHub's refs/pull/200/merge stayed on aaa7bc8 after main moved, so a re-labelled run tested the old base. A head that contains main is tested on it whatever base the run merges with. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
brettheap
added a commit
that referenced
this pull request
Oct 18, 2026
…le's (#55) (#201) Landed on Brett Heap's word "land #200 #201 #203 when green" (2026-10-17), by lane openRepoTools-5. Required Linux CI (guard-launch-mode, tests, tests-no-submodule; run 39079829533) was green on head afe2eb7 with main 2732d59 in its tree. Main has since moved to 83d2690 only through files this PR does not change. Independent review (lane 5, Opus, of f42b982; the merge of main adds nothing to the PR's diff): LAND, no blocking defect. Closes #55 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…R on today's main Main moved through the suite's machinery (#229's tests/test_repo_hygiene.py) and the openRepoShape pin (v1.1.0) after the last green run. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
brettheap
added a commit
that referenced
this pull request
Oct 18, 2026
…olders verifies it, not on kill -0 (#56) (#203) Landed on Brett Heap's word "land #200 #201 #203 when green" (2026-10-17), by lane openRepoTools-5. Required Linux CI (guard-launch-mode, tests, tests-no-submodule; run 39089234266) was green on head 6952a3a with main f595e44 in its tree. Independent review (lane 5, Opus, of c855985; the merges of main add nothing to the PR's diff): LAND, no blocking defect. Closes #56 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
brettheap
pushed a commit
that referenced
this pull request
Oct 18, 2026
Brings in cb3a2c7 (#203, lane-start's transcript follow counts a holder only when transcript-holders verifies it) and f5c3bcd (#200, every shell block in the handoff skill parses) on top of f595e44. Neither touches a file this branch changes, and git merged with no conflict. lane-start's seven rung-5 reader lines, which test_t018_the_legs_reader_is_lane_starts_rung_5_line_for_line holds equal to lanes-edit.sh's legs reader, are byte-identical at f595e44 and f5c3bcd. bash -n passes on lane-start and tests/test_lane_helpers.sh, the two shell files the merge touches. Lane: openRepoTools-3 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This was referenced Oct 22, 2026
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.



What was wrong
Both defects are in
skills/handoff/SKILL.md, and both were found by opensoft/workBenches'devcontainer.test/when it vendored the file byte for byte.#78: a block that does not parse. The late-recovery example printed a bare
<profile>:Bash reads
<and>as redirections whatever stands beside them, so a person who pasted the block got a parse error instead of a command. The command had been renamed frompclaudetolclaudeand the bare placeholder carried through untouched, because nothing in this repository parsed a fenced example inside aSKILL.md(tests/test_repo_hygiene.pyrunsbash -non the twelve top-level command files only). Measured on main f87fd5a, over every fencedsh/bashblock inskills/*/SKILL.md:That is the only block of the 19 (12 in handoff, 7 in restart, none in lane-swap) that fails.
#79: a stale claim. Step 5's comment said "wherever a session comes up outside
lane-startthe operator's/rename <lane>is the only act there is". That was true until Amendment 12. Its name guard now types the rename itself into the session's own tmux pane: theSessionStarthook (lanes-edit.sh session-start, the clause (f) line indocs/README-lanes.md) and theUserPromptSubmitguard (lanes-edit.sh guard,guard_lock_renameand choice 3, viaguard_type). The operator's/renameis the fallback.What changed
pclaude <profile>that fails to parse, unlike every other placeholder in the file #78: the block is nowlclaude "${CLAUDE_PROFILE_NAME:-<profile>}" # and only then; ..., the spelling step 5 already uses forrestart_cmd. Only the argument is quoted. The issue's own suggestion quotes the whole command, which would make bash look for a program literally named"pclaude ...".SessionStarthook and theUserPromptSubmitguard; the operator's/rename <lane>is the FALLBACK where the guard has not run or could not type (hooks not installed, a pane not runningclaude, tmux not answering). The "no API" half, which is still true, is kept. The printedecholine is unchanged, and the suite's pins on it (type /rename <lane>,3719d97) still hold.tests/test_skill_shell_blocks.py(new): walks everyskills/*/SKILL.md, runsbash -non every fencedsh/bash/shellblock (parse only, nothing is executed), and names the file, the line in the file and the text of any block that does not parse. A fence with no language, or one never closed, is a failure too, so a block cannot leave the check by losing its tag. Tagged non-shell blocks (text) are skipped. It is not intests/test_repo_hygiene.py, which lane 1's Follow up #190's test roots: name a refused root's value, check the pin's commit, find paired feature worktrees, show redirected roots under -q, run the lane manual sections, and restate the installer-source test #195 owns.SKILL.md: the installer's tests compare the installed bytes with this file, so nothing else needed updating.Functions and regions edited:
skills/handoff/SKILL.md: step 5'sWHICH ACT REMOVES THIS LINEcomment (about lines 645-652)skills/handoff/SKILL.md: the late-recoveryshblock underlane-handoff --late --at <UTC>(about line 759)tests/test_skill_shell_blocks.py: new file:fenced_blocks,parse_problems,shipped_skills, and six testsNot touched: lines 310-315 of the same SKILL.md and
tests/test_handoff_skill_commit_block.py, which #199 edits.Tests
Added
tests/test_skill_shell_blocks.py, six tests:test_every_shell_block_in_every_skill_parsestest_the_checker_is_not_blind_to_the_blocks_it_checks: handoff and restart each yield at least 5 shell blocks, and both tags appeartest_the_checker_reports_the_defect_issue_78_filed_where_it_is: skills/handoff/SKILL.md:693: the late-recovery example prints a barepclaude <profile>that fails to parse, unlike every other placeholder in the file #78's block as filed, in a synthetic document; the report names line 5, atextfence with the same characters is ignored, and the quoted spelling passestest_a_fence_with_no_language_and_a_fence_never_closed_are_refusedtest_a_fenced_example_inside_a_text_block_is_that_blocks_contenttest_the_handoff_skill_does_not_call_rename_the_only_act_there_is(skills/handoff/SKILL.md: step 5's comment still calls /rename "the only act there is", unreconciled with Amendment 12's guard (pre-existing since 8a36eb3) #79): no "only act there is" anywhere in the skill; step 5's comment namesAmendment 12,SessionStart,UserPromptSubmitandFALLBACK, and keepsno APIFail before, pass after, run as the one file only, not the suite (
python3 -m pytest tests/test_skill_shell_blocks.py, scratchTMPDIR, lane seams unset):SKILL.md, commit 2c4b7a6):2 failed, 4 passed. The two failures weretest_every_shell_block_in_every_skill_parses(the :755 report above) andtest_the_handoff_skill_does_not_call_rename_the_only_act_there_is.6 passed in 0.08s.bash -n: fixed handoff 12 blocks, 0 failing; restart 7 blocks, 0 failing; main f87fd5a handoff 12 blocks, 1 failing (the block opening at line 753).The full suite was not run locally (CI's
testsjob is the record).Closes #78
Closes #79
🤖 Generated with Claude Code
Summary by Sourcery
Ensure shipped skill examples remain copy-pasteable shell and keep handoff rename guidance aligned with the current session name guards.
Bug Fixes:
Enhancements:
Documentation:
Tests: