mirror of
https://github.com/rcourtman/Pulse.git
synced 2026-09-21 10:43:36 +00:00
a597321801
Closes the read-after-write piece of the user's act-with-control loop: "Act with control: ask for approval, execute through Pulse tools, then verify." Until now Pulse authored verification narrative copy at approval time but never actually executed the check. Adds ActionVerificationResult to internal/unifiedresources/actions.go and embeds it as ExecutionResult.Verification so the existing result_json column persists the outcome without a schema migration. The struct records: did the check run, what command did Pulse send, what came back, did it succeed, when, and any failure note. Adds VerificationCommandForCommand in tools_control.go that derives the per-class read-after-write check used by the broker: - service-restart / service-start / service-reload / service-stop → systemctl is-active <unit> Container classes (container-restart, container-stop) are intentionally deferred to pulse_docker's existing tool-level docker inspect verification — adding a broker-level dispatch would double-run the same check. executeCommandWithAudit now runs the derived verification command via the same agent path immediately after a successful dispatch, captures output and exit code, and writes the result onto ExecutionResult.Verification before recordActionExecutionResult persists. If the check returns non-zero, Verification.Success=false with a Note explaining the exit code so the audit history honestly shows that Pulse ran the action but couldn't confirm it took. Verification is best-effort and class-scoped: unknown command shapes leave Verification nil rather than fabricating a verified=true entry, matching the no-fabrication boundary from Impact / preflight authoring. Tests cover: - VerificationCommandForCommand derives the right check per class, shell-escapes single quotes in unit names, and returns "", false for docker (deferred) and unknown commands. - TestExecuteCommandWithAuditRunsClassDerivedVerificationAfterDispatch - TestExecuteCommandWithAuditMarksVerificationFailedWhenReadbackDoesNotConfirm - TestExecuteCommandWithAuditSkipsVerificationForUnclassifiedCommands Updates ai-runtime contract with the read-after-write rule and container-class deferral. Adds Completion Obligation #21 to unified-resources pinning ExecutionResult.Verification shape and the no-fabrication boundary. Extends TestActionExecutionContractStaysAPIOwned to pin ActionVerificationResult struct and the Verification field on ExecutionResult.