# internal/core/spec

Package spec defines the normalized model for living Markdown task specs.

## HardenNotRun

```go
const (
	// HardenNotRun means no hardening round has been opened.
	HardenNotRun HardenStatus = "not_run"
	// HardenInProgress means a hardening round is waiting for answers.
	HardenInProgress HardenStatus = "in_progress"
	// HardenPassed means hardening completed successfully.
	HardenPassed HardenStatus = "passed"
	// HardenNeedsRevision means hardening identified draft contract work before approval.
	HardenNeedsRevision HardenStatus = "needs_revision"
	// HardenOverridden means the operator approved the draft despite incomplete or rejected harden evidence.
	HardenOverridden HardenStatus = "overridden"
	// HardenError means the hardening provider or recorded harden evidence could not be accepted.
	HardenError HardenStatus = "error"
)
```

## HardenInProgress

```go
const (
	// HardenNotRun means no hardening round has been opened.
	HardenNotRun HardenStatus = "not_run"
	// HardenInProgress means a hardening round is waiting for answers.
	HardenInProgress HardenStatus = "in_progress"
	// HardenPassed means hardening completed successfully.
	HardenPassed HardenStatus = "passed"
	// HardenNeedsRevision means hardening identified draft contract work before approval.
	HardenNeedsRevision HardenStatus = "needs_revision"
	// HardenOverridden means the operator approved the draft despite incomplete or rejected harden evidence.
	HardenOverridden HardenStatus = "overridden"
	// HardenError means the hardening provider or recorded harden evidence could not be accepted.
	HardenError HardenStatus = "error"
)
```

## HardenPassed

```go
const (
	// HardenNotRun means no hardening round has been opened.
	HardenNotRun HardenStatus = "not_run"
	// HardenInProgress means a hardening round is waiting for answers.
	HardenInProgress HardenStatus = "in_progress"
	// HardenPassed means hardening completed successfully.
	HardenPassed HardenStatus = "passed"
	// HardenNeedsRevision means hardening identified draft contract work before approval.
	HardenNeedsRevision HardenStatus = "needs_revision"
	// HardenOverridden means the operator approved the draft despite incomplete or rejected harden evidence.
	HardenOverridden HardenStatus = "overridden"
	// HardenError means the hardening provider or recorded harden evidence could not be accepted.
	HardenError HardenStatus = "error"
)
```

## HardenNeedsRevision

```go
const (
	// HardenNotRun means no hardening round has been opened.
	HardenNotRun HardenStatus = "not_run"
	// HardenInProgress means a hardening round is waiting for answers.
	HardenInProgress HardenStatus = "in_progress"
	// HardenPassed means hardening completed successfully.
	HardenPassed HardenStatus = "passed"
	// HardenNeedsRevision means hardening identified draft contract work before approval.
	HardenNeedsRevision HardenStatus = "needs_revision"
	// HardenOverridden means the operator approved the draft despite incomplete or rejected harden evidence.
	HardenOverridden HardenStatus = "overridden"
	// HardenError means the hardening provider or recorded harden evidence could not be accepted.
	HardenError HardenStatus = "error"
)
```

## HardenOverridden

```go
const (
	// HardenNotRun means no hardening round has been opened.
	HardenNotRun HardenStatus = "not_run"
	// HardenInProgress means a hardening round is waiting for answers.
	HardenInProgress HardenStatus = "in_progress"
	// HardenPassed means hardening completed successfully.
	HardenPassed HardenStatus = "passed"
	// HardenNeedsRevision means hardening identified draft contract work before approval.
	HardenNeedsRevision HardenStatus = "needs_revision"
	// HardenOverridden means the operator approved the draft despite incomplete or rejected harden evidence.
	HardenOverridden HardenStatus = "overridden"
	// HardenError means the hardening provider or recorded harden evidence could not be accepted.
	HardenError HardenStatus = "error"
)
```

## HardenError

```go
const (
	// HardenNotRun means no hardening round has been opened.
	HardenNotRun HardenStatus = "not_run"
	// HardenInProgress means a hardening round is waiting for answers.
	HardenInProgress HardenStatus = "in_progress"
	// HardenPassed means hardening completed successfully.
	HardenPassed HardenStatus = "passed"
	// HardenNeedsRevision means hardening identified draft contract work before approval.
	HardenNeedsRevision HardenStatus = "needs_revision"
	// HardenOverridden means the operator approved the draft despite incomplete or rejected harden evidence.
	HardenOverridden HardenStatus = "overridden"
	// HardenError means the hardening provider or recorded harden evidence could not be accepted.
	HardenError HardenStatus = "error"
)
```

## RiskLow

```go
const (
	// RiskLow describes low implementation risk.
	RiskLow RiskLevel = "low"
	// RiskMedium describes medium implementation risk.
	RiskMedium RiskLevel = "medium"
	// RiskHigh describes high implementation risk.
	RiskHigh RiskLevel = "high"
)
```

## RiskMedium

```go
const (
	// RiskLow describes low implementation risk.
	RiskLow RiskLevel = "low"
	// RiskMedium describes medium implementation risk.
	RiskMedium RiskLevel = "medium"
	// RiskHigh describes high implementation risk.
	RiskHigh RiskLevel = "high"
)
```

## RiskHigh

```go
const (
	// RiskLow describes low implementation risk.
	RiskLow RiskLevel = "low"
	// RiskMedium describes medium implementation risk.
	RiskMedium RiskLevel = "medium"
	// RiskHigh describes high implementation risk.
	RiskHigh RiskLevel = "high"
)
```

## SizeSmall

```go
const (
	// SizeSmall describes a small task.
	SizeSmall Size = "small"
	// SizeMedium describes a medium task.
	SizeMedium Size = "medium"
	// SizeLarge describes a large task.
	SizeLarge Size = "large"
)
```

## SizeMedium

```go
const (
	// SizeSmall describes a small task.
	SizeSmall Size = "small"
	// SizeMedium describes a medium task.
	SizeMedium Size = "medium"
	// SizeLarge describes a large task.
	SizeLarge Size = "large"
)
```

## SizeLarge

```go
const (
	// SizeSmall describes a small task.
	SizeSmall Size = "small"
	// SizeMedium describes a medium task.
	SizeMedium Size = "medium"
	// SizeLarge describes a large task.
	SizeLarge Size = "large"
)
```

## StatusDraft

```go
const (
	// StatusDraft is the editable pre-approval state.
	StatusDraft Status = "draft"
	// StatusApproved is ready for execution.
	StatusApproved Status = "approved"
	// StatusActive is actively executing acceptance criteria.
	StatusActive Status = "active"
	// StatusBlocked means execution or review found blocking work.
	StatusBlocked Status = "blocked"
	// StatusReview is waiting on or inside the review gate.
	StatusReview Status = "review"
	// StatusCompleted is the terminal successful state.
	StatusCompleted Status = "completed"
	// StatusFailed is the terminal unsuccessful state.
	StatusFailed Status = "failed"
	// StatusCancelled is the terminal abandoned state.
	StatusCancelled Status = "cancelled"
)
```

## StatusApproved

```go
const (
	// StatusDraft is the editable pre-approval state.
	StatusDraft Status = "draft"
	// StatusApproved is ready for execution.
	StatusApproved Status = "approved"
	// StatusActive is actively executing acceptance criteria.
	StatusActive Status = "active"
	// StatusBlocked means execution or review found blocking work.
	StatusBlocked Status = "blocked"
	// StatusReview is waiting on or inside the review gate.
	StatusReview Status = "review"
	// StatusCompleted is the terminal successful state.
	StatusCompleted Status = "completed"
	// StatusFailed is the terminal unsuccessful state.
	StatusFailed Status = "failed"
	// StatusCancelled is the terminal abandoned state.
	StatusCancelled Status = "cancelled"
)
```

## StatusActive

```go
const (
	// StatusDraft is the editable pre-approval state.
	StatusDraft Status = "draft"
	// StatusApproved is ready for execution.
	StatusApproved Status = "approved"
	// StatusActive is actively executing acceptance criteria.
	StatusActive Status = "active"
	// StatusBlocked means execution or review found blocking work.
	StatusBlocked Status = "blocked"
	// StatusReview is waiting on or inside the review gate.
	StatusReview Status = "review"
	// StatusCompleted is the terminal successful state.
	StatusCompleted Status = "completed"
	// StatusFailed is the terminal unsuccessful state.
	StatusFailed Status = "failed"
	// StatusCancelled is the terminal abandoned state.
	StatusCancelled Status = "cancelled"
)
```

## StatusBlocked

```go
const (
	// StatusDraft is the editable pre-approval state.
	StatusDraft Status = "draft"
	// StatusApproved is ready for execution.
	StatusApproved Status = "approved"
	// StatusActive is actively executing acceptance criteria.
	StatusActive Status = "active"
	// StatusBlocked means execution or review found blocking work.
	StatusBlocked Status = "blocked"
	// StatusReview is waiting on or inside the review gate.
	StatusReview Status = "review"
	// StatusCompleted is the terminal successful state.
	StatusCompleted Status = "completed"
	// StatusFailed is the terminal unsuccessful state.
	StatusFailed Status = "failed"
	// StatusCancelled is the terminal abandoned state.
	StatusCancelled Status = "cancelled"
)
```

## StatusReview

```go
const (
	// StatusDraft is the editable pre-approval state.
	StatusDraft Status = "draft"
	// StatusApproved is ready for execution.
	StatusApproved Status = "approved"
	// StatusActive is actively executing acceptance criteria.
	StatusActive Status = "active"
	// StatusBlocked means execution or review found blocking work.
	StatusBlocked Status = "blocked"
	// StatusReview is waiting on or inside the review gate.
	StatusReview Status = "review"
	// StatusCompleted is the terminal successful state.
	StatusCompleted Status = "completed"
	// StatusFailed is the terminal unsuccessful state.
	StatusFailed Status = "failed"
	// StatusCancelled is the terminal abandoned state.
	StatusCancelled Status = "cancelled"
)
```

## StatusCompleted

```go
const (
	// StatusDraft is the editable pre-approval state.
	StatusDraft Status = "draft"
	// StatusApproved is ready for execution.
	StatusApproved Status = "approved"
	// StatusActive is actively executing acceptance criteria.
	StatusActive Status = "active"
	// StatusBlocked means execution or review found blocking work.
	StatusBlocked Status = "blocked"
	// StatusReview is waiting on or inside the review gate.
	StatusReview Status = "review"
	// StatusCompleted is the terminal successful state.
	StatusCompleted Status = "completed"
	// StatusFailed is the terminal unsuccessful state.
	StatusFailed Status = "failed"
	// StatusCancelled is the terminal abandoned state.
	StatusCancelled Status = "cancelled"
)
```

## StatusFailed

```go
const (
	// StatusDraft is the editable pre-approval state.
	StatusDraft Status = "draft"
	// StatusApproved is ready for execution.
	StatusApproved Status = "approved"
	// StatusActive is actively executing acceptance criteria.
	StatusActive Status = "active"
	// StatusBlocked means execution or review found blocking work.
	StatusBlocked Status = "blocked"
	// StatusReview is waiting on or inside the review gate.
	StatusReview Status = "review"
	// StatusCompleted is the terminal successful state.
	StatusCompleted Status = "completed"
	// StatusFailed is the terminal unsuccessful state.
	StatusFailed Status = "failed"
	// StatusCancelled is the terminal abandoned state.
	StatusCancelled Status = "cancelled"
)
```

## StatusCancelled

```go
const (
	// StatusDraft is the editable pre-approval state.
	StatusDraft Status = "draft"
	// StatusApproved is ready for execution.
	StatusApproved Status = "approved"
	// StatusActive is actively executing acceptance criteria.
	StatusActive Status = "active"
	// StatusBlocked means execution or review found blocking work.
	StatusBlocked Status = "blocked"
	// StatusReview is waiting on or inside the review gate.
	StatusReview Status = "review"
	// StatusCompleted is the terminal successful state.
	StatusCompleted Status = "completed"
	// StatusFailed is the terminal unsuccessful state.
	StatusFailed Status = "failed"
	// StatusCancelled is the terminal abandoned state.
	StatusCancelled Status = "cancelled"
)
```

## ErrInvalidSpec

```go
var (
	// ErrInvalidSpec wraps normalized spec validation failures.
	ErrInvalidSpec = errors.New("invalid spec")
)
```

## ContractDigest

```go
func ContractDigest(model Model) string
```

ContractDigest returns a stable digest of the task contract under review. Volatile projection fields such as lifecycle status, current state, updated timestamps, harden/review output, and acceptance evidence are intentionally excluded.

## HardenContractDigest

```go
func HardenContractDigest(model Model) string
```

HardenContractDigest returns a stable digest of the draft material under the pre-approval harden gate. It excludes lifecycle projections and harden evidence so rerunning harden without changing the draft contract is detectable.

## ValidHardenStatus

```go
func ValidHardenStatus(status HardenStatus) bool
```

ValidHardenStatus reports whether status is a supported hardening status.

## ValidStatus

```go
func ValidStatus(status Status) bool
```

ValidStatus reports whether status is a supported lifecycle status.

## Validate

```go
func Validate(model Model) Validation
```

Validate checks model shape and executable acceptance semantics.

## Acceptance

```go
type Acceptance struct {
	ValidationProfile string          `json:"validation_profile"`
	DefinitionDone    []ChecklistItem `json:"definition_done"`
	Criteria          []Criterion     `json:"criteria"`
}
```

Acceptance groups global definition-of-done and criterion checks.

- `ValidationProfile: string` (json:"validation_profile"): 
- `DefinitionDone: []ChecklistItem` (json:"definition_done"): 
- `Criteria: []Criterion` (json:"criteria"): 

## ChecklistItem

```go
type ChecklistItem struct {
	ID      string `json:"id"`
	Text    string `json:"text"`
	Checked bool   `json:"checked"`
}
```

ChecklistItem is one human-readable checklist row.

- `ID: string` (json:"id"): 
- `Text: string` (json:"text"): 
- `Checked: bool` (json:"checked"): 

## Context

```go
type Context struct {
	CWD           string   `json:"cwd"`
	Packages      []string `json:"packages"`
	FilesImpacted []string `json:"files_impacted"`
	Invariants    []string `json:"invariants"`
	RelatedDocs   []string `json:"related_docs"`
}
```

Context captures workspace and codebase surfaces relevant to the task.

- `CWD: string` (json:"cwd"): 
- `Packages: []string` (json:"packages"): 
- `FilesImpacted: []string` (json:"files_impacted"): 
- `Invariants: []string` (json:"invariants"): 
- `RelatedDocs: []string` (json:"related_docs"): 

## Criterion

```go
type Criterion struct {
	ID           string                  `json:"id"`
	Title        string                  `json:"title"`
	Type         string                  `json:"type"`
	PhaseID      string                  `json:"phase_id"`
	Command      string                  `json:"command"`
	ExpectedKind acceptance.ExpectedKind `json:"expected_kind"`
	Status       string                  `json:"status"`
	Evidence     string                  `json:"evidence"`
	SourceEvent  string                  `json:"source_event"`
}
```

Criterion is a machine-checkable acceptance item.

- `ID: string` (json:"id"): 
- `Title: string` (json:"title"): 
- `Type: string` (json:"type"): 
- `PhaseID: string` (json:"phase_id"): 
- `Command: string` (json:"command"): 
- `ExpectedKind: acceptance.ExpectedKind` (json:"expected_kind"): 
- `Status: string` (json:"status"): 
- `Evidence: string` (json:"evidence"): 
- `SourceEvent: string` (json:"source_event"): 

## CurrentState

```go
type CurrentState struct {
	CurrentPhase       string `json:"current_phase"`
	Next               string `json:"next"`
	Reason             string `json:"reason"`
	Blockers           string `json:"blockers"`
	AllowedFollowUp    string `json:"allowed_follow_up"`
	LatestRunnerUpdate string `json:"latest_runner_update"`
	ReviewGate         string `json:"review_gate"`
}
```

CurrentState is the readable projection of the next task action.

- `CurrentPhase: string` (json:"current_phase"): 
- `Next: string` (json:"next"): 
- `Reason: string` (json:"reason"): 
- `Blockers: string` (json:"blockers"): 
- `AllowedFollowUp: string` (json:"allowed_follow_up"): 
- `LatestRunnerUpdate: string` (json:"latest_runner_update"): 
- `ReviewGate: string` (json:"review_gate"): 

## HardenObservation

```go
type HardenObservation struct {
	Dimension    string `json:"dimension"`
	Result       string `json:"result"`
	Anchor       string `json:"anchor"`
	Note         string `json:"note,omitempty"`
	Question     string `json:"question,omitempty"`
	Recommended  string `json:"recommended,omitempty"`
	IfUnanswered string `json:"if_unanswered,omitempty"`
	Default      string `json:"default,omitempty"`
	Status       string `json:"status,omitempty"`
}
```

HardenObservation records one grounded hardening observation.

- `Dimension: string` (json:"dimension"): 
- `Result: string` (json:"result"): 
- `Anchor: string` (json:"anchor"): 
- `Note: string` (json:"note,omitempty"): 
- `Question: string` (json:"question,omitempty"): 
- `Recommended: string` (json:"recommended,omitempty"): 
- `IfUnanswered: string` (json:"if_unanswered,omitempty"): 
- `Default: string` (json:"default,omitempty"): 
- `Status: string` (json:"status,omitempty"): 

## HardenRound

```go
type HardenRound struct {
	ID             string              `json:"id"`
	Status         string              `json:"status"`
	StartedAt      string              `json:"started_at"`
	EndedAt        string              `json:"ended_at"`
	SpecDigest     string              `json:"spec_digest,omitempty"`
	Verdict        string              `json:"verdict,omitempty"`
	Summary        string              `json:"summary,omitempty"`
	DiagnosticPath string              `json:"diagnostic_path,omitempty"`
	Provider       string              `json:"provider,omitempty"`
	Model          string              `json:"model,omitempty"`
	OutputFormat   string              `json:"output_format,omitempty"`
	Shape          HardenShape         `json:"shape,omitempty"`
	Observations   []HardenObservation `json:"observations"`
}
```

HardenRound records one pre-approval hardening pass.

- `ID: string` (json:"id"): 
- `Status: string` (json:"status"): 
- `StartedAt: string` (json:"started_at"): 
- `EndedAt: string` (json:"ended_at"): 
- `SpecDigest: string` (json:"spec_digest,omitempty"): 
- `Verdict: string` (json:"verdict,omitempty"): 
- `Summary: string` (json:"summary,omitempty"): 
- `DiagnosticPath: string` (json:"diagnostic_path,omitempty"): 
- `Provider: string` (json:"provider,omitempty"): 
- `Model: string` (json:"model,omitempty"): 
- `OutputFormat: string` (json:"output_format,omitempty"): 
- `Shape: HardenShape` (json:"shape,omitempty"): 
- `Observations: []HardenObservation` (json:"observations"): 

## HardenShape

```go
type HardenShape struct {
	Decision          string   `json:"decision,omitempty"`
	TrueShape         string   `json:"true_shape,omitempty"`
	MinimalPlan       string   `json:"minimal_plan,omitempty"`
	SharedOwner       string   `json:"shared_owner,omitempty"`
	AdapterBoundaries []string `json:"adapter_boundaries,omitempty"`
	RequiredSpecEdits []string `json:"required_spec_edits,omitempty"`
}
```

HardenShape records the harden gate's answer to whether the draft should exist in its current form.

- `Decision: string` (json:"decision,omitempty"): 
- `TrueShape: string` (json:"true_shape,omitempty"): 
- `MinimalPlan: string` (json:"minimal_plan,omitempty"): 
- `SharedOwner: string` (json:"shared_owner,omitempty"): 
- `AdapterBoundaries: []string` (json:"adapter_boundaries,omitempty"): 
- `RequiredSpecEdits: []string` (json:"required_spec_edits,omitempty"): 

## HardenStatus

```go
type HardenStatus string
```

HardenStatus names the state of the pre-approval hardening pass.

## Model

```go
type Model struct {
	Version      string            `json:"spec_version"`
	TaskID       string            `json:"task_id"`
	Created      string            `json:"created"`
	Updated      string            `json:"updated"`
	Title        string            `json:"title"`
	Summary      string            `json:"summary"`
	Status       Status            `json:"status"`
	HardenStatus HardenStatus      `json:"harden_status"`
	Size         Size              `json:"size"`
	RiskLevel    RiskLevel         `json:"risk_level"`
	CurrentState CurrentState      `json:"current_state"`
	Context      Context           `json:"context"`
	Objectives   []string          `json:"objectives"`
	Scope        []string          `json:"scope"`
	Dependencies []string          `json:"dependencies"`
	Assumptions  []string          `json:"assumptions"`
	Touchpoints  []string          `json:"touchpoints"`
	Risks        []Risk            `json:"risks"`
	Acceptance   Acceptance        `json:"acceptance"`
	Phases       []Phase           `json:"phases"`
	Rollback     []string          `json:"rollback"`
	Review       ReviewState       `json:"review"`
	SelfEval     []string          `json:"self_eval"`
	Deviations   []string          `json:"deviations"`
	Metadata     map[string]string `json:"metadata"`
	Origin       Origin            `json:"origin"`
	HardenRounds []HardenRound     `json:"harden_rounds"`
	PlanningLog  []PlanningEvent   `json:"planning_log"`
}
```

Model is the normalized in-memory representation of a living Markdown spec.

- `Version: string` (json:"spec_version"): 
- `TaskID: string` (json:"task_id"): 
- `Created: string` (json:"created"): 
- `Updated: string` (json:"updated"): 
- `Title: string` (json:"title"): 
- `Summary: string` (json:"summary"): 
- `Status: Status` (json:"status"): 
- `HardenStatus: HardenStatus` (json:"harden_status"): 
- `Size: Size` (json:"size"): 
- `RiskLevel: RiskLevel` (json:"risk_level"): 
- `CurrentState: CurrentState` (json:"current_state"): 
- `Context: Context` (json:"context"): 
- `Objectives: []string` (json:"objectives"): 
- `Scope: []string` (json:"scope"): 
- `Dependencies: []string` (json:"dependencies"): 
- `Assumptions: []string` (json:"assumptions"): 
- `Touchpoints: []string` (json:"touchpoints"): 
- `Risks: []Risk` (json:"risks"): 
- `Acceptance: Acceptance` (json:"acceptance"): 
- `Phases: []Phase` (json:"phases"): 
- `Rollback: []string` (json:"rollback"): 
- `Review: ReviewState` (json:"review"): 
- `SelfEval: []string` (json:"self_eval"): 
- `Deviations: []string` (json:"deviations"): 
- `Metadata: map[string]string` (json:"metadata"): 
- `Origin: Origin` (json:"origin"): 
- `HardenRounds: []HardenRound` (json:"harden_rounds"): 
- `PlanningLog: []PlanningEvent` (json:"planning_log"): 

## AllCriteria

```go
func (m Model) AllCriteria() []Criterion
```

AllCriteria returns global and phase acceptance criteria with phase IDs filled.

## WithStatus

```go
func (m Model) WithStatus(status Status) Model
```

WithStatus returns a copy of the model with status and next state updated.

## Origin

```go
type Origin struct {
	CreatedBy string `json:"created_by"`
	Source    string `json:"source"`
}
```

Origin records where the spec came from.

- `CreatedBy: string` (json:"created_by"): 
- `Source: string` (json:"source"): 

## Phase

```go
type Phase struct {
	ID             string          `json:"id"`
	Number         int             `json:"number"`
	Name           string          `json:"name"`
	Status         string          `json:"status"`
	Reason         string          `json:"reason"`
	Dependencies   []string        `json:"dependencies"`
	Objective      string          `json:"objective"`
	Changes        []string        `json:"changes"`
	Acceptance     []Criterion     `json:"acceptance"`
	DefinitionDone []ChecklistItem `json:"definition_done"`
}
```

Phase describes a numbered execution phase and its evidence-derived state.

- `ID: string` (json:"id"): 
- `Number: int` (json:"number"): 
- `Name: string` (json:"name"): 
- `Status: string` (json:"status"): 
- `Reason: string` (json:"reason"): 
- `Dependencies: []string` (json:"dependencies"): 
- `Objective: string` (json:"objective"): 
- `Changes: []string` (json:"changes"): 
- `Acceptance: []Criterion` (json:"acceptance"): 
- `DefinitionDone: []ChecklistItem` (json:"definition_done"): 

## PlanningEvent

```go
type PlanningEvent struct {
	Time string `json:"time"`
	Text string `json:"text"`
}
```

PlanningEvent records a timestamped planning log entry.

- `Time: string` (json:"time"): 
- `Text: string` (json:"text"): 

## Record

```go
type Record struct {
	TaskID string `json:"task_id"`
	Status Status `json:"status"`
	Path   string `json:"path"`
	Title  string `json:"title"`
}
```

Record is a compact listing entry for a task spec.

- `TaskID: string` (json:"task_id"): 
- `Status: Status` (json:"status"): 
- `Path: string` (json:"path"): 
- `Title: string` (json:"title"): 

## ReviewState

```go
type ReviewState struct {
	Status         string                      `json:"status"`
	Verdict        string                      `json:"verdict"`
	Mode           corereview.Mode             `json:"mode,omitempty"`
	Summary        string                      `json:"summary,omitempty"`
	Findings       []corereview.Finding        `json:"findings,omitempty"`
	AttackLog      []corereview.AttackLogEntry `json:"attack_log,omitempty"`
	Budget         corereview.Budget           `json:"budget,omitempty"`
	Provider       string                      `json:"provider,omitempty"`
	Model          string                      `json:"model,omitempty"`
	OutputFormat   string                      `json:"output_format,omitempty"`
	Normalizations []string                    `json:"normalizations,omitempty"`
}
```

ReviewState stores the latest review gate projection.

- `Status: string` (json:"status"): 
- `Verdict: string` (json:"verdict"): 
- `Mode: corereview.Mode` (json:"mode,omitempty"): 
- `Summary: string` (json:"summary,omitempty"): 
- `Findings: []corereview.Finding` (json:"findings,omitempty"): 
- `AttackLog: []corereview.AttackLogEntry` (json:"attack_log,omitempty"): 
- `Budget: corereview.Budget` (json:"budget,omitempty"): 
- `Provider: string` (json:"provider,omitempty"): 
- `Model: string` (json:"model,omitempty"): 
- `OutputFormat: string` (json:"output_format,omitempty"): 
- `Normalizations: []string` (json:"normalizations,omitempty"): 

## Risk

```go
type Risk struct {
	Description string `json:"description"`
	Mitigation  string `json:"mitigation"`
}
```

Risk captures one known risk and its mitigation.

- `Description: string` (json:"description"): 
- `Mitigation: string` (json:"mitigation"): 

## RiskLevel

```go
type RiskLevel string
```

RiskLevel estimates implementation risk.

## Size

```go
type Size string
```

Size estimates implementation effort.

## Source

```go
type Source struct {
	Model    Model  `json:"model"`
	Path     string `json:"path"`
	Markdown []byte `json:"-"`
}
```

Source carries the parsed model and exact Markdown bytes it came from.

- `Model: Model` (json:"model"): 
- `Path: string` (json:"path"): 
- `Markdown: []byte` (json:"-"): 

## Status

```go
type Status string
```

Status names a task's lifecycle state in the normalized spec model.

## Validation

```go
type Validation struct {
	Valid  bool     `json:"valid"`
	Errors []string `json:"errors"`
}
```

Validation reports whether a spec model satisfies runtime requirements.

- `Valid: bool` (json:"valid"): 
- `Errors: []string` (json:"errors"): 

## Error

```go
func (v Validation) Error() string
```

## Unwrap

```go
func (v Validation) Unwrap() error
```
