# internal/core/hardengate

Package hardengate projects draft hardening evidence into the single state used by harden, approve, status, and handoff surfaces.

## KindNotRun

```go
const (
	KindNotRun                Kind = "not_run"
	KindRoundOpen             Kind = "round_open"
	KindNeedsOperatorDecision Kind = "needs_operator_decision"
	KindPassed                Kind = "passed"
	KindStaleAfterDraft       Kind = "stale_after_draft"
	KindOverridden            Kind = "overridden"
	KindError                 Kind = "error"
	KindInvalid               Kind = "invalid"
)
```

## KindRoundOpen

```go
const (
	KindNotRun                Kind = "not_run"
	KindRoundOpen             Kind = "round_open"
	KindNeedsOperatorDecision Kind = "needs_operator_decision"
	KindPassed                Kind = "passed"
	KindStaleAfterDraft       Kind = "stale_after_draft"
	KindOverridden            Kind = "overridden"
	KindError                 Kind = "error"
	KindInvalid               Kind = "invalid"
)
```

## KindNeedsOperatorDecision

```go
const (
	KindNotRun                Kind = "not_run"
	KindRoundOpen             Kind = "round_open"
	KindNeedsOperatorDecision Kind = "needs_operator_decision"
	KindPassed                Kind = "passed"
	KindStaleAfterDraft       Kind = "stale_after_draft"
	KindOverridden            Kind = "overridden"
	KindError                 Kind = "error"
	KindInvalid               Kind = "invalid"
)
```

## KindPassed

```go
const (
	KindNotRun                Kind = "not_run"
	KindRoundOpen             Kind = "round_open"
	KindNeedsOperatorDecision Kind = "needs_operator_decision"
	KindPassed                Kind = "passed"
	KindStaleAfterDraft       Kind = "stale_after_draft"
	KindOverridden            Kind = "overridden"
	KindError                 Kind = "error"
	KindInvalid               Kind = "invalid"
)
```

## KindStaleAfterDraft

```go
const (
	KindNotRun                Kind = "not_run"
	KindRoundOpen             Kind = "round_open"
	KindNeedsOperatorDecision Kind = "needs_operator_decision"
	KindPassed                Kind = "passed"
	KindStaleAfterDraft       Kind = "stale_after_draft"
	KindOverridden            Kind = "overridden"
	KindError                 Kind = "error"
	KindInvalid               Kind = "invalid"
)
```

## KindOverridden

```go
const (
	KindNotRun                Kind = "not_run"
	KindRoundOpen             Kind = "round_open"
	KindNeedsOperatorDecision Kind = "needs_operator_decision"
	KindPassed                Kind = "passed"
	KindStaleAfterDraft       Kind = "stale_after_draft"
	KindOverridden            Kind = "overridden"
	KindError                 Kind = "error"
	KindInvalid               Kind = "invalid"
)
```

## KindError

```go
const (
	KindNotRun                Kind = "not_run"
	KindRoundOpen             Kind = "round_open"
	KindNeedsOperatorDecision Kind = "needs_operator_decision"
	KindPassed                Kind = "passed"
	KindStaleAfterDraft       Kind = "stale_after_draft"
	KindOverridden            Kind = "overridden"
	KindError                 Kind = "error"
	KindInvalid               Kind = "invalid"
)
```

## KindInvalid

```go
const (
	KindNotRun                Kind = "not_run"
	KindRoundOpen             Kind = "round_open"
	KindNeedsOperatorDecision Kind = "needs_operator_decision"
	KindPassed                Kind = "passed"
	KindStaleAfterDraft       Kind = "stale_after_draft"
	KindOverridden            Kind = "overridden"
	KindError                 Kind = "error"
	KindInvalid               Kind = "invalid"
)
```

## ApproveCommand

```go
func ApproveCommand(taskID string) string
```

ApproveCommand formats the approval command.

## HardenCommand

```go
func HardenCommand(taskID string) string
```

HardenCommand formats the harden command.

## LatestRound

```go
func LatestRound(model spec.Model) (spec.HardenRound, bool)
```

LatestRound returns the latest harden round when present.

## MarkPassedCommand

```go
func MarkPassedCommand(taskID string) string
```

MarkPassedCommand formats the manual harden close command.

## NeedsRevisionFollowUp

```go
func NeedsRevisionFollowUp(taskID string, provider bool) string
```

NeedsRevisionFollowUp formats the operator decision prompt after findings.

## Project

```go
func Project(model spec.Model) State
```

Project reduces the current draft spec into harden gate state. The latest harden round is authoritative; top-level harden\_status is treated as a projection that may be stale.

## RepairPacketCommand

```go
func RepairPacketCommand(taskID string, path string) string
```

RepairPacketCommand records a locally repaired HardenDossier without spending another external harden call.

## SameDraft

```go
func SameDraft(round spec.HardenRound, digest string) bool
```

SameDraft reports whether round was recorded against digest. Legacy rounds without a digest are never considered same-draft provider-blocking evidence.

## Kind

```go
type Kind string
```

Kind is the stable harden gate projection state.

## State

```go
type State struct {
	Kind                   Kind
	TaskID                 string
	Reason                 string
	Next                   string
	CurrentDigest          string
	LatestRound            spec.HardenRound
	HasRound               bool
	SameDraft              bool
	CanOpenRound           bool
	CanStartProvider       bool
	ProviderRerunBlocked   bool
	ApprovalReasonRequired bool
	Evidence               []string
	Blockers               []string
}
```

State is the single read model for draft hardening decisions.

- `Kind: Kind`: 
- `TaskID: string`: 
- `Reason: string`: 
- `Next: string`: 
- `CurrentDigest: string`: 
- `LatestRound: spec.HardenRound`: 
- `HasRound: bool`: 
- `SameDraft: bool`: 
- `CanOpenRound: bool`: 
- `CanStartProvider: bool`: 
- `ProviderRerunBlocked: bool`: 
- `ApprovalReasonRequired: bool`: 
- `Evidence: []string`: 
- `Blockers: []string`:
