Skip to content

Modernise and re-home PyAuto workflow skills for PyAutoBrain - #5

Merged
Jammy2211 merged 4 commits into
mainfrom
claude/pyauto-skills-modernize-l29hxr
Jun 29, 2026
Merged

Modernise and re-home PyAuto workflow skills for PyAutoBrain#5
Jammy2211 merged 4 commits into
mainfrom
claude/pyauto-skills-modernize-l29hxr

Conversation

@Jammy2211

@Jammy2211 Jammy2211 commented Jun 29, 2026

Copy link
Copy Markdown
Contributor

Summary

Lead PR of a 6-repo change that re-homes and redesigns the PyAuto development-workflow skills for the PyAutoBrain era, per PyAutoMind/skills/OWNERSHIP.md and PyAutoMind/autoprompt/skill_redesign.md.

This repo is the home of the development-workflow skills, all command names preserved:

  • start_dev, start_dev_for_user, plan_branches, start_library, start_workspace, ship_library, ship_workspace, register_and_iterate — moved from PyAutoMind/skills/.
  • repo_cleanup — moved from admin_jammy; between-tasks git hygiene (Heart observes, Brain decides + executes; future Cleanup Agent is its natural home).
  • update_issue — moved from admin_jammy; dev-progress posting in the start→ship cycle.

Redesign

  • Thin organism entry points. start_dev routes through the Brain Feature Agent (consulting PyAutoMemory) and delegates the issue write to the Mind primitive /create_issue. ship_library / ship_workspace gate through the Health Agent → Heart readiness verdict before the dev workflow commits/pushes/opens the feature PR.
  • Feature-dev vs Build. ship_* / repo_cleanup run their own git mechanics; PyAutoBuild is the release/packaging executor and is reached only for the release step (it now has a skills/ root for release-execution skills like pre_build, but owns no dev-workflow skills).
  • No mobile/phone mode. Replaced by the general execution-environment model in skills/WORKFLOW.md. The handoff skill is retired.
  • Under 200 lines. Shared context in skills/WORKFLOW.md; long-form detail in per-skill reference.md. Guard: admin_jammy/skills/check_skill_line_counts.sh (all 27 primary files pass).

Companion PRs (branch claude/pyauto-skills-modernize-l29hxr)

Validation

  • bash admin_jammy/skills/install.sh → every moved /command resolves; handoff no longer installed; no dangling symlinks.
  • bash admin_jammy/skills/check_skill_line_counts.sh → all 27 primary files within 200 lines.

🤖 Generated with Claude Code

Move the development-workflow skills here from PyAutoMind/skills/ and redesign
them as thin organism entry points, preserving every command name and the
start/ship lifecycle:

- start_dev / start_dev_for_user route reasoning through the Brain Feature Agent
  (consulting PyAutoMemory for context); ship_library / ship_workspace gate
  through the Health Agent -> Heart readiness verdict before the dev workflow
  commits/pushes/opens the feature PR. ship_* is feature-dev work, NOT a Build
  task — Build is release/packaging only and is called solely for the release
  step.
- plan_branches, start_library, start_workspace, register_and_iterate updated to
  the same organ-boundary framing.
- "Remote / mobile mode" removed in favour of the general execution-environment
  model (local-dev / web-github / ci-only / analysis-only); no phone<->laptop
  handoff concept remains.
- Shared context factored into skills/WORKFLOW.md and per-skill reference.md so
  every primary skill file stays under 200 lines.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012v2ZYN4RCib1252BEWBb4t
Copilot AI review requested due to automatic review settings June 29, 2026 19:33

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

claude added 3 commits June 29, 2026 19:45
Instead of re-implementing gh issue create + prompt move + push, start_dev now
hands the classified repo/title/plan/branch to PyAutoMind's /create_issue
primitive and keeps only the Brain-specific concerns: triage via the Feature
Agent, conflict-aware registration (active.md vs planned.md), and routing to
/start_library or /start_workspace. The duplicated issue-body template is
replaced by a pointer to create_issue, retaining only start_dev's extra fields
(Work Classification, Worktree root).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012v2ZYN4RCib1252BEWBb4t
Move repo_cleanup here from admin_jammy. Repo hygiene is the between-tasks
counterpart to start_*/ship_*: Brain reasons about what is safe to remove and
executes its own git mechanics (branch/stash deletes), exactly as ship_* executes
commits/PRs. Heart only observes the hygiene signal (open PRs, worktree/dirty
state) — it never mutates, so a destructive sweep cannot be a Heart skill; and
cleanup is not release work, so it never touches Build. Notes the natural future
home: a dedicated PyAutoBrain Cleanup Agent alongside Feature/Build/Health.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012v2ZYN4RCib1252BEWBb4t
Posting progress to a tracked issue is part of the development cycle (the
start_* -> ship_* lifecycle; start_dev_for_user calls it at milestones), so it
belongs with the Brain dev-workflow skills. Command name (/update-issue)
preserved; organ-boundary note added.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012v2ZYN4RCib1252BEWBb4t
@Jammy2211
Jammy2211 merged commit 8b96727 into main Jun 29, 2026
Jammy2211 pushed a commit that referenced this pull request Aug 10, 2026
…t on

PyAutoMind REFERENCE.md states the contract: Intake persists Difficulty: from
the shared sizing faculty "so the value shown up front is the one the Feature
Agent later acts on". It was not acted on. _feature.py mentioned Difficulty
once, where it PRINTED its own re-derived score, and read no header key at all
— not Difficulty:, not Status:, not Priority:, not Blocked-by:/Closes-when:.

The visible failure: `feature select` recommended a prompt declaring
Status: blocked, Priority: low AND an explicit Blocked-by: gate whose body says
"do not start before the queue runner has run cleanly".

Parsing lands in the sizing faculty, beside the derivation it overrides, so
declared and derived stay in one place and the bug/refactor conductors get the
same reading for free:

- declared_header() reads Difficulty/Status/Priority/Blocked-by/Closes-when,
  skipping fenced blocks. That skip is load-bearing, not tidiness: the bug
  prompt driving this fix QUOTES the offending header in a ```-block, so
  without it the bug report would declare itself blocked. Same rule and same
  reason as PyAutoMind lifecycle.py:draft_gate_refs.
- trailing `# note` comments are stripped, splitting on " #" so a Repo#123 ref
  survives intact (the live backlog has both forms on one line).
- an unrecognised Difficulty: value is ignored rather than trusted.

The ranker then honours them: declared difficulty overrides derived (with the
disagreement REPORTED, not silently resolved — the gap is evidence about the
heuristic); Priority: orders the shortlist above the difficulty term; and a
prompt declaring Status: blocked or an unresolved Blocked-by: sinks below
everything and can never be the recommended pick. It stays listed in its own
labelled band so a human can see and override, and next_action says do not
start.

declared_blocked() is deliberately conservative: this agent is offline and
cannot tell whether a gate has since closed, so an unresolved Blocked-by: reads
as blocked and the output points at `lifecycle.py issues --drafts`, which does
resolve refs against GitHub. Being wrongly held back is cheap and visible;
being wrongly recommended is the failure this exists to stop.

Measured on the live backlog: the blocked prompt drops from rank 1 to last of
27, correctly labelled, and two further blocked prompts surface that had not
been noticed by hand. draft_staleness_detection_signals moves from too-large
#26 to medium #5 — it derived too-large purely on file length, and length is a
bad size proxy because a prompt grows as it accumulates findings.

New tests are hermetic and pin the regression by the offending prompt's HEADER
SHAPE rather than the live file, so fixing the backlog cannot silently retire
them. Verified they actually bite: reverting only _feature.py fails 7 of the
10. Fixtures use invented repo names, so the file adds no tenant-firewall
instance facts.

Prompt: PyAutoMind draft/bug/pyautobrain/feature_ranker_ignores_header_keys.md

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WSCA1h6cSKMNwFmWEsxuCL
Jammy2211 added a commit that referenced this pull request Aug 10, 2026
…t on (#217)

PyAutoMind REFERENCE.md states the contract: Intake persists Difficulty: from
the shared sizing faculty "so the value shown up front is the one the Feature
Agent later acts on". It was not acted on. _feature.py mentioned Difficulty
once, where it PRINTED its own re-derived score, and read no header key at all
— not Difficulty:, not Status:, not Priority:, not Blocked-by:/Closes-when:.

The visible failure: `feature select` recommended a prompt declaring
Status: blocked, Priority: low AND an explicit Blocked-by: gate whose body says
"do not start before the queue runner has run cleanly".

Parsing lands in the sizing faculty, beside the derivation it overrides, so
declared and derived stay in one place and the bug/refactor conductors get the
same reading for free:

- declared_header() reads Difficulty/Status/Priority/Blocked-by/Closes-when,
  skipping fenced blocks. That skip is load-bearing, not tidiness: the bug
  prompt driving this fix QUOTES the offending header in a ```-block, so
  without it the bug report would declare itself blocked. Same rule and same
  reason as PyAutoMind lifecycle.py:draft_gate_refs.
- trailing `# note` comments are stripped, splitting on " #" so a Repo#123 ref
  survives intact (the live backlog has both forms on one line).
- an unrecognised Difficulty: value is ignored rather than trusted.

The ranker then honours them: declared difficulty overrides derived (with the
disagreement REPORTED, not silently resolved — the gap is evidence about the
heuristic); Priority: orders the shortlist above the difficulty term; and a
prompt declaring Status: blocked or an unresolved Blocked-by: sinks below
everything and can never be the recommended pick. It stays listed in its own
labelled band so a human can see and override, and next_action says do not
start.

declared_blocked() is deliberately conservative: this agent is offline and
cannot tell whether a gate has since closed, so an unresolved Blocked-by: reads
as blocked and the output points at `lifecycle.py issues --drafts`, which does
resolve refs against GitHub. Being wrongly held back is cheap and visible;
being wrongly recommended is the failure this exists to stop.

Measured on the live backlog: the blocked prompt drops from rank 1 to last of
27, correctly labelled, and two further blocked prompts surface that had not
been noticed by hand. draft_staleness_detection_signals moves from too-large
#26 to medium #5 — it derived too-large purely on file length, and length is a
bad size proxy because a prompt grows as it accumulates findings.

New tests are hermetic and pin the regression by the offending prompt's HEADER
SHAPE rather than the live file, so fixing the backlog cannot silently retire
them. Verified they actually bite: reverting only _feature.py fails 7 of the
10. Fixtures use invented repo names, so the file adds no tenant-firewall
instance facts.

Prompt: PyAutoMind draft/bug/pyautobrain/feature_ranker_ignores_header_keys.md


Claude-Session: https://claude.ai/code/session_01WSCA1h6cSKMNwFmWEsxuCL

Co-authored-by: Claude <noreply@anthropic.com>
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.

3 participants