feat(pipeline): a quick-fix pipeline — brief to tested PR without an OpenSpec change (#55) #56

Merged
cmoriarty merged 1 commit from quick-fix-pipeline into main 2026-09-26 17:09:50 -04:00
Owner

Refs #55 (closed after the OpenSpec change is archived). OpenSpec change: openspec/changes/quick-fix-pipeline.

Why

Every built-in pipeline that writes code started with openspec.new-change → propose, so a one-line fix paid for a proposal, specs, a design and tasks. The steps after propose also assumed a change existed, so removing the propose nodes was not enough.

What changed

  • quick-fix built-in pipeline: git.clone → script.brief → script.agents-md → fix.implement → openspec.test.unit → openspec.test.e2e (when ui_changed) → git.commit.feature → fix.summarize → git.commit.summary → git.pr.open → human.merge-pr → git.pr.merge. No OpenSpec change, no archive.
  • fix.implement (new fix-implement prompt): the smallest change that does what the brief asks, tests that fail without it, and .osf/fix.md. Completion: paths-exist:.osf/fix.md + new worktree-changed predicate (something outside .osf/ changed).
  • Test-suite and summary prompts without a change: they use the brief, the fix note and the diff. New change_id_or_none only trusts an explicit change id, so a quick fix never borrows an unrelated in-flight change from openspec/changes/. The summary ends with a **No spec updated:** bullet naming any specified capability the diff may touch.
  • Chosen in the New Run picker, or with the existing osf:quick-fix issue label (no new code needed).
  • UI: phase grouping and step names for fix.implement / fix.summarize; docs/guide.md lists the pipeline; .osf/pipeline.yaml regenerated (the default's predicate table gained one comment line).

Verification

  • Backend: 1741 passed.
  • UI: tsc -b, 382 vitest tests, vite build clean.
  • Playwright against the fake osfd: 66/69. follow-the-tail (2) needs a live osfd, as on main; one agent-view streaming test flaked under full parallel load and passed 5/5 alone. New: the picker offers quick-fix, and a quick-fix run's spine groups its steps under apply and ship.

🤖 Generated with Claude Code

Refs #55 (closed after the OpenSpec change is archived). OpenSpec change: `openspec/changes/quick-fix-pipeline`. ## Why Every built-in pipeline that writes code started with `openspec.new-change` → propose, so a one-line fix paid for a proposal, specs, a design and tasks. The steps after propose also assumed a change existed, so removing the propose nodes was not enough. ## What changed - **`quick-fix` built-in pipeline:** `git.clone → script.brief → script.agents-md → fix.implement → openspec.test.unit → openspec.test.e2e (when ui_changed) → git.commit.feature → fix.summarize → git.commit.summary → git.pr.open → human.merge-pr → git.pr.merge`. No OpenSpec change, no archive. - **`fix.implement`** (new `fix-implement` prompt): the smallest change that does what the brief asks, tests that fail without it, and `.osf/fix.md`. Completion: `paths-exist:.osf/fix.md` + new **`worktree-changed`** predicate (something outside `.osf/` changed). - **Test-suite and summary prompts without a change:** they use the brief, the fix note and the diff. New `change_id_or_none` only trusts an explicit change id, so a quick fix never borrows an unrelated in-flight change from `openspec/changes/`. The summary ends with a `**No spec updated:**` bullet naming any specified capability the diff may touch. - **Chosen** in the New Run picker, or with the existing `osf:quick-fix` issue label (no new code needed). - UI: phase grouping and step names for `fix.implement` / `fix.summarize`; `docs/guide.md` lists the pipeline; `.osf/pipeline.yaml` regenerated (the default's predicate table gained one comment line). ## Verification - Backend: 1741 passed. - UI: `tsc -b`, 382 vitest tests, `vite build` clean. - Playwright against the fake osfd: 66/69. `follow-the-tail` (2) needs a live osfd, as on main; one `agent-view` streaming test flaked under full parallel load and passed 5/5 alone. New: the picker offers `quick-fix`, and a quick-fix run's spine groups its steps under apply and ship. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Every built-in pipeline that writes code began by creating an OpenSpec change, so a one-line fix
paid for a proposal, specs, a design and tasks. `quick-fix` implements the brief directly
(`fix.implement`: the fix, tests that fail without it, and a note in .osf/fix.md), then runs the
same unit and browser test lanes, summary, pull request and merge gate as any change. The fix
step holds only when the worktree changed outside .osf/ (new `worktree-changed` predicate).

The test-suite and summary prompts work without a change, from the brief, the fix note and the
diff, and never borrow another change from openspec/changes. The summary says no spec was
updated and names the specified capabilities the diff may touch. Chosen in the New Run picker
or with the existing `osf:quick-fix` issue label.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
cmoriarty deleted branch quick-fix-pipeline 2026-09-26 17:09:50 -04:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
cmoriarty/braid!56
No description provided.