Skip to content

feat: enforce Signal live dry-run boundary - #22

Merged
intel352 merged 1 commit into
mainfrom
feat/service-live-dryrun
Jul 3, 2026
Merged

intel352 merged 1 commit into
mainfrom
feat/service-live-dryrun

Conversation

@intel352

@intel352 intel352 commented Jul 3, 2026

Copy link
Copy Markdown
Contributor

Summary

  • harden step.signal_service_live_submit so live mode never constructs fake/sandbox transport or egresses
  • add approval_ready and egress_dry_run to ServiceSubmitOutput
  • bump libsignal-service-go to v0.6.0 and release metadata to v0.14.0
  • add pipeline validation fixture for the live dry-run approval boundary

TDD regression proof

With fix reverted:
go test ./internal -run 'ServiceLiveSubmitLiveRequiresDryRunEvenWithApproval|ServiceLiveSubmitLiveDryRunDoesNotUseTransport' -count=1
failed with statuses accepted instead of denied / dry_run_accepted.

With fix restored:
go test ./internal -run 'ServiceLiveSubmitLiveRequiresDryRunEvenWithApproval|ServiceLiveSubmitLiveDryRunDoesNotUseTransport' -count=1 passed.

Verification

  • go test ./... -count=1
  • make pipeline-test
  • .wfctl/bin/wfctl plugin validate-contract --for-publish --tag v0.14.0 .
  • goreleaser check
  • git diff --check HEAD~1..HEAD

Copilot AI review requested due to automatic review settings July 3, 2026 13:23
@intel352
intel352 merged commit 1df40a0 into main Jul 3, 2026
4 checks passed
@intel352
intel352 deleted the feat/service-live-dryrun branch July 3, 2026 13:25

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR hardens the step.signal_service_live_submit “live” execution path to ensure it never constructs a fake/sandbox transport or attempts egress, while returning richer machine-readable outputs to distinguish “approval complete but dry-run required” vs “dry-run accepted”.

Changes:

  • Enforce a strict live-mode preflight boundary in ExecuteSignalServiceLiveSubmit, returning either denied (with approval_ready/egress_dry_run flags) or dry_run_accepted without building transport.
  • Extend ServiceSubmitOutput with approval_ready and egress_dry_run, update docs, and add regression tests + a validated pipeline fixture.
  • Bump release/plugin metadata to v0.14.0 and upgrade libsignal-service-go to v0.6.0.

Reviewed changes

Copilot reviewed 10 out of 12 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
testdata/pipelines/signal-service-dryrun.yaml Adds a pipeline fixture validating the live dry-run approval boundary and new output fields.
scripts/run-pipeline-tests.sh Ensures the new pipeline fixture is validated in make pipeline-test.
README.md Documents the new live-mode outcomes (approval_ready, egress_dry_run, dry_run_accepted) and the no-transport guarantee.
plugin.json Bumps plugin version and download URLs to v0.14.0.
Makefile Updates VERSION default to 0.14.0.
internal/service_transport.go Implements live-mode preflight and populates new output flags.
internal/service_transport_test.go Adds regression tests ensuring live mode denies/accepts correctly without transport/egress.
internal/provider_contracts_test.go Updates dependency pin assertion to libsignal-service-go v0.6.0.
internal/contracts/signal.proto Adds approval_ready and egress_dry_run to ServiceSubmitOutput.
internal/contracts/signal.pb.go Regenerates protobuf bindings for the new output fields.
go.mod Bumps github.com/GoCodeAlone/libsignal-service-go to v0.6.0.
go.sum Updates checksums for the dependency bump.
Files not reviewed (1)
  • internal/contracts/signal.pb.go: Generated file

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +284 to +287
report := servicepolicy.ValidateApprovalPackage(transportCfg.ApprovalPackage, time.Now().UTC(), operationActions(operation))
if !report.LiveAllowed {
return deniedSubmitResultWithReport(cfg, in, report.DeniedReasons, false, transportCfg.ApprovalPackage.EgressPolicy.DryRun, string(serviceclient.TransportModeLive))
}
Comment on lines +316 to +318
if len(reasons) == 0 {
reasons = servicepolicy.ValidateApprovalPackage(approvalPackageFromContract(approval), time.Now().UTC(), operationActions(in.GetOperation())).DeniedReasons
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants