{{define "content"}}

Approval centre

Actions a mind wants to take that policy marks ASK. Approvals are bound to the exact request; modified parameters are re-validated and recorded.

{{$op := .Principal.User.Role.AtLeast "operator"}}

Pending {{len .Data.Pending}}

{{if .Data.Pending}}{{range .Data.Pending}}
{{.Risk}} {{index $.Data.MindNames .MindID}} wants {{.Capability}}{{if .Target}} on {{.Target}}{{end}} · requested {{ago .CreatedAt}} · expires {{.ExpiresAt.Local.Format "02 Jan 15:04"}}{{if .EventID}} · event{{end}}
{{with index $.Data.Caps .Capability}}

{{.Access}} · {{if .Idempotent}}idempotent{{else}}not idempotent{{end}}{{if .SideEffects}} · side effects: {{.SideEffects}}{{end}}

{{end}}

Reason

{{if .Reason}}{{.Reason}}{{else}}none given{{end}}

{{if .Evidence}}

Evidence

    {{range .Evidence}}
  • {{.Kind}} {{if eq .Kind "event"}}{{.ID}}{{else}}{{.ID}}{{end}} {{.Note}}
  • {{end}}
{{end}}

Parameters

{{pretty (jsonOf .Params)}}
{{if $op}}
Modify parameters before approving
{{end}}
{{end}} {{else}}

Nothing is waiting.

{{end}}

Capability requests {{len .Data.Batches}} batch(es)

Temporary, scoped authority a mind has asked for. Granting creates an expiring grant that applies only where policy says ASK; it never overrides DENY. You may grant less than was asked.

{{if .Data.Batches}}{{range .Data.Batches}}
{{index $.Data.MindNames .MindID}} · {{len .Requests}} related request(s){{if .IntentionID}} for intention {{trunc (printf "%s" .IntentionID) 8}}{{end}}
{{range .Requests}}
{{.Access}} {{.Capability}} on {{.TargetPattern}} for {{duration .DurationSeconds}}{{if .MaxOperations}}, at most {{deref_int .MaxOperations}} operations{{end}} · expires {{.ExpiresAt.Local.Format "02 Jan 15:04"}}{{if .EventID}} · event{{end}}

Why

{{.Reason}}

{{if .Evidence}}

Evidence

    {{range .Evidence}}
  • {{.Kind}} {{if eq .Kind "event"}}{{.ID}}{{else}}{{.ID}}{{end}} {{.Note}}
  • {{end}}
{{end}} {{if .ParamConstraints}}

Parameter limits

{{pretty (jsonOf .ParamConstraints)}}
{{end}}

Risk

{{if .Risk}}{{.Risk}}{{else}}none stated{{end}}

{{if .Mitigation}}

Mitigation

{{.Mitigation}}

{{end}} {{if .Fallback}}

If refused

{{.Fallback}}

{{end}} {{if .Alternatives}}

Alternatives

    {{range .Alternatives}}
  • {{.}}
  • {{end}}
{{end}} {{with index $.Data.Caps .Capability}}{{if .SideEffects}}

Side effects

{{.SideEffects}}

{{end}}{{end}}

Earlier decisions on this capability for this mind: {{index .History "granted"}} granted, {{index .History "denied"}} denied. History informs; it never grants.

{{if $op}}
{{end}}
{{end}}
{{end}} {{else}}

No open capability requests.

{{end}}

Temporary grants in force {{len .Data.Grants}}

{{if .Data.Grants}}{{range .Data.Grants}}{{end}}
MindCapabilityTargetAccessLimitsExpiresBy
{{index $.Data.MindNames .MindID}}{{.Capability}}{{.TargetPattern}}{{.Access}} {{if .MaxOperations}}{{.UsedOperations}} of {{deref_int .MaxOperations}} used{{else}}{{.UsedOperations}} used{{end}}{{if .ParamConstraints}} · {{range $k, $v := .ParamConstraints}}{{$k}}={{$v}} {{end}}{{end}} {{.ExpiresAt.Local.Format "02 Jan 15:04"}}{{.GrantedBy}} {{if $op}}
{{end}}
{{else}}

None. Session approvals appear on the policies page.

{{end}}

Decided recently

{{if .Data.Decided}}{{range .Data.Decided}}{{end}}
StatusMindActionByNoteWhen
{{.Status}}{{index $.Data.MindNames .MindID}}{{.Capability}} {{.Target}}{{if .Error}}
{{.Error}}
{{end}}
{{.DecisionBy}}{{.DecisionNote}}{{ago .CreatedAt}}
{{else}}

None.

{{end}}

Executions

{{if .Data.Executions}}{{range .Data.Executions}}{{end}}
MindCapabilityTargetResultms
{{index $.Data.MindNames .MindID}}{{.Capability}}{{.Target}}{{if .Error}}{{trunc .Error 80}}{{else}}{{payloadField .Result "summary"}}{{end}}{{.DurationMS}}{{if .EventID}}event{{end}}
{{else}}

None yet.

{{end}}
{{end}}