PlanResult parity

Same review contract across CLI TTY, JSON PlanResult, AutopilotProposal store, and Slack/Discord alerts — actions, risk, blast/impact, proposal id, approve hint (IC-005).

kprompt’s review contract is the same idea everywhere: see what will change, see risk, then approve — never silent mutate. Surfaces differ in density. Slack is not a full TTY diff viewer; it carries proposal id, risk, and an apply hint so an engineer who knows the CLI can approve without a glossary.

FieldCLI TTYJSON PlanResultAutopilotProposalSlack / Discord
Actions / stepsYes (ops + diff)plan.actions[]plan.summary + steps[]Summary / recommendation only
RiskYesrisk.level / deniedriskproposalRisk when attached
Blast / impactBlast radius blockblastRadius optionalexpectedImpact / why (text)Not in alert body
Proposal idN/A (laptop NL)N/AidproposalId
Approve hint[y/N] / --approverequiresApprovalproposals apply --approveproposalHint + ask approve <id>
AppliedSessionappliedapplied + decisionPre-apply alert
Verify / Learn--wait / verify UXverify optionalverifyStatus / outcome / learnNoteNot in alert

Approve vocabulary (same gate everywhere): TTY Apply this plan? [y/N] → y; CI --approve; stored proposal agent proposals apply … --approve; Slack ask approve <proposal-id> (alias apply <id>). Discord is notify-only — use the CLI hint. Risk labels: low · medium · high · denied. Alerts may show a short Impact line; that is not a full blast-radius dump. AutopilotProposal is PlanResult-shaped, not byte-identical.