Skip to content

docs: correct the v0.2 egress guard, exit code and limits wording - #6

Merged
ETWOYA merged 1 commit into
mainfrom
docs/v0.2-accuracy
Oct 13, 2026
Merged

ETWOYA merged 1 commit into
mainfrom
docs/v0.2-accuracy

Conversation

@dankoverride

Copy link
Copy Markdown
Collaborator

This is a review of the v0.2 docs from #5 against the v0.2.0 code, made after #5 merged. Those edits shipped without a docs gate pass. The gate found three statements that were false for v0.2.0, plus a rendering break.

Corrections

  • Egress guard and proxies. The docs said a hostname that resolves to a metadata address "is refused too". That holds only without a proxy.
    • With HTTP_PROXY or HTTPS_PROXY set, the HTTP transport connects to the proxy, so guardEgress checks the proxy's address, never the target's (internal/probe/probe.go:92-93).
    • gRPC health checks bypass the proxy and are guarded: grpc-go skips the proxy resolver when a custom dialer is set.
    • The guard now has its own section, with its exact scope. It isn't general SSRF protection: loopback and private ranges are allowed, the OTLP exporter isn't covered, the metadata list isn't exhaustive, and on Windows the unspecified address becomes loopback before the guard runs.
  • Exit code 0. It means no call was unanswered, not "every call was answered". Calls skipped by -max-in-flight leave the exit code at 0 (cmd/parallax/main.go:175-181). With the default 20 calls/s and 5 s timeout, slow but healthy targets can exceed 64 in flight. The docs now tell CI to fail when the pass line reports skipped above 0.
  • A broken manifest table. The Hard limits paragraph sat between table rows, so the run.allow / run.deny row rendered as raw pipes. That row is the only place "deny always wins" is stated.
  • Smaller corrections:
    • detail is cut to 512 bytes, then ....
    • A baseURL fragment is rejected.
    • Dry-run exit 2 also covers the hard limits.
    • Skipped result lines are documented: empty traceId, no probe span, and counted in calls.
    • The -allow-link-local link now points to the guard section.
    • The Hub page now says "Paced and bounded" and gives the 1 to 4096 range.

Engine issues (for the engine owner, not changed here)

  1. Egress guard bypass through an HTTP proxy. Above, a probe to 169.254.169.254 is sent to the proxy, and the proxy decides. If the guard is meant to hold with a proxy, it has to check the target before proxying.
  2. An empty fragment passes validation. With baseURL: http://svc#, manifest.go:256 special-cases only a trailing ?, so # passes and every route then probes /.

Verification

  • Passed the C2 docs gate (Steelman, Constitutional, Devil's Advocate, then LLM-as-Judge): README 0.93, DOCKERHUB.md 0.92, no Critical findings. The gate verified the gRPC proxy bypass against the grpc-go v1.84.0 source.
  • The CI glyph guard is clean.

After merge

Re-paste DOCKERHUB.md onto Docker Hub, from the # Parallax line down.

🤖 Generated with Claude Code

Post-merge review of the v0.2 docs against the v0.2.0 code.

- Egress guard: its own section with its exact scope. With HTTP_PROXY or
  HTTPS_PROXY set, Parallax connects to the proxy, so the guard checks the
  proxy's address, not the target's; the docs said a hostname resolving to
  a metadata address is always refused. gRPC health ignores the proxy and
  stays guarded. Not general SSRF protection: loopback and private ranges
  are allowed, the OTLP exporter is not covered, and the metadata list is
  not exhaustive.
- Exit 0 means no call was unanswered, not that every call was answered:
  calls skipped by -max-in-flight do not change the exit code. CI should
  fail on skipped above 0.
- The Hard limits paragraph had split the manifest table, so the
  run.allow / run.deny row (deny always wins) rendered as raw text.
- Smaller corrections: detail is cut to 512 bytes then "...", a baseURL
  fragment is rejected, dry-run exit 2 includes the hard limits, skipped
  result lines documented, the -allow-link-local link target fixed.

Passed the C2 docs gate: README 0.93, DOCKERHUB.md 0.92, no Critical.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@dankoverride
dankoverride requested a review from ETWOYA as a code owner October 11, 2026 02:43
@ETWOYA
ETWOYA merged commit 8d14177 into main Oct 13, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

2 participants