Files

2.5 KiB

Adopt Delta-Based Changes for Specifications

Why

The current approach of storing complete future states in change proposals creates a poor review experience. When reviewing changes on GitHub, reviewers see entire spec files (often 100+ lines) as "added" in green, making it impossible to identify what actually changed. With the recent structured format adoption, we now have clear section boundaries that enable a better approach: storing only additions and modifications.

What Changes

Store only the requirements that actually change, not complete future states:

  • ADDED Requirements: New capabilities being introduced
  • MODIFIED Requirements: Existing requirements being changed (must match current header)
  • REMOVED Requirements: Deprecated capabilities
  • RENAMED Requirements: Explicit header changes (e.g., FROM: Old Name → TO: New Name)

The archive command will programmatically apply these deltas using normalized header matching (trim leading/trailing whitespace) instead of manually copying entire files.

Impact

Affected specs: openspec-conventions, cli-archive, cli-diff

Benefits:

  • GitHub diffs show only actual changes (25 lines instead of 150+)
  • Reviewers immediately see what's being added, modified, or removed
  • Conflicts are more apparent when two changes modify the same requirement
  • Archive command can programmatically apply changes

Format: Delta format only - all changes must use ADDED/MODIFIED/REMOVED sections.

Example

Instead of storing a 150-line complete future spec, store only:

# User Authentication - Changes

## ADDED Requirements

### Requirement: OAuth Support
Users SHALL authenticate via OAuth providers including Google and GitHub.

#### Scenario: OAuth login flow
- **WHEN** user selects OAuth provider
- **THEN** redirect to provider authorization
- **AND** exchange authorization code for tokens

## MODIFIED Requirements

### Requirement: Session Management
Sessions SHALL expire after 30 minutes of inactivity.

#### Scenario: Inactive session timeout  
- **WHEN** no activity for 30 minutes ← (was 60 minutes)
- **THEN** invalidate session token
- **AND** require re-authentication

## RENAMED Requirements
- FROM: `### Requirement: Basic Authentication`
- TO: `### Requirement: Email Authentication`

This makes reviews focused and changes explicit.

Conflict Resolution

Git naturally detects conflicts when two changes modify the same requirement header. This is actually better than full-state storage where Git might silently merge incompatible changes.