Vertical-slice (per kasapi-cli-vertical-slice SKILL) for the mailforward write endpoints. Subset of #13.
KAS actions in scope
add_mailforward
update_mailforward
delete_mailforward
Notes
Acceptance
Status (codebase verified against main @ 1b56d1a, 2026-05-17)
Mail-forward write slice landed in PR #167 and merged to main via signed FF-push (61ff693..1b56d1a). delete and update are gated by the #109 confirmation prompt (update_mailforward replaces the full target list and is irreversible); add is reversible and not prompted. All three honour --dry-run (#132) and emit a #131 audit record, via the shared cli.runWriteE runner and the new non-gated cli.ResolveWrite. As the first concrete #13 write endpoint this also satisfied and closed the deferred end-to-end boxes of #109 / #131 / #132 (same commit).
Parent: #13
Vertical-slice (per
kasapi-cli-vertical-sliceSKILL) for the mailforward write endpoints. Subset of #13.KAS actions in scope
add_mailforwardupdate_mailforwarddelete_mailforwardNotes
testdata/mailforward/(PR test: restructure KAS API fixtures into per-package folders #22).delete_mailforwardis destructive — depends on the confirmation infrastructure in feat(cli): destructive-write confirmation infrastructure (--yes / interactive prompt) #109.get_mailforwardsis already wired.Acceptance
internal/mailforward/— PR feat(mail): mailforward write endpoints — add / update / delete #167 (write.go:Add/Update/Delete+AddParams/UpdateParams/DeleteParams, single-source-of-truth param builders;ErrUnexpectedReturnStringcontract sentinel).*Clientwrite methods + per-packageCallerinterface tests — PR feat(mail): mailforward write endpoints — add / update / delete #167 (reuses the sharedkasread.Caller;write_test.gocovers success against the real fixtures, validation, theReturnString!="TRUE"contract, error propagation, and a fault-fixture↔contract test).mail forwardstree ininternal/cli/mail.go(add/update/delete), not a separateinternal/cli/mailforward.goas the issue text predated the consolidation of the forwards tree intomail.go; registered via the existingcli.NewMailCmdincmd/kasapi-cli/main.go(nomain.gochange needed).make docsregenerated and committed — PR feat(mail): mailforward write endpoints — add / update / delete #167 (3 new + 4 updateddocs/cli/pages).### Addedentry — PR feat(mail): mailforward write endpoints — add / update / delete #167.Closes #<n>— PR feat(mail): mailforward write endpoints — add / update / delete #167 (Closes #115, merged1b56d1a).Status (codebase verified against
main@1b56d1a, 2026-05-17)Mail-forward write slice landed in PR #167 and merged to
mainvia signed FF-push (61ff693..1b56d1a).deleteandupdateare gated by the #109 confirmation prompt (update_mailforwardreplaces the full target list and is irreversible);addis reversible and not prompted. All three honour--dry-run(#132) and emit a #131 audit record, via the sharedcli.runWriteErunner and the new non-gatedcli.ResolveWrite. As the first concrete #13 write endpoint this also satisfied and closed the deferred end-to-end boxes of #109 / #131 / #132 (same commit).Parent: #13