From ef7addcb53fb7c011e409d988866abd098482579 Mon Sep 17 00:00:00 2001 From: Sofia Date: Sat, 29 Aug 2026 01:32:17 +0000 Subject: [PATCH] feat(skills): add quick delivery path --- plugins/genie/skills/README.md | 4 +- plugins/genie/skills/genie/SKILL.md | 2 +- .../genie/skills/genie/reference/lifecycle.md | 2 +- plugins/genie/skills/pm/SKILL.md | 120 ---------------- plugins/genie/skills/pm/agents/openai.yaml | 4 - plugins/genie/skills/pm/references/modes.md | 65 --------- plugins/genie/skills/quick/SKILL.md | 135 ++++++++++++++++++ plugins/genie/skills/quick/agents/openai.yaml | 4 + scripts/codex-plugin-only-smoke.ts | 6 +- scripts/release-docs.test.ts | 26 +++- scripts/sync-plugin-skills.ts | 2 +- skills/README.md | 4 +- skills/genie/SKILL.md | 2 +- skills/genie/reference/lifecycle.md | 2 +- skills/pm/SKILL.md | 120 ---------------- skills/pm/agents/openai.yaml | 4 - skills/pm/references/modes.md | 65 --------- skills/quick/SKILL.md | 135 ++++++++++++++++++ skills/quick/agents/openai.yaml | 4 + src/lib/runtime-integrations.ts | 2 +- 20 files changed, 316 insertions(+), 392 deletions(-) delete mode 100644 plugins/genie/skills/pm/SKILL.md delete mode 100644 plugins/genie/skills/pm/agents/openai.yaml delete mode 100644 plugins/genie/skills/pm/references/modes.md create mode 100644 plugins/genie/skills/quick/SKILL.md create mode 100644 plugins/genie/skills/quick/agents/openai.yaml delete mode 100644 skills/pm/SKILL.md delete mode 100644 skills/pm/agents/openai.yaml delete mode 100644 skills/pm/references/modes.md create mode 100644 skills/quick/SKILL.md create mode 100644 skills/quick/agents/openai.yaml diff --git a/plugins/genie/skills/README.md b/plugins/genie/skills/README.md index c1064de8b..54278639d 100644 --- a/plugins/genie/skills/README.md +++ b/plugins/genie/skills/README.md @@ -57,8 +57,8 @@ separately installed personal skills remain user-owned and are never adopted by | Area | Skills | |------|--------| -| Lifecycle | `brainstorm`, `wish`, `review`, `work`, `fix`, `trace` | -| Orchestration | `genie`, `pm`, `dream`, `council`, `omni` | +| Lifecycle | `brainstorm`, `quick`, `wish`, `review`, `work`, `fix`, `trace` | +| Orchestration | `genie`, `dream`, `council`, `omni` | | Quality lanes | `architecture`, `code-quality`, `dx-docs`, `perf`, `qa`, `repo-hygiene`, `supply-chain` | | Supporting workflows | `docs`, `refine`, `report`, `genie-hacks` | diff --git a/plugins/genie/skills/genie/SKILL.md b/plugins/genie/skills/genie/SKILL.md index 0f5b68861..2f998ca1c 100644 --- a/plugins/genie/skills/genie/SKILL.md +++ b/plugins/genie/skills/genie/SKILL.md @@ -39,7 +39,7 @@ For requests that did not bypass, classify the user's request into exactly one c | Category | Signal | Route | |----------|--------|-------| -| **explicit** | Names a skill: "brainstorm X", "wish X", "review X", "work X", "council X", "refine X", "fix X", "trace X", "docs X", "report X", "dream", "pm", "wire omni", "hacks" | Invoke the named skill through the active runtime's skill surface and pass through the remaining request. | +| **explicit** | Names a skill: "brainstorm X", "wish X", "review X", "work X", "council X", "refine X", "fix X", "trace X", "docs X", "report X", "dream", "quick", "wire omni", "hacks" | Invoke the named skill through the active runtime's skill surface and pass through the remaining request. | | **concrete** | Clear feature/change: "add X", "implement Y", "build a..." | `wish` | | **fuzzy** | Exploratory: "I'm not sure how to...", "what if we...", "how should I handle..." | `brainstorm` | | **bug** | "X is broken", "error when...", "something's wrong with..." | `report` | diff --git a/plugins/genie/skills/genie/reference/lifecycle.md b/plugins/genie/skills/genie/reference/lifecycle.md index faf82293b..5a5e4160b 100644 --- a/plugins/genie/skills/genie/reference/lifecycle.md +++ b/plugins/genie/skills/genie/reference/lifecycle.md @@ -61,7 +61,7 @@ verdict that was not persisted does not advance the lifecycle. | `trace` | Reproduce and isolate root cause without patching | Unknown issues needing investigation | | `docs` | Audit, generate, and validate documentation against code | Docs stale or missing | | `dream` | Batch-execute SHIP-ready wishes overnight | Multiple wishes ready | -| `pm` | Backlog triage, prioritization, tracking, reporting | Managing a stream of work | +| `quick` | Ship one tiny low-risk change through verified dev read-back within 60 minutes | A fully decided change fits the hard one-hour contract | | `omni` | Wire a Genie agent to an Omni channel | Channel wiring | | `genie-hacks` | Browse community patterns and hacks | Looking for prior art | diff --git a/plugins/genie/skills/pm/SKILL.md b/plugins/genie/skills/pm/SKILL.md deleted file mode 100644 index f177b5950..000000000 --- a/plugins/genie/skills/pm/SKILL.md +++ /dev/null @@ -1,120 +0,0 @@ ---- -name: pm -description: "Full PM playbook — triage backlog, prioritize, assign, track, report, escalate. Copilot, autopilot, or pair modes." ---- - -# pm — Project Management Playbook - -**Runtime syntax:** invoke the plugin copy through the active runtime's owner-qualified skill selector; use a bare selector only when intentionally selecting a user-tier copy (a separately installed personal copy; Genie no longer seeds this tier). Cross-skill prose below uses bare names as portable semantic routes; the orchestrator resolves the selector for the active runtime. - -Manage the delivery lifecycle: triage, prioritize, dispatch, track, report, escalate. The PM orchestrates — it never writes code. When one path clearly follows from the request, recommend it and proceed; do not re-litigate decisions the user already made. - -## When to Use -- A backlog needs triage, prioritization, or tracking -- Work must be coordinated across multiple subagents -- User asks about task status, project health, or next actions - -## Modes - -Pick the mode from who makes decisions; switch when that changes. - -| Mode | Decisions | Use when | Exit | -|------|-----------|----------|------| -| **Copilot** | Human approves priorities, scope, escalations; PM proposes and executes | A human is actively participating | Human takes over, or all work shipped | -| **Autopilot** | PM decides within Authority Boundaries; a decision-maker persona subagent arbitrates ship/no-ship calls | "Run autonomously" / overnight | All shipped, or a decision exceeds authority — escalate to human | -| **Pair** | Shared with one specialist (brainstormer, council, reviewer, qa) for a focused phase | A phase needs domain judgment | Specialist delivers, PM resumes | - -Mode contracts and the decision-maker persona prompt: `references/modes.md`. - -## Lifecycle Routing - -The lifecycle is owned by its skills — route to them, never restate them here: - -| Phase | Skill | PM's job | -|-------|-------|----------| -| Triage | — | Prioritize; decide what enters the pipeline | -| Explore | `brainstorm` | Dispatch when scope is fuzzy | -| Plan | `wish` | Dispatch when scope is clear; the wish creates per-group tasks | -| Execute | `work` | Dispatch orchestration; waves come from WISH.md | -| Validate | `review` | Gate every group; FIX-FIRST → `fix` (max 2 loops) | -| Investigate | `trace`, `report` | Unknown failure: diagnose before fixing | -| Ship | PR to `dev` | Request or consume task-scoped PR/merge authority; merge only when CI green + review SHIP | - -Document status (`DRAFT` / `FIX-FIRST` / `APPROVED` / `IN_PROGRESS` / `BLOCKED` / `SHIPPED`) tracks lifecycle phase; SHIP/FIX-FIRST/BLOCKED are reviewer verdicts, and the invoking orchestrator persists the corresponding transition. The task DB tracks per-group execution state. - -## Specialist Routing - -Default chain: engineer → reviewer → qa → fix. Augment when the work calls for it: - -| Condition | Dispatch | -|-----------|----------| -| Docs deliverables in scope | docs subagent, parallel with engineer | -| Architecture restructuring | refactor-briefed engineer for that group | -| Failure with unknown root cause | `trace` before `fix` | -| Review returns FIX-FIRST | Diagnose first; simplify an overdesigned plan, otherwise `fix` (max 2 loops, then escalate) | -| High-stakes decision with tradeoffs | `council` (advisory) | - -## Dispatch - -All implementation goes to subagents via the **native delegation surface** (native runtime). Dispatch independent work in one message so it runs in parallel; every brief carries curated context, the evidence expected back, and stop conditions (`work` § Context Curation is the contract). Background subagents notify you on completion — never sleep-poll. Follow-ups to a running subagent go through **native follow-up messaging** (multi-session dispatch is retired; native delegation is the only dispatch mode — see `work` § Dispatch). - -## Board Operations - -```bash -genie task create --title "" [--wish <slug> --group <name>] # add work -genie task list [--status blocked|ready|in_progress|done] [--wish <slug>] [--json] -genie board [--wish <slug>] [--json] # kanban snapshot -genie task status <id> # detail, dependencies, stage log -genie task checkout <id> --worker <name> # atomic claim — workers run this -genie task done <id> # complete after review + validation -genie task export # full DB state as JSON (reporting) -``` - -The dependency DAG lives in WISH.md, not task rows — sequence waves from the document, never from `ready` status alone (see `work` § State Management). - -## Status Reporting (grounded) - -Every claim in a status report must trace to tool output from this session — `genie board --json`, `genie task export`, `git log`, `gh pr list`, subagent final messages. State explicitly what is verified, what failed, and what was skipped. Dispatched is not done: never present in-flight or intended work as completed until its evidence is in hand. - -``` -## Status — <date> -Shipped: <what, with PR links> -In progress: <task ids, owners> -Blocked: <reason, owner, next unblocking action> -Next: <planned actions> -``` - -## Authority Boundaries - -Apply in every mode; exceeding one escalates to the human. Selecting Autopilot -does not itself authorize external repository writes. The operator may grant a -bounded Autopilot scope that names the repository, target branch, wishes/PRs, -and whether merged-branch cleanup is allowed; only actions inside that recorded -scope may proceed without another checkpoint. - -| Action | Authority | -|--------|-----------| -| Create/claim/complete tasks | Autonomous | -| Dispatch subagents (engineer, reviewer, qa, fix, docs, trace) | Autonomous | -| Prepare commits and a proposed PR targeting `dev` | Autonomous inside the assigned repository/worktree | -| Create or publish a PR | Explicit task-scoped grant, or a bounded Autopilot grant that names the repository and target branch | -| Merge to `dev` | Separate explicit task-scoped merge grant, or a bounded Autopilot grant that names the eligible wishes/PRs | -| Delete feature branches | Explicit cleanup grant; only after the associated merge is verified | -| Merge to `main`/`master` | **Human only** | -| Client communication; budget/spending | **Human only** | -| Scope changes (add/remove features) | Human approval required | - -## Checkpoints - -Pause for a human decision when an external write lacks the task-scoped grant -above, an action is destructive or irreversible, scope genuinely changes, -credentials are involved, or an ambiguity changes what is safe to do. -Read-only triage, planning, local validation, and reversible worktree changes -remain autonomous inside the assigned scope. - -## Rules -- Never write code — dispatch engineers. -- Never skip the review gate; never ship CRITICAL/HIGH gaps. -- Surface blockers immediately, each with a proposed unblocking action. -- Track only real, concrete work — no speculative tasks. -- Final messages lead with outcome, then evidence, then next action. diff --git a/plugins/genie/skills/pm/agents/openai.yaml b/plugins/genie/skills/pm/agents/openai.yaml deleted file mode 100644 index 02115731d..000000000 --- a/plugins/genie/skills/pm/agents/openai.yaml +++ /dev/null @@ -1,4 +0,0 @@ -interface: - display_name: "Project Management" - short_description: "Coordinate backlog, delivery gates, and escalation" - default_prompt: "Coordinate this work through the appropriate delivery and release gates." diff --git a/plugins/genie/skills/pm/references/modes.md b/plugins/genie/skills/pm/references/modes.md deleted file mode 100644 index e13805c90..000000000 --- a/plugins/genie/skills/pm/references/modes.md +++ /dev/null @@ -1,65 +0,0 @@ -# PM Modes — Detail - -Decision rules live in `../SKILL.md` § Modes. This file carries the per-mode contracts and the autopilot decision-maker persona. - -## Copilot (PM + human) - -| PM does | Human does | -|---------|------------| -| Triage and prioritize backlog | Approve priorities | -| Propose assignments and dispatch | Confirm assignments | -| Monitor progress, surface blockers | Make scope decisions | -| Prepare status reports | Review and distribute | -| Recommend escalations | Authorize escalations | - -Entry: human invokes `pm` or asks for help managing work. Exit: human takes over, or all tasks shipped. - -## Autopilot (PM + decision-maker persona) - -Spawn one fresh-context decision-maker subagent at run start. Route ship/no-ship and prioritization judgment calls back to that same thread with native follow-up messaging; it emulates the human only within the documented Authority Boundaries. Anything past a boundary still goes to the real human. - -Entry: human says "run autonomously" / "autopilot". That phrase grants decision -autonomy only; external repository writes still require the bounded scope from -`../SKILL.md` (repository, target branch, eligible wishes/PRs, and cleanup -policy). Exit: all authorized tasks shipped, or a decision/action exceeds that -scope. - -### Default persona: pragmatic engineering manager - -``` -You are a pragmatic engineering manager making ship/no-ship decisions. - -Decision style: -- Approve when acceptance criteria are met — don't block for style preferences -- Push back on scope creep — if it's not in the wish, it waits -- Prioritize shipping over perfection — good enough today beats perfect next week -- Escalate security and data-integrity issues immediately — never approve shortcuts here -- Trust the evidence behind the verdict — if `review` says SHIP, approve unless you see something it missed - -When deciding: -1. Read the wish acceptance criteria -2. Check that each criterion has evidence of completion -3. Yes, and no CRITICAL/HIGH gaps → approve -4. Gaps exist → request specific fixes, not vague improvements -5. Scope creep detected → reject additions, keep the wish focused - -You represent the human. The PM asks, you decide. Be decisive — slow decisions block teams. -``` - -### Customizing - -Provide your own persona prompt in the subagent brief instead. A persona defines: -- **Decision style** — what to approve, what to reject -- **Priority framework** — how to weigh competing concerns -- **Escalation triggers** — when to defer to a human instead of deciding - -## Pair (PM + specialist) - -| Pair with | When | -|-----------|------| -| Brainstormer | Ideas need exploring before scoping | -| Council | Major design decisions need multi-perspective input | -| Reviewer | A quality gate needs PM context | -| QA | Test strategy needs PM input | - -Entry: PM detects a phase that benefits from specialist judgment. Exit: specialist delivers, PM resumes the normal flow. diff --git a/plugins/genie/skills/quick/SKILL.md b/plugins/genie/skills/quick/SKILL.md new file mode 100644 index 000000000..59363723a --- /dev/null +++ b/plugins/genie/skills/quick/SKILL.md @@ -0,0 +1,135 @@ +--- +name: quick +description: "Ship tiny low-risk changes to dev within one hour." +--- + +# quick — One-hour delivery + +**Runtime syntax:** invoke the plugin copy through the active runtime's owner-qualified skill selector; use a bare selector only when intentionally selecting a user-tier copy (a separately installed personal copy; Genie no longer seeds this tier). Cross-skill prose below uses bare names as portable semantic routes; the orchestrator resolves the selector for the active runtime. + +Deliver one tiny, already-decided change through implementation, CI, merge, deployment and read-back in `dev`. The contract is **request → deployed-dev read-back within 60 minutes**; code or a PR without live read-back is not success. + +## When to Use + +Use only when all are true: + +- one existing behavior, repository, card and payout; +- low-impact, reversible change with an objective focused check; +- target is `dev`, never homolog or production; +- CI, deployment and read-back conservatively fit inside 60 minutes; +- existing merge authority already covers the repository and eligible `dev` merge; +- no unresolved product or architecture decision. + +Do not use for migrations; auth, permissions, secrets or tenant boundaries; billing or money; destructive/data-loss behavior; public API/protocol compatibility; irreversible/shared infrastructure; production mutation; multiple repos or independent payouts; or incidents with an unknown cause. + +## Admission — minute 0–5 + +1. Record the start and hard deadline with `terminal`; the deadline never moves. +2. Inspect the live card, repository, branch, CI, dev target and deployment path. +3. Verify an existing task-scoped merge grant or bounded Autopilot grant authorizes this repository and eligible `dev` merge. Do not request or manufacture authority inside Quick. +4. Write a one-screen execution contract in the response or worker brief: + - **core:** independently satisfies the request; + - **flex:** explicitly cuttable; + - **oracle:** focused check and visible dev read-back; + - **target:** exact repository, base branch and dev environment; + - **stop triggers:** any condition that rejects or ends Quick. +5. Refuse before implementation if any eligibility fact is missing. Return the inspected evidence and route the demand to the normal lifecycle; do not start that lifecycle silently. + +Admission is complete only when every eligibility fact and the existing merge authority are proven. + +## Execute — minute 5–35 + +1. Start exactly one executor through the active runtime's native delegation surface, inheriting the active runtime model and configuration. +2. Use one isolated worktree from the current target base. No fan-out, board/group ceremony, independent reviewer or model-selection machinery. +3. Implement only the core and a focused regression test where practical. Follow repository-local TDD and validation rules. +4. Cut flex immediately when evidence threatens the deadline. + +**No new surface enters after minute 35.** At minute 35 the branch must contain a complete candidate core or Quick stops as `quick-missed`. + +## Integrate — minute 35–50 + +1. Run the focused test and every affected repository check. +2. Perform one self-review of the exact diff for correctness, scope, secrets and target identity. +3. Apply at most one bounded correction while time remains. +4. Open the PR to `dev` and wait for every required CI check. Never bypass or weaken checks. + +**No new code change starts after minute 50.** If required CI is not green or the candidate is not merge-ready, stop as `quick-missed`. + +## Deliver — minute 50–60 + +1. Re-read the exact PR head, required CI and existing merge authority. +2. Merge to `dev` only inside that authority. +3. Verify the designated dev deployment serves the expected revision. +4. Exercise the changed behavior in dev and read back its observable result. +5. Report success only when deployment and behavior read-back both pass before the deadline. + +Quick never merges to homolog or production. A separate human-controlled promotion may consume the already-proven dev result later. + +## Timeout and Failure + +At or before minute 60, when any success condition is absent: + +- stop automatically; +- preserve the branch, commits, PR and evidence; +- emit `quick-missed` with elapsed time, exact completed state and blocker; +- return the demand to normal sizing/workflow; +- do not continue, retry, discard work or claim partial delivery. + +A failed focused check, failed CI, wrong target, missing authority, deployment mismatch or failed read-back is a miss—not permission to lower the gate. + +## Output + +### Success + +```text +quick-shipped +Core: <observable behavior> +PR: <url and exact head> +CI: <required checks> +Dev: <target revision and read-back> +Elapsed: <request to verified dev> +Flex cut: <items or none> +``` + +### Refusal + +```text +quick-refused +Reason: <eligibility or authority failure> +Evidence: <live fact> +Route: <normal lifecycle entry point> +Effects: none +``` + +### Miss + +```text +quick-missed +Elapsed: <time> +Preserved: <branch/PR/commit> +Completed: <verified state> +Blocker: <exact unmet gate> +Next route: normal sizing/workflow +``` + +## Pitfalls + +- Counting PR creation or merge as delivery without dev deployment/read-back. +- Starting while CI or deployment is already too slow to fit the remaining hour. +- Treating file count as eligibility; consequence, reversibility and oracle quality decide. +- Asking for merge permission after implementation; missing authority is an admission refusal. +- Continuing after 60 minutes because the task feels almost complete. +- Opening parallel workers to recover time; concurrency changes the risk class and exits Quick. + +## Verification + +Before `quick-shipped`, verify all of the following: + +- one executor and one repository/worktree; +- focused tests and affected checks passed; +- required PR CI passed on the exact merged head; +- existing merge authority covered the exact merge; +- dev serves the intended revision; +- changed behavior was exercised and read back; +- total elapsed time is at most 60 minutes; +- no homolog or production mutation occurred. diff --git a/plugins/genie/skills/quick/agents/openai.yaml b/plugins/genie/skills/quick/agents/openai.yaml new file mode 100644 index 000000000..dad461ba1 --- /dev/null +++ b/plugins/genie/skills/quick/agents/openai.yaml @@ -0,0 +1,4 @@ +interface: + display_name: "Quick Delivery" + short_description: "Ship a tiny low-risk dev change within one hour" + default_prompt: "Deliver this eligible tiny change through verified dev read-back within one hour." diff --git a/scripts/codex-plugin-only-smoke.ts b/scripts/codex-plugin-only-smoke.ts index 6e95e7635..ec29f817a 100644 --- a/scripts/codex-plugin-only-smoke.ts +++ b/scripts/codex-plugin-only-smoke.ts @@ -125,7 +125,11 @@ function assertFallbacksRetired(iso: IsolatedHome, seeded: readonly string[]): v function payloadShippedSkills(iso: IsolatedHome): Set<string> { const skillsRoot = join(activePluginRoot(iso, TARGET_VERSION), 'skills'); if (!existsSync(skillsRoot)) fail(`payload skills root absent: ${skillsRoot}`); - return new Set(readdirSync(skillsRoot)); + return new Set( + readdirSync(skillsRoot, { withFileTypes: true }) + .filter((entry) => entry.isDirectory() && existsSync(join(skillsRoot, entry.name, 'SKILL.md'))) + .map((entry) => entry.name), + ); } /** Split seeded fallbacks into retirable (payload ships the skill) vs preserved (skill dropped). */ diff --git a/scripts/release-docs.test.ts b/scripts/release-docs.test.ts index 770e086f1..7d9e1356c 100644 --- a/scripts/release-docs.test.ts +++ b/scripts/release-docs.test.ts @@ -943,6 +943,28 @@ describe('Group E release and documentation contracts', () => { expect(root).not.toContain('digest-managed product-skill fallbacks'); }); + test('ships quick as the bounded fast path and no longer distributes pm', () => { + const quick = read('skills/quick/SKILL.md'); + const router = read('skills/genie/SKILL.md'); + const lifecycle = read('skills/genie/reference/lifecycle.md'); + const overview = read('skills/README.md'); + const skillNames = readdirSync(join(ROOT, 'skills'), { withFileTypes: true }) + .filter((entry) => entry.isDirectory() && existsSync(join(ROOT, 'skills', entry.name, 'SKILL.md'))) + .map((entry) => entry.name); + + expect(quick).toContain('request → deployed-dev read-back within 60 minutes'); + expect(quick).toContain('existing merge authority'); + expect(quick).toContain('quick-missed'); + expect(skillNames).toContain('quick'); + expect(skillNames).not.toContain('pm'); + expect(router).toContain('"quick"'); + expect(router).not.toContain('"pm"'); + expect(lifecycle).toContain('| `quick` |'); + expect(lifecycle).not.toContain('| `pm` |'); + expect(overview).toContain('`quick`'); + expect(overview).not.toContain('`pm`'); + }); + test('lifecycle skills share persisted WISH state and keep reviewers read-only', () => { const lifecycle = read('skills/genie/reference/lifecycle.md'); for (const status of ['`DRAFT`', '`FIX-FIRST`', '`APPROVED`', '`IN_PROGRESS`', '`BLOCKED`', '`SHIPPED`']) { @@ -952,7 +974,7 @@ describe('Group E release and documentation contracts', () => { const review = read('skills/review/SKILL.md'); const dream = read('skills/dream/SKILL.md'); const wish = read('skills/wish/templates/wish-template.md'); - const pm = read('skills/pm/SKILL.md'); + expect(dream).toContain('Status field is exactly `APPROVED`'); expect(brainstorm).toContain('Do not move it to Poured before a WISH.md exists'); expect(brainstorm).toContain('single brainstorm/planning index is `.genie/INDEX.md`'); @@ -963,8 +985,6 @@ describe('Group E release and documentation contracts', () => { expect(wish).toContain('**depends-on:** none'); expect(dream).toContain('wish-level `**depends-on:**`'); expect(dream).not.toContain('depends_on'); - expect(pm).toContain('Explicit task-scoped grant'); - expect(pm).toMatch(/Selecting Autopilot\s+does not itself authorize external repository writes/); }); test('lifecycle treats simplicity as a hard gate and replans overdesigned work', () => { diff --git a/scripts/sync-plugin-skills.ts b/scripts/sync-plugin-skills.ts index 8dd876270..d6fe6297c 100644 --- a/scripts/sync-plugin-skills.ts +++ b/scripts/sync-plugin-skills.ts @@ -46,8 +46,8 @@ export const SHIPPED_SKILL_NAMES = [ 'genie-hacks', 'omni', 'perf', - 'pm', 'qa', + 'quick', 'refine', 'repo-hygiene', 'report', diff --git a/skills/README.md b/skills/README.md index c1064de8b..54278639d 100644 --- a/skills/README.md +++ b/skills/README.md @@ -57,8 +57,8 @@ separately installed personal skills remain user-owned and are never adopted by | Area | Skills | |------|--------| -| Lifecycle | `brainstorm`, `wish`, `review`, `work`, `fix`, `trace` | -| Orchestration | `genie`, `pm`, `dream`, `council`, `omni` | +| Lifecycle | `brainstorm`, `quick`, `wish`, `review`, `work`, `fix`, `trace` | +| Orchestration | `genie`, `dream`, `council`, `omni` | | Quality lanes | `architecture`, `code-quality`, `dx-docs`, `perf`, `qa`, `repo-hygiene`, `supply-chain` | | Supporting workflows | `docs`, `refine`, `report`, `genie-hacks` | diff --git a/skills/genie/SKILL.md b/skills/genie/SKILL.md index 0f5b68861..2f998ca1c 100644 --- a/skills/genie/SKILL.md +++ b/skills/genie/SKILL.md @@ -39,7 +39,7 @@ For requests that did not bypass, classify the user's request into exactly one c | Category | Signal | Route | |----------|--------|-------| -| **explicit** | Names a skill: "brainstorm X", "wish X", "review X", "work X", "council X", "refine X", "fix X", "trace X", "docs X", "report X", "dream", "pm", "wire omni", "hacks" | Invoke the named skill through the active runtime's skill surface and pass through the remaining request. | +| **explicit** | Names a skill: "brainstorm X", "wish X", "review X", "work X", "council X", "refine X", "fix X", "trace X", "docs X", "report X", "dream", "quick", "wire omni", "hacks" | Invoke the named skill through the active runtime's skill surface and pass through the remaining request. | | **concrete** | Clear feature/change: "add X", "implement Y", "build a..." | `wish` | | **fuzzy** | Exploratory: "I'm not sure how to...", "what if we...", "how should I handle..." | `brainstorm` | | **bug** | "X is broken", "error when...", "something's wrong with..." | `report` | diff --git a/skills/genie/reference/lifecycle.md b/skills/genie/reference/lifecycle.md index faf82293b..5a5e4160b 100644 --- a/skills/genie/reference/lifecycle.md +++ b/skills/genie/reference/lifecycle.md @@ -61,7 +61,7 @@ verdict that was not persisted does not advance the lifecycle. | `trace` | Reproduce and isolate root cause without patching | Unknown issues needing investigation | | `docs` | Audit, generate, and validate documentation against code | Docs stale or missing | | `dream` | Batch-execute SHIP-ready wishes overnight | Multiple wishes ready | -| `pm` | Backlog triage, prioritization, tracking, reporting | Managing a stream of work | +| `quick` | Ship one tiny low-risk change through verified dev read-back within 60 minutes | A fully decided change fits the hard one-hour contract | | `omni` | Wire a Genie agent to an Omni channel | Channel wiring | | `genie-hacks` | Browse community patterns and hacks | Looking for prior art | diff --git a/skills/pm/SKILL.md b/skills/pm/SKILL.md deleted file mode 100644 index f177b5950..000000000 --- a/skills/pm/SKILL.md +++ /dev/null @@ -1,120 +0,0 @@ ---- -name: pm -description: "Full PM playbook — triage backlog, prioritize, assign, track, report, escalate. Copilot, autopilot, or pair modes." ---- - -# pm — Project Management Playbook - -**Runtime syntax:** invoke the plugin copy through the active runtime's owner-qualified skill selector; use a bare selector only when intentionally selecting a user-tier copy (a separately installed personal copy; Genie no longer seeds this tier). Cross-skill prose below uses bare names as portable semantic routes; the orchestrator resolves the selector for the active runtime. - -Manage the delivery lifecycle: triage, prioritize, dispatch, track, report, escalate. The PM orchestrates — it never writes code. When one path clearly follows from the request, recommend it and proceed; do not re-litigate decisions the user already made. - -## When to Use -- A backlog needs triage, prioritization, or tracking -- Work must be coordinated across multiple subagents -- User asks about task status, project health, or next actions - -## Modes - -Pick the mode from who makes decisions; switch when that changes. - -| Mode | Decisions | Use when | Exit | -|------|-----------|----------|------| -| **Copilot** | Human approves priorities, scope, escalations; PM proposes and executes | A human is actively participating | Human takes over, or all work shipped | -| **Autopilot** | PM decides within Authority Boundaries; a decision-maker persona subagent arbitrates ship/no-ship calls | "Run autonomously" / overnight | All shipped, or a decision exceeds authority — escalate to human | -| **Pair** | Shared with one specialist (brainstormer, council, reviewer, qa) for a focused phase | A phase needs domain judgment | Specialist delivers, PM resumes | - -Mode contracts and the decision-maker persona prompt: `references/modes.md`. - -## Lifecycle Routing - -The lifecycle is owned by its skills — route to them, never restate them here: - -| Phase | Skill | PM's job | -|-------|-------|----------| -| Triage | — | Prioritize; decide what enters the pipeline | -| Explore | `brainstorm` | Dispatch when scope is fuzzy | -| Plan | `wish` | Dispatch when scope is clear; the wish creates per-group tasks | -| Execute | `work` | Dispatch orchestration; waves come from WISH.md | -| Validate | `review` | Gate every group; FIX-FIRST → `fix` (max 2 loops) | -| Investigate | `trace`, `report` | Unknown failure: diagnose before fixing | -| Ship | PR to `dev` | Request or consume task-scoped PR/merge authority; merge only when CI green + review SHIP | - -Document status (`DRAFT` / `FIX-FIRST` / `APPROVED` / `IN_PROGRESS` / `BLOCKED` / `SHIPPED`) tracks lifecycle phase; SHIP/FIX-FIRST/BLOCKED are reviewer verdicts, and the invoking orchestrator persists the corresponding transition. The task DB tracks per-group execution state. - -## Specialist Routing - -Default chain: engineer → reviewer → qa → fix. Augment when the work calls for it: - -| Condition | Dispatch | -|-----------|----------| -| Docs deliverables in scope | docs subagent, parallel with engineer | -| Architecture restructuring | refactor-briefed engineer for that group | -| Failure with unknown root cause | `trace` before `fix` | -| Review returns FIX-FIRST | Diagnose first; simplify an overdesigned plan, otherwise `fix` (max 2 loops, then escalate) | -| High-stakes decision with tradeoffs | `council` (advisory) | - -## Dispatch - -All implementation goes to subagents via the **native delegation surface** (native runtime). Dispatch independent work in one message so it runs in parallel; every brief carries curated context, the evidence expected back, and stop conditions (`work` § Context Curation is the contract). Background subagents notify you on completion — never sleep-poll. Follow-ups to a running subagent go through **native follow-up messaging** (multi-session dispatch is retired; native delegation is the only dispatch mode — see `work` § Dispatch). - -## Board Operations - -```bash -genie task create --title "<title>" [--wish <slug> --group <name>] # add work -genie task list [--status blocked|ready|in_progress|done] [--wish <slug>] [--json] -genie board [--wish <slug>] [--json] # kanban snapshot -genie task status <id> # detail, dependencies, stage log -genie task checkout <id> --worker <name> # atomic claim — workers run this -genie task done <id> # complete after review + validation -genie task export # full DB state as JSON (reporting) -``` - -The dependency DAG lives in WISH.md, not task rows — sequence waves from the document, never from `ready` status alone (see `work` § State Management). - -## Status Reporting (grounded) - -Every claim in a status report must trace to tool output from this session — `genie board --json`, `genie task export`, `git log`, `gh pr list`, subagent final messages. State explicitly what is verified, what failed, and what was skipped. Dispatched is not done: never present in-flight or intended work as completed until its evidence is in hand. - -``` -## Status — <date> -Shipped: <what, with PR links> -In progress: <task ids, owners> -Blocked: <reason, owner, next unblocking action> -Next: <planned actions> -``` - -## Authority Boundaries - -Apply in every mode; exceeding one escalates to the human. Selecting Autopilot -does not itself authorize external repository writes. The operator may grant a -bounded Autopilot scope that names the repository, target branch, wishes/PRs, -and whether merged-branch cleanup is allowed; only actions inside that recorded -scope may proceed without another checkpoint. - -| Action | Authority | -|--------|-----------| -| Create/claim/complete tasks | Autonomous | -| Dispatch subagents (engineer, reviewer, qa, fix, docs, trace) | Autonomous | -| Prepare commits and a proposed PR targeting `dev` | Autonomous inside the assigned repository/worktree | -| Create or publish a PR | Explicit task-scoped grant, or a bounded Autopilot grant that names the repository and target branch | -| Merge to `dev` | Separate explicit task-scoped merge grant, or a bounded Autopilot grant that names the eligible wishes/PRs | -| Delete feature branches | Explicit cleanup grant; only after the associated merge is verified | -| Merge to `main`/`master` | **Human only** | -| Client communication; budget/spending | **Human only** | -| Scope changes (add/remove features) | Human approval required | - -## Checkpoints - -Pause for a human decision when an external write lacks the task-scoped grant -above, an action is destructive or irreversible, scope genuinely changes, -credentials are involved, or an ambiguity changes what is safe to do. -Read-only triage, planning, local validation, and reversible worktree changes -remain autonomous inside the assigned scope. - -## Rules -- Never write code — dispatch engineers. -- Never skip the review gate; never ship CRITICAL/HIGH gaps. -- Surface blockers immediately, each with a proposed unblocking action. -- Track only real, concrete work — no speculative tasks. -- Final messages lead with outcome, then evidence, then next action. diff --git a/skills/pm/agents/openai.yaml b/skills/pm/agents/openai.yaml deleted file mode 100644 index 02115731d..000000000 --- a/skills/pm/agents/openai.yaml +++ /dev/null @@ -1,4 +0,0 @@ -interface: - display_name: "Project Management" - short_description: "Coordinate backlog, delivery gates, and escalation" - default_prompt: "Coordinate this work through the appropriate delivery and release gates." diff --git a/skills/pm/references/modes.md b/skills/pm/references/modes.md deleted file mode 100644 index e13805c90..000000000 --- a/skills/pm/references/modes.md +++ /dev/null @@ -1,65 +0,0 @@ -# PM Modes — Detail - -Decision rules live in `../SKILL.md` § Modes. This file carries the per-mode contracts and the autopilot decision-maker persona. - -## Copilot (PM + human) - -| PM does | Human does | -|---------|------------| -| Triage and prioritize backlog | Approve priorities | -| Propose assignments and dispatch | Confirm assignments | -| Monitor progress, surface blockers | Make scope decisions | -| Prepare status reports | Review and distribute | -| Recommend escalations | Authorize escalations | - -Entry: human invokes `pm` or asks for help managing work. Exit: human takes over, or all tasks shipped. - -## Autopilot (PM + decision-maker persona) - -Spawn one fresh-context decision-maker subagent at run start. Route ship/no-ship and prioritization judgment calls back to that same thread with native follow-up messaging; it emulates the human only within the documented Authority Boundaries. Anything past a boundary still goes to the real human. - -Entry: human says "run autonomously" / "autopilot". That phrase grants decision -autonomy only; external repository writes still require the bounded scope from -`../SKILL.md` (repository, target branch, eligible wishes/PRs, and cleanup -policy). Exit: all authorized tasks shipped, or a decision/action exceeds that -scope. - -### Default persona: pragmatic engineering manager - -``` -You are a pragmatic engineering manager making ship/no-ship decisions. - -Decision style: -- Approve when acceptance criteria are met — don't block for style preferences -- Push back on scope creep — if it's not in the wish, it waits -- Prioritize shipping over perfection — good enough today beats perfect next week -- Escalate security and data-integrity issues immediately — never approve shortcuts here -- Trust the evidence behind the verdict — if `review` says SHIP, approve unless you see something it missed - -When deciding: -1. Read the wish acceptance criteria -2. Check that each criterion has evidence of completion -3. Yes, and no CRITICAL/HIGH gaps → approve -4. Gaps exist → request specific fixes, not vague improvements -5. Scope creep detected → reject additions, keep the wish focused - -You represent the human. The PM asks, you decide. Be decisive — slow decisions block teams. -``` - -### Customizing - -Provide your own persona prompt in the subagent brief instead. A persona defines: -- **Decision style** — what to approve, what to reject -- **Priority framework** — how to weigh competing concerns -- **Escalation triggers** — when to defer to a human instead of deciding - -## Pair (PM + specialist) - -| Pair with | When | -|-----------|------| -| Brainstormer | Ideas need exploring before scoping | -| Council | Major design decisions need multi-perspective input | -| Reviewer | A quality gate needs PM context | -| QA | Test strategy needs PM input | - -Entry: PM detects a phase that benefits from specialist judgment. Exit: specialist delivers, PM resumes the normal flow. diff --git a/skills/quick/SKILL.md b/skills/quick/SKILL.md new file mode 100644 index 000000000..59363723a --- /dev/null +++ b/skills/quick/SKILL.md @@ -0,0 +1,135 @@ +--- +name: quick +description: "Ship tiny low-risk changes to dev within one hour." +--- + +# quick — One-hour delivery + +**Runtime syntax:** invoke the plugin copy through the active runtime's owner-qualified skill selector; use a bare selector only when intentionally selecting a user-tier copy (a separately installed personal copy; Genie no longer seeds this tier). Cross-skill prose below uses bare names as portable semantic routes; the orchestrator resolves the selector for the active runtime. + +Deliver one tiny, already-decided change through implementation, CI, merge, deployment and read-back in `dev`. The contract is **request → deployed-dev read-back within 60 minutes**; code or a PR without live read-back is not success. + +## When to Use + +Use only when all are true: + +- one existing behavior, repository, card and payout; +- low-impact, reversible change with an objective focused check; +- target is `dev`, never homolog or production; +- CI, deployment and read-back conservatively fit inside 60 minutes; +- existing merge authority already covers the repository and eligible `dev` merge; +- no unresolved product or architecture decision. + +Do not use for migrations; auth, permissions, secrets or tenant boundaries; billing or money; destructive/data-loss behavior; public API/protocol compatibility; irreversible/shared infrastructure; production mutation; multiple repos or independent payouts; or incidents with an unknown cause. + +## Admission — minute 0–5 + +1. Record the start and hard deadline with `terminal`; the deadline never moves. +2. Inspect the live card, repository, branch, CI, dev target and deployment path. +3. Verify an existing task-scoped merge grant or bounded Autopilot grant authorizes this repository and eligible `dev` merge. Do not request or manufacture authority inside Quick. +4. Write a one-screen execution contract in the response or worker brief: + - **core:** independently satisfies the request; + - **flex:** explicitly cuttable; + - **oracle:** focused check and visible dev read-back; + - **target:** exact repository, base branch and dev environment; + - **stop triggers:** any condition that rejects or ends Quick. +5. Refuse before implementation if any eligibility fact is missing. Return the inspected evidence and route the demand to the normal lifecycle; do not start that lifecycle silently. + +Admission is complete only when every eligibility fact and the existing merge authority are proven. + +## Execute — minute 5–35 + +1. Start exactly one executor through the active runtime's native delegation surface, inheriting the active runtime model and configuration. +2. Use one isolated worktree from the current target base. No fan-out, board/group ceremony, independent reviewer or model-selection machinery. +3. Implement only the core and a focused regression test where practical. Follow repository-local TDD and validation rules. +4. Cut flex immediately when evidence threatens the deadline. + +**No new surface enters after minute 35.** At minute 35 the branch must contain a complete candidate core or Quick stops as `quick-missed`. + +## Integrate — minute 35–50 + +1. Run the focused test and every affected repository check. +2. Perform one self-review of the exact diff for correctness, scope, secrets and target identity. +3. Apply at most one bounded correction while time remains. +4. Open the PR to `dev` and wait for every required CI check. Never bypass or weaken checks. + +**No new code change starts after minute 50.** If required CI is not green or the candidate is not merge-ready, stop as `quick-missed`. + +## Deliver — minute 50–60 + +1. Re-read the exact PR head, required CI and existing merge authority. +2. Merge to `dev` only inside that authority. +3. Verify the designated dev deployment serves the expected revision. +4. Exercise the changed behavior in dev and read back its observable result. +5. Report success only when deployment and behavior read-back both pass before the deadline. + +Quick never merges to homolog or production. A separate human-controlled promotion may consume the already-proven dev result later. + +## Timeout and Failure + +At or before minute 60, when any success condition is absent: + +- stop automatically; +- preserve the branch, commits, PR and evidence; +- emit `quick-missed` with elapsed time, exact completed state and blocker; +- return the demand to normal sizing/workflow; +- do not continue, retry, discard work or claim partial delivery. + +A failed focused check, failed CI, wrong target, missing authority, deployment mismatch or failed read-back is a miss—not permission to lower the gate. + +## Output + +### Success + +```text +quick-shipped +Core: <observable behavior> +PR: <url and exact head> +CI: <required checks> +Dev: <target revision and read-back> +Elapsed: <request to verified dev> +Flex cut: <items or none> +``` + +### Refusal + +```text +quick-refused +Reason: <eligibility or authority failure> +Evidence: <live fact> +Route: <normal lifecycle entry point> +Effects: none +``` + +### Miss + +```text +quick-missed +Elapsed: <time> +Preserved: <branch/PR/commit> +Completed: <verified state> +Blocker: <exact unmet gate> +Next route: normal sizing/workflow +``` + +## Pitfalls + +- Counting PR creation or merge as delivery without dev deployment/read-back. +- Starting while CI or deployment is already too slow to fit the remaining hour. +- Treating file count as eligibility; consequence, reversibility and oracle quality decide. +- Asking for merge permission after implementation; missing authority is an admission refusal. +- Continuing after 60 minutes because the task feels almost complete. +- Opening parallel workers to recover time; concurrency changes the risk class and exits Quick. + +## Verification + +Before `quick-shipped`, verify all of the following: + +- one executor and one repository/worktree; +- focused tests and affected checks passed; +- required PR CI passed on the exact merged head; +- existing merge authority covered the exact merge; +- dev serves the intended revision; +- changed behavior was exercised and read back; +- total elapsed time is at most 60 minutes; +- no homolog or production mutation occurred. diff --git a/skills/quick/agents/openai.yaml b/skills/quick/agents/openai.yaml new file mode 100644 index 000000000..dad461ba1 --- /dev/null +++ b/skills/quick/agents/openai.yaml @@ -0,0 +1,4 @@ +interface: + display_name: "Quick Delivery" + short_description: "Ship a tiny low-risk dev change within one hour" + default_prompt: "Deliver this eligible tiny change through verified dev read-back within one hour." diff --git a/src/lib/runtime-integrations.ts b/src/lib/runtime-integrations.ts index d82396197..19a6790c8 100644 --- a/src/lib/runtime-integrations.ts +++ b/src/lib/runtime-integrations.ts @@ -67,8 +67,8 @@ export const CANONICAL_GENIE_SKILL_NAMES = [ 'genie-hacks', 'omni', 'perf', - 'pm', 'qa', + 'quick', 'refine', 'repo-hygiene', 'report',