# internal/app/approve

Package approve implements the approval lifecycle use case.

## ErrApprovalReasonRequired

```go
var ErrApprovalReasonRequired = errors.New("approval reason required")
```

ErrApprovalReasonRequired is returned when a draft carries harden evidence that needs an explicit operator decision before approval.

## ErrSpecNotDraft

```go
var ErrSpecNotDraft = errors.New("approve only operates on drafts")
```

ErrSpecNotDraft is returned when approval is attempted outside draft state.

## Run

```go
func Run(ctx context.Context, specs SpecStore, sessions SessionStore, workspace WorkspaceStatus, clock Clock, taskID string, reason string) (Output, error)
```

Run approves a draft spec and records approval evidence.

## Clock

```go
type Clock interface{ Now() time.Time }
```

Clock supplies approval timestamps.

- `Now: func() time.Time`: 

## Output

```go
type Output struct {
	TaskID string      `json:"task_id"`
	Status spec.Status `json:"status"`
	Path   string      `json:"path"`
}
```

Output describes the approved task.

- `TaskID: string` (json:"task_id"): 
- `Status: spec.Status` (json:"status"): 
- `Path: string` (json:"path"): 

## SessionStore

```go
type SessionStore interface {
	Append(context.Context, string, session.Entry, string) (session.Session, error)
}
```

SessionStore is the session evidence port used by approval.

- `Append: func(context.Context, string, session.Entry, string) (session.Session, error)`: 

## SpecStore

```go
type SpecStore interface {
	Load(context.Context, string) (spec.Model, string, error)
	Save(context.Context, string, spec.Model) error
	Find(string) (string, error)
}
```

SpecStore is the spec persistence port used by approval.

- `Load: func(context.Context, string) (spec.Model, string, error)`: 
- `Save: func(context.Context, string, spec.Model) error`: 
- `Find: func(string) (string, error)`: 

## WorkspaceStatus

```go
type WorkspaceStatus interface {
	ChangedFiles(context.Context) ([]string, error)
}
```

WorkspaceStatus captures dirty workspace state before task execution begins.

- `ChangedFiles: func(context.Context) ([]string, error)`:
