feat(claude): integrate planwright framework, retire migrated pair-flow commands - #30
Merged
Conversation
…ow commands Adds an Ansible task that runs planwright's own writer (scripts/install.sh) to materialize doctrine + skills under the planwright-owned ~/.claude namespace. Retires the seven slash commands planwright now supplies as skills (orchestrate, execute-task, spec-kickoff, spec-draft, self-review, polish, resume); keeps the review-workflow commands planwright does not ship (panel-*, copilot-*, peer-review, code-review). Part of the planwright migration (see specs/pair-flow/tasks.md Deferred: orchestrator retirement).
changed_when matched 'wrote'/'installed', tokens the planwright writer never prints, so the task always reported ok even on a real first install. The writer refresh-copies every run with no changed/unchanged signal, so set changed_when: false. Switch shell->command with environment: for CLAUDE_DIR (drops inline-env quoting and the redundant failed_when) and note the controller-vs-target nuance of the is-exists guard.
A long-lived tmux server freezes the umask of whatever started it; this server inherited 0117, so new directories were created 0660 (no owner execute) and mkdir-dependent tools (Claude Code's Bash scratch dir, ansible temp dirs) failed with EACCES. Set default-command to reset umask 022 then exec a login shell.
…ation - skill-contracts.sh vestigial checks for the 6 deleted migrated commands - ~/dev/planwright undocumented bootstrap prerequisite (silent no-op gate) - latent install.sh symlink-pollution if planwright ships a commands/ dir
The planwright installer task was when-guarded on ~/dev/planwright/scripts/install.sh existing, so a fresh machine without the sibling repo cloned silently skipped the integration and got dotfiles with no planwright skills and no warning. Add a clone task ahead of the writer invocation. Uses the command module with a creates: guard rather than ansible.builtin.git on purpose: creates skips the task once the checkout exists, so a re-run never fetches, checks out, or resets planwright (it is actively developed here and may sit on a feature branch with uncommitted work). The git module's update: false still risks checking out version against the working branch. SSH clone of the private repo; a missing key fails loudly, which is the intended behavior over the prior silent skip. Resolves the panel-pairing / self-review bootstrap-dependency fork.
inkatze
marked this pull request as ready for review
June 15, 2026 21:36
1 task
inkatze
added a commit
that referenced
this pull request
Jun 24, 2026
- pair-flow.yml: reword so the osx.yml pointer attaches to the planwright plugin install, not to config-get.sh (which osx.yml does not reference) - CLAUDE.md: rewrite the /polish bullet to planwright's actual loop (drains all action buckets on-branch, no dotfiles repo-class gating), resolving the contradiction with the Autonomy-gate paragraph - specs/README.md: the pair-flow index row no longer claims it 'defines' the pipeline skills (they moved to the planwright plugin in #30) specs/pair-flow/{design,tasks,kickoff} stale refs left intact: that bundle is preserved as origin spec + history.
inkatze
added a commit
that referenced
this pull request
Jun 25, 2026
* chore(claude): retire pair-flow remnants superseded by planwright planwright now ships the spec-driven pipeline as a plugin, so remove the local pieces it supersedes: - delete scripts/spec-validate.sh (planwright ships its own validator) - trim scripts/skill-contracts.sh to the surviving review commands (panel-*, peer-review); the migrated pipeline skills moved to planwright - drop the dead stale-lock-threshold from pair-flow.yml (planwright owns the orchestrator lock now) - reframe the Spec-Driven Autonomy Pipeline section of CLAUDE.md to point at the planwright plugin and its overlay/doctrine model - move the deferred orchestrate-retirement task to Completed in specs/pair-flow/tasks.md (gate fired: planwright merged + proven) pair-flow-config.sh (repo-class), pair-flow.yml (panel-backends), the inbox substrate, and the panel-*/peer-review/copilot-*/code-review commands stay; planwright has no equivalent. * docs(claude): fix doc-accuracy nits from panel review - pair-flow.yml: reword so the osx.yml pointer attaches to the planwright plugin install, not to config-get.sh (which osx.yml does not reference) - CLAUDE.md: rewrite the /polish bullet to planwright's actual loop (drains all action buckets on-branch, no dotfiles repo-class gating), resolving the contradiction with the Autonomy-gate paragraph - specs/README.md: the pair-flow index row no longer claims it 'defines' the pipeline skills (they moved to the planwright plugin in #30) specs/pair-flow/{design,tasks,kickoff} stale refs left intact: that bundle is preserved as origin spec + history. * docs(claude): fix inbox substrate path [pending-sign-off] scripts/inbox-*.sh pointed at repo root (where MCP sync scripts live); the inbox/heartbeat scripts actually live under roles/osx/files/claude/scripts/. Matches the tracked-source convention this doc already uses for worktree-bootstrap.sh. * chore(observations): note missing shell linter in pre-commit gate * chore(copilot): iter 1, fix tasks.md script paths and cover panel-review in skill-contracts * feat(tmux): cycle windows with Alt-Shift-arrow
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.
Integrates the planwright framework (the extracted, generalized core of this repo's in-repo pair-flow system) and retires the migrated slash-command files, now supplied by planwright as skills.
What landed
roles/osx/tasks/osx.yml: Ansible task invoking planwright's own writer (~/dev/planwright/scripts/install.sh) to materialize the framework into the planwright-owned~/.claudenamespace;when-guarded on the installer's existence.orchestrate,execute-task,spec-kickoff,spec-draft,self-review,polish,resume); planwright supplies them as skills.roles/tmux/files/tmux.conf: per-paneumask 022guard (default-command 'umask 022; exec $SHELL -l') fixing the frozen-server-umask EACCES on scratch-dir creation, preserving the prior login-shell semantics.roles/osx/tasks/osx.yml: clones the planwright sibling repo (creates:-guardedgit clone, never touches an existing checkout) ahead of the writer invocation, so a fresh machine no longer silently skips the integration. Resolves the bootstrap-dependency fork below.Self-review audit record
Standalone pass · base
origin/main· discovery: inline lens walk (declared scoping per Proportionality — small, narrow diff: 7 wholesale command-file deletions plus ~33 lines of config/prose acrossosx.yml,tmux.conf,opportunities.md). Branch already converged by a prior panel-pairing pass; this pass surfaced three follow-up observations and applied no code fixes. Integration verified live: all 8 planwright skills present under~/.claude/skills/, and this pass itself ran on the installed planwrightself-reviewskill.Lens coverage
osx.ymlwhen: (HOME ~ '…install.sh') is exists(Jinja~concat) andcmdare well-formed; tmuxdefault-commandpreserves the prior empty-default login-shell behavior (exec $SHELL -l) while resetting umask, no new edge caseinstall.shpath is fixed and is the user's own repo (trust model =mise trust); no secrets in diff; no hard-disqualifier zone in the applied workwhen-guarded install task silently no-ops when~/dev/planwrightis absent → fresh machine gets dotfiles without planwright skills, no warning (finding #3, queued)install.shbehavior~/dev/planwrightbootstrap prerequisite undocumented outside the task's inline comment (#3)skill-contracts.shstill lists the 6 deleted commands, every ref[ -f ]-guarded so checks silently skip and 3 loops are now fully dead (#2); CLAUDE.md drift (#1)Auto-applicable
Agent-resolvable
Needs sign-off
Needs human judgment (ladder audit)
roles/osx/files/CLAUDE.mdstill documents the superseded pair-flow repo-class model (solo/multi-reviewer split, migrated commands as commands-not-skills,pair-flow-config.sh repo-classas the autonomy gate) after planwright's repo-class-free act-then-review gate is installedspecs/pair-flow/tasks.mdDeferred (orchestrate/execution-skill retirement + doc migration gated on planwright proving runs)~/dev/planwrightdependency? The install task silently no-ops when absent~/dev/planwright", implying a manual sibling clone, but does not specify machine bootstrap; rung 2 (research) n/a; rung 3: no existing dotfiles convention for cross-repo~/devdependencies/panel-pairinghandoff: option 3 — automate the clone. Applied ina3d0216(creates:-guardedgit clone, leaves an existing checkout untouched). Validated: yamllint / ansible-lint (0/0, production) / syntax-check PASSDeclined log
tasks.mdDeferred). Seed logged toopportunities.md(2026-06-15)roles/osx/files/claude/scripts/skill-contracts.shstill lists the 6 deleted migrated commands; 3 of its loops (D-32 subset, D-33 Active-gate, D-36 kickoff-brief) are now fully dead[ -f "$CMDS/$f" ]-guarded so deleted files silently skip (lefthook ran green); planwright now owns those contract guards via its D-32 self-hosting checksopportunities.mdinstall.shcps shipped commands into$CLAUDE_DIR/commands/, which dotfiles symlinks to its tracked source dir → latent repo pollution if planwright ever ships acommands/dirinstall.sh+ the directory symlink; inert today (planwright shipsskills/only, nocommands/)opportunities.mdPending sign-off
[pending-sign-off]commits on the branch)Queued forks
/panel-pairinghandoff (user chose to automate the clone; applied ina3d0216).Pass summary
/self-review, then a/panel-pairingautopilot pass (gemini backend) · base:origin/main· discovery: inline lens walk (self-review) + gemini-2.5-pro panel (panel-pairing) · kickoff brief:specs/pair-flow/kickoff-brief.md(single Active spec; branch name does not match the planwright…/task-<ids>convention) · repo-class: solo.production) ·ansible-playbook main.yml --syntax-checkPASS · lefthook pre-commit PASS. All grounded, none degraded./panel-pairingresult: 1 iteration, converged on 0 Auto-applicable / 0 Agent-resolvable items (gemini independently surfaced the same four findings the self-review pass recorded, all judgment-only with no tool-rule citation, plus three nits — one a validated false positive). Loop exited Human attention required; the bootstrap fork was decided at handoff.a3d0216) · 3 declined-with-rationale (Use local roles instead of external ansible galaxy ones #1, Refactor homebrew tasks to use loop instead of with_items #2, docs(spec): add metrics baseline spec (metrics-baseline) #4). Commits: observations log (262758f), clone task (a3d0216).self-reviewskill's bucket model, routing order, checklist, and audit-table formats match the currentfinding-categorization/gate-wiringdocs.