dc084d5a82
Construct security.FirewallRef early in main() and Set it immediately after security.NewFirewall returns. Wrap every provider that may be called outside engine.buildRequest(): - primary provider arm (limitedProvider) - discovered local models (RegisterDiscoveredModels factory) - CLI agent arms (subprocprov.New) - background-discovery factory (StartDiscoveryLoop) - SLM arm + classifier transport - summarizer (gnomactx.NewSummarizeStrategy) routerStreamer and hook PromptExecutor inherit redaction automatically once every router arm is wrapped — they dispatch through router.Stream → arm.Provider.Stream. engine.Config.Provider stays raw because the engine still scans inline at buildRequest(); per the Wave 1 plan, removing that scan is deferred one release as belt-and-suspenders. Integration tests in internal/security/integration_test.go verify the boundary end-to-end: a router arm wrapped with WrapProvider redacts an 'sk-ant-...' literal before the inner provider sees it, and the pre-Set / post-Set transition works as documented (pass-through until the FirewallRef has a Firewall installed).