Skip to content

Framing returns to the pitch (2/2) - #284

Merged
rothlis merged 2 commits into
mainfrom
claude/framing-returns-to-pitch
Oct 23, 2026
Merged

rothlis merged 2 commits into
mainfrom
claude/framing-returns-to-pitch

Conversation

@rothlis

@rothlis rothlis commented Oct 22, 2026 •

Copy link
Copy Markdown
Member

Part 2 of 2 for #282. This PR is stacked on #283. Merge #283 first.

What changes

A pitch has a frame again (ADR 0032). A new pitch starts at the framing stage, in an upcoming cycle, and carries one or more sharp requests.

  • Pitch stages: framing → shaping → building → done. "Frame Go" is framing → shaping. "Shape Go" is shaping → building. A stored framing stage now stays framing. An unknown stage still reads as shaping.
  • Pitch fields: request_ids, frame_outcomes (a list), frame_appetite, release_summary and release_note_url. The free-text frame_outcome is gone.
  • Seed rule: a new pitch copies its frame from its requests: every outcome, the largest appetite, the problem summaries (one per line) and the first release draft. Fields the caller writes win. An update copies nothing, because the pitch owns its frame after creation.
  • Sharp gate: upsert_pitch refuses a rough or unknown request and writes nothing, on a create and on an update, alone or in a batch.
  • Request state: a request reads pitched while its pitch waits in an upcoming cycle. A pitch that is in flight still wins over a pitched one.
  • Request panel: the "Bet" button is now "Pitch". It only offers upcoming cycles. The server action refuses any other cycle.
  • Scope Map header: shows the outcomes list, and the release summary with a link to the full note.
  • Request page: shows the release summary of the pitch that shipped. Until then it shows the request's own draft.
  • Migration: the same runner now also turns frame_id or request_id into request_ids, and frame_outcome into a one-item list. It is still safe to run twice.

CAUTION: This code reads only request_ids. If the migration of #283 already ran, run the migration again right after this PR deploys. Until then, every request loses its link to its pitches. The simplest release deploys #283 and #284 together and runs the migration once.

Decisions I made that the spec left open

  • The stored keys keep the frame_ prefix (frame_problem, frame_outcomes, frame_appetite). The frame is now part of the pitch, so the prefix is correct. It also avoids another rename of frame_problem.
  • Release drafts are not moved between rooms. A request keeps its draft. A new pitch copies it. The request page shows the shipped pitch's summary first. This removes a migration that would have to cross rooms.
  • "Largest appetite" compares "N days", "N weeks" and "N months". If no appetite has a length in it, the first appetite wins.
  • upsert_pitch does not check that the cycle is upcoming. An agent names the cycle. The app's "Pitch" button and its server action do check it.
  • Pitches made from Mission Control start at framing in an upcoming build cycle, and at shaping in a build cycle that already started.

Tests

  • 1,050 unit tests pass. New tests cover the pitched state, upcoming cycles, the framing stage, the seed rule, the writer fields, the tool's sharp gate and seed, and the migration of pitch fields.
  • Typecheck and lint are clean.
  • I did not run the Playwright specs, because Chromium for Playwright is not installed on this machine. e2e/scope-map.spec.ts now looks for "Outcomes".

🤖 Generated with Claude Code

@vercel

vercel Bot commented Oct 22, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
cycles Ready Ready Preview Oct 23, 2026 2:50pm UTC

Request Review

@rothlis
rothlis added this pull request to stack #285 October 22, 2026 18:20
@rothlis
rothlis force-pushed the claude/framing-returns-to-pitch branch from 56969ad to 4df2ca5 Compare October 22, 2026 20:34
Base automatically changed from claude/rename-frame-to-request-b82d1f to main October 23, 2026 14:49
rothlis and others added 2 commits October 23, 2026 10:49
A pitch now has a frame again (ADR 0032). It starts at the framing stage
in an upcoming cycle, and it carries one or more sharp requests.

- Pitch stages: framing → shaping → building → done. A stored framing
  stage stays framing. An unknown stage still reads as shaping.
- A pitch holds request_ids, frame_outcomes, frame_appetite,
  release_summary and release_note_url. frame_outcome (free text) is
  gone.
- A new pitch copies its frame from its requests: every outcome, the
  largest appetite, the problem summaries and the first release draft.
  Fields the caller writes win. An update copies nothing.
- upsert_pitch refuses a rough or unknown request. The "Pitch" button on
  a request only offers upcoming cycles.
- A request reads "pitched" while its pitch waits in an upcoming cycle.
- The request page shows the release summary of the pitch that shipped.
- The migration also turns frame_id or request_id into request_ids and
  frame_outcome into a list.

Spec: #282

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- upsert_pitch checks request_ids on an update and in a batch too. A
  batched create is seeded like a single one.
- A pitch at framing draws the dashed outline on the Product Map.
- A pitch added to a build cycle that already started begins at shaping.
- The Pitch panel says when no upcoming cycle exists.
- pitchRequest no longer reads a Liveblocks failure as "no upcoming cycle".
- isShapeStage reads STAGES instead of a second copy of the list.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@rothlis
rothlis force-pushed the claude/framing-returns-to-pitch branch from 4df2ca5 to ca31386 Compare October 23, 2026 14:49
@rothlis
rothlis merged commit 6d8383e into main Oct 23, 2026
4 of 5 checks passed

This branch was successfully deployed

1 active deployment
Preview — ca313865 Deployed Oct 23, 2026 by vercel[bot]
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