c699c139b4c74b1f6efe6c83ee0e12e3cfd4349e
V-575. Nexus and Praxis were the same JSON transport written twice. ecosystemHTTP holds the base URL, token, client, service name and version header, and exposes setHeaders, call, getJSON and postJSON. Both clients embed it, so Resolve, Health and the four lifecycle posts are one or two lines each. setEcosystemHeaders became a method reading req.Context(), which is the same value with no way to pass a context the request never carried. Three degrade paths repeated the same rule: unauthorized means EcoDenied, anything else means EcoDown, and name the service. That is ecosystemGap now. The failed Nexus resolve was traced identically in two places, so nexusResolveFailed holds it and keeps the rune-count redaction. The surface-a-spoken-item block was written twice and is now surfaceSpoken, which calls Surface and nothing else. Every lifecycle verb call site is untouched. Surface is still Surface. So are the confirm and risk tier gate, scopedToEntity's refusal to relabel an unscoped response, attentionCannotTell's hedge rules, and the demonstrative rules in resolveSurfacedPosition. One shape did change: a malformed Nexus base URL used to return a plain wrapped error and now returns an ecosystemError like every other failure on that path. No test exercises it and every caller already treats a non-nil error as a dependency failure.
Description
No description provided
Languages
Go
97.1%
HTML
0.9%
Shell
0.6%
CSS
0.5%
Makefile
0.3%
Other
0.6%