Skip to content

feat(claude): integrate planwright framework, retire migrated pair-flow commands - #30

Merged
inkatze merged 6 commits into
mainfrom
planwright-integration
Jun 15, 2026
Merged

feat(claude): integrate planwright framework, retire migrated pair-flow commands#30
inkatze merged 6 commits into
mainfrom
planwright-integration

Conversation

@inkatze

@inkatze inkatze commented Jun 15, 2026

Copy link
Copy Markdown
Owner

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 ~/.claude namespace; when-guarded on the installer's existence.
  • Retires 7 migrated command files (orchestrate, execute-task, spec-kickoff, spec-draft, self-review, polish, resume); planwright supplies them as skills.
  • roles/tmux/files/tmux.conf: per-pane umask 022 guard (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:-guarded git 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 across osx.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 planwright self-review skill.

Lens coverage

Lens Findings Notes
Correctness, logic, edge cases none osx.yml when: (HOME ~ '…install.sh') is exists (Jinja ~ concat) and cmd are well-formed; tmux default-command preserves the prior empty-default login-shell behavior (exec $SHELL -l) while resetting umask, no new edge case
Security none No untrusted input; install.sh path is fixed and is the user's own repo (trust model = mise trust); no secrets in diff; no hard-disqualifier zone in the applied work
Error handling and failure modes 1 when-guarded install task silently no-ops when ~/dev/planwright is absent → fresh machine gets dotfiles without planwright skills, no warning (finding #3, queued)
Performance n/a Config / prose diff; installer refresh-copies a tiny tree each run (negligible)
Concurrency / state n/a No concurrent logic in the diff
Naming, readability, structure none Clear task name; in-diff comments accurate and verified against install.sh behavior
Documentation 2 CLAUDE.md model drift (#1, deferred); ~/dev/planwright bootstrap prerequisite undocumented outside the task's inline comment (#3)
Tests / verification none No ansible/tmux test harness (pre-existing logged gap); changes verified by yamllint + ansible-lint + syntax-check
Cross-file consistency 2 skill-contracts.sh still 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

# Finding Tool + rule Fix Commit
none

Agent-resolvable

# Finding Test Before → after CI Brief alignment Commit
none (no test harness ships; bucket effectively unavailable)

Needs sign-off

# Finding Fix applied Route reason Commit Checklist ID
none

Needs human judgment (ladder audit)

# Fork Ladder record Outcome Options
1 Tracked roles/osx/files/CLAUDE.md still documents the superseded pair-flow repo-class model (solo/multi-reviewer split, migrated commands as commands-not-skills, pair-flow-config.sh repo-class as the autonomy gate) after planwright's repo-class-free act-then-review gate is installed rung 1: specs/pair-flow/tasks.md Deferred (orchestrate/execution-skill retirement + doc migration gated on planwright proving runs) resolved at rung 1 → re-routed to declined-with-rationale (doc-model migration is spec-tracked-deferred, not this branch's deliverable)
3 How should the dotfiles bootstrap handle the ~/dev/planwright dependency? The install task silently no-ops when absent rung 1: spec Deferred says planwright is "name-locked at ~/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 ~/dev dependencies resolved by user direction at the /panel-pairing handoff: option 3 — automate the clone. Applied in a3d0216 (creates:-guarded git clone, leaves an existing checkout untouched). Validated: yamllint / ansible-lint (0/0, production) / syntax-check PASS — (resolved)

Declined log

# Finding Validation summary Rationale Where re-raisable
1 CLAUDE.md documents the pair-flow repo-class model; planwright (installed by this branch) is repo-class-free (D-5/D-6) Confirmed across 3 passes: the diff causes the drift (deletes the command files, installs planwright); the spec confirms a phased migration; planwright doctrine confirms the model difference Out of this branch's scope; the doc-model rewrite is spec-tracked-deferred (tasks.md Deferred). Seed logged to opportunities.md (2026-06-15) PR review; the doc-migration follow-up PR/spec
2 roles/osx/files/claude/scripts/skill-contracts.sh still 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 Confirmed: each check is [ -f "$CMDS/$f" ]-guarded so deleted files silently skip (lefthook ran green); planwright now owns those contract guards via its D-32 self-hosting checks Non-breaking; touching this file is a lefthook/CI-config change best bundled deliberately with the deferred tooling/doc migration, not applied piecemeal here. Seed logged to opportunities.md PR review; the tooling/doc-migration follow-up
4 planwright install.sh cps shipped commands into $CLAUDE_DIR/commands/, which dotfiles symlinks to its tracked source dir → latent repo pollution if planwright ever ships a commands/ dir Confirmed by reading install.sh + the directory symlink; inert today (planwright ships skills/ only, no commands/) Cross-repo: the fix belongs in planwright (resolve the symlink before copy, or never target a consumer-managed dir), not in this repo's diff. Seed logged to opportunities.md PR review; planwright's own observations/issue tracker

Pending sign-off

  • none (no [pending-sign-off] commits on the branch)

Queued forks

Pass summary

  • Mode: standalone /self-review, then a /panel-pairing autopilot 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.
  • Tooling: yamllint PASS · ansible-lint PASS (0 failures / 0 warnings, 70 files, profile production) · ansible-playbook main.yml --syntax-check PASS · lefthook pre-commit PASS. All grounded, none degraded.
  • Wider suite: no automated test suite ships (lint + syntax-check is the project bar); all pass.
  • /panel-pairing result: 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.
  • Dispositions: 0 Auto-applicable · 0 Agent-resolvable · 0 Needs sign-off · fork docs(spec): add spec for repo-root CLAUDE.md (claude-context) #3 resolved (user-directed, 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).
  • Reverts / surfaced failures: none.
  • Skill-vs-doctrine drift (maintenance): none — the self-review skill's bucket model, routing order, checklist, and audit-table formats match the current finding-categorization / gate-wiring docs.

inkatze added 6 commits June 15, 2026 12:30
…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
inkatze marked this pull request as ready for review June 15, 2026 21:36
@inkatze
inkatze merged commit 6434383 into main Jun 15, 2026
8 of 10 checks passed
@inkatze
inkatze deleted the planwright-integration branch June 15, 2026 21:37
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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant