Skip to content

feat(199): ship deny-by-default training egress (RFC-0003 D6) - #940

Merged
saqlainsyed007 merged 13 commits into
developfrom
feat/199-egress-default-flip
Sep 1, 2026
Merged

feat(199): ship deny-by-default training egress (RFC-0003 D6)#940
saqlainsyed007 merged 13 commits into
developfrom
feat/199-egress-default-flip

Conversation

@saqlainsyed007

@saqlainsyed007 saqlainsyed007 commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

What

Flip the shipped chart defaults to deny-by-default training egress (RFC-0003 D6):

  • egressProxy.routeWorkloads: false → true
  • networkPolicy.training.allowExternalHttps: true → false

New/upgraded installs now route training egress through the squid allowlist and drop the direct 0.0.0.0/0:443 rule. Operators opt a fleet back out with explicit routeWorkloads: false and/or allowExternalHttps: true. Chart 1.9.90 → 1.9.96.

Tests / docs

  • helm-unittest updated (egress_proxy, egress_enforcement_check, network_policy) to the new defaults, plus an opt-out (allowExternalHttps: true → count: 0) case for the enforcement hook — all 661 cases pass locally.
  • e2e-auto-upgrade.sh: path 1 (--reuse-values) now compares egress posture to the installed baseline (era-agnostic — correct whether the baseline is permissive or already deny-by-default); path 2 (--reset-then-reuse-values) expects lockdown + gateway routing on fleet auto-upgrade; paths 3–4 exercise opt-out persistence — an operator’s routeWorkloads=false + allowExternalHttps=true (both opposite the new defaults) must survive the next hourly auto-upgrade.
  • QoS/reachability goldens add t-egress-enforcement-check (the seal-check Job renders by default once lockdown is on).
  • docs/SECURITY.md (§4.2, §8.2, EKS note, changelog) and docs/SEAL-CHECK.md updated for deny-by-default rendering on a fresh install; version refs at 1.9.96.

Merge order

Per client-runtime#199, this shipped-default flip is the final step, after the egress lockdown is verified per-fleet (dev → staging → prod) via the §8.2 gated rollout. The dev fleet is flipped and verified — a real training run egressed only to allowlisted hosts (0 TCP_DENIED) and completed. Enforcement still requires a policy-enforcing CNI; non-enforcing CNIs render the rule without blocking.

Part of tracebloc/client-runtime#199 · epic tracebloc/backend#1151


Note

Medium Risk
Changes default training egress and proxy routing on new installs and fleet auto-upgrade (--reset-then-reuse-values); misconfigured or non-enforcing CNIs can break training until operators opt out or complete the §8.2 rollout.

Overview
Ships deny-by-default training egress (RFC-0003 D6 / client-runtime#199) by flipping chart 1.9.96 defaults: networkPolicy.training.allowExternalHttps false (drops the direct 0.0.0.0/0:443 egress rule on a fresh render) and egressProxy.routeWorkloads true (jobs-manager gets EGRESS_PROXY_URL by default). Operators opt a fleet back out with allowExternalHttps: true and/or routeWorkloads: false.

values.yaml, values.schema.json, and template comments are aligned; the training netpol template still uses dig true for a missing allowExternalHttps key so helm upgrade --reuse-values from older releases keeps permissive behavior.

Tests and automation invert helm-unittest expectations, add an opt-out case so egress-enforcement does not render when direct egress is re-opened, and extend e2e-auto-upgrade.sh: path 1 compares egress to the installed baseline; path 2 expects lockdown + gateway on fleet --reset-then-reuse-values; paths 3–4 verify opt-outs survive the next auto-upgrade. QoS/reachability goldens include t-egress-enforcement-check because the seal-check hook now renders by default.

Docs (SECURITY.md, SEAL-CHECK.md) describe deny-by-default on fresh install and updated EKS enforcement notes.

Reviewed by Cursor Bugbot for commit 5f07f24. Bugbot is set up for automated code reviews on this repo. Configure here.

Flip the chart defaults so new/upgraded installs are locked down out of the
box: egressProxy.routeWorkloads=true + networkPolicy.training.allowExternalHttps
=false. Training egress now flows through the squid allowlist and the direct
0.0.0.0/0:443 rule is dropped by default; set either back to opt a fleet out.

Bumps chart 1.9.90 -> 1.9.91. Updates helm-unittest suites (egress_proxy,
egress_enforcement_check) and the e2e-auto-upgrade path-2 assertions to the new
default (path-1 --reuse-values replays old computed values, unaffected). SECURITY
§8.2 status + changelog updated. All 643 helm-unittest cases pass.

Enforcement still depends on a policy-enforcing CNI and the §8.2 per-fleet
gated rollout; non-enforcing CNIs render the rule without blocking.

Part of client-runtime#199 · epic tracebloc/backend#1151
@saqlainsyed007 saqlainsyed007 self-assigned this Aug 31, 2026
…orce

The 2026-06 note said tb-client-dev-templates ran a self-managed VPC CNI
with NetworkPolicy disabled (lockdown cosmetic). Both tracebloc EKS fleets
(tb-client-dev-templates dev/staging, tracebloc-clients-prod prod) have since
moved to the managed vpc-cni add-on with enableNetworkPolicy=true, verified
via aws eks describe-addon. Egress NetworkPolicy is now enforced on both, so
the D6 deny-by-default lockdown is real there, not cosmetic.

Part of tracebloc/client-runtime#199
# Conflicts:
#	client/Chart.yaml
@saqlainsyed007
saqlainsyed007 marked this pull request as ready for review September 1, 2026 12:38
@saqlainsyed007

Copy link
Copy Markdown
Contributor Author

bugbot run

@waqaskhanroghani
waqaskhanroghani requested review from aptracebloc and removed request for saadqbal September 1, 2026 12:38
Comment thread scripts/tests/e2e-auto-upgrade.sh
…eline

Path 1 hardcoded the permissive-baseline posture (external 443 present, no
EGRESS_PROXY_URL). Once this chart is the published baseline, --reuse-values
replays deny-by-default and those asserts would false-fail. Capture the
baseline egress posture at install (like BASELINE_PROD_DIGEST) and assert
--reuse-values replays it verbatim, correct in both eras.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@saqlainsyed007

Copy link
Copy Markdown
Contributor Author

bugbot run

Comment thread client/tests/egress_enforcement_check_test.yaml
Comment thread scripts/tests/e2e-auto-upgrade.sh

@aptracebloc aptracebloc left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Verified the rendered NetworkPolicy across all four profiles (helm template --kube-version 1.30): the deny-by-default posture is correct — policyTypes: [Ingress, Egress], podSelector: tracebloc.io/workload=training, ingress: [], the 0.0.0.0/0:443 rule dropped under the new defaults, and a minimal scoped allow-list (DNS→kube-dns only, in-namespace MySQL/requests-proxy, squid gateway on 3128). No allow-all hole, no inert policy, and no legitimate training egress removed. The --reuse-values nil-guard preserves old permissive behavior for existing fleets. The security design is sound and I'd own it.

Blocking on CI reality, not on the policy — and it's a stale-branch problem:

  1. Source-of-truth drift fails. Flipping lockdown-on renders the t-egress-enforcement-check hook by default, which adds two rows to the qos-reachability golden — but scripts/tests/qos-reachability-expect.txt isn't updated. That golden landed on develop in #922 (merged today); this branch is behind it, so it never saw it. The check message even calls this out ("update the golden IN THIS PR").
  2. Version collision. This bumps Chart.yaml to 1.9.94, but #922 already bumped develop to 1.9.94. After merging develop in, re-bump to 1.9.95.
  3. docs/SECURITY.md version is wrong. It states the lockdown ships "as of 1.9.91" in several places (§4.2, §8.2, changelog); it actually ships in 1.9.94, and 1.9.91–1.9.93 released permissive. Use the real shipping version.

Fix path: merge develop into the branch, add the two t-egress-enforcement-check rows to the golden, re-bump to 1.9.95, and correct the version strings in SECURITY.md. Minor: the inverted title at tests/egress_proxy_test.yaml:217 reads "keeps … but keeps …" (assertion is correct, title is a copy-paste artifact).

One coordination check before merge: the PR body still says "⚠️ Draft — merge LAST … after the egress lockdown is verified per-fleet (dev → staging → prod)," but the PR is now marked ready. Please confirm the per-fleet §8.2 verification is complete.

— drafted with Claude Code

@waqaskhanroghani
waqaskhanroghani requested review from aptracebloc and removed request for saadqbal September 1, 2026 13:05
…goldens

Flipping allowExternalHttps=false to the chart DEFAULT makes the
egress-enforcement-check hook render by default, so its training-labelled
probe pod (t-egress-enforcement-check) now appears in every default render.
Record it: Burstable in the pod-qos class goldens (hostpath/csi/gpu-*), and
blocked/probe in the qos-reachability golden (a probe Job, never Guaranteed-
reachable). Bump chart 1.9.94 -> 1.9.95 (develop moved to 1.9.94).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@saqlainsyed007

Copy link
Copy Markdown
Contributor Author

bugbot run

Three items from review:
- SECURITY.md: the lockdown ships in 1.9.95, not 1.9.91 (1.9.91-1.9.94
  released permissive); correct A2/8.2/changelog and the < boundary (Arturo).
- egress_enforcement_check_test.yaml: add the assertion that the seal-check
  hook does NOT render when an operator opts back out (allowExternalHttps=true)
  — the coverage the inverted default-render case dropped (Bugbot).
- e2e-auto-upgrade.sh path 3/4: set allowExternalHttps=true (the opt-out,
  opposite of the new default) so path 4 genuinely tests that
  --reset-then-reuse-values preserves an operator opt-out instead of the next
  hourly auto-upgrade silently re-locking the fleet (Bugbot).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@saqlainsyed007

Copy link
Copy Markdown
Contributor Author

Addressed all three review points (qos golden, re-bump to 1.9.95, SECURITY.md version) plus the two opt-out coverage gaps. bugbot run

@cursor cursor Bot 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.

✅ Bugbot reviewed your changes and found no new issues!

Comment @cursor review or bugbot run to trigger another review on this PR

Reviewed by Cursor Bugbot for commit ecd3c4a. Configure here.

@saadqbal saadqbal left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

The drift and QoS goldens look right now — ecd3c4a fixes both, and 1.9.95 clears the collision with develop's 1.9.94. Heads-up that #951 also claims 1.9.95, so whoever lands second collides the same silent way. Four things before this lands.

client/values.schema.json never got the flip. It still declares allowExternalHttps.default: true and routeWorkloads.default: false — both inverted against values.yaml:378 and :488 — and the descriptions still read "flip per-fleet". Helm ignores schema defaults so behaviour is fine, but this is the same declared-in-two-places drift the gate just caught you on, one file over, and nothing checks it.

docs/SECURITY.md names 1.9.91 five times while the chart ships 1.9.95. The boundary claim at §8.2 — "Charts >= 1.7.0 and < 1.9.91 shipped the mechanism permissive" — is actively wrong now: 1.9.91 through 1.9.94 also shipped permissive, so an operator on 1.9.93 reads that as already locked down.

The two Mediums cursor closed on itself are both still live, and neither has a code change behind it. The enforcement-check suite has no allowExternalHttps: true case left — strip the opt-out gate out of egress-enforcement-check.yaml entirely and all 660 tests across 37 suites stay green. That's a real consequence, not a coverage nit: an opted-out fleet renders the hook and helm test fails it for being correctly reachable. One case asserting count: 0 restores it. Same story on e2e path 3 — it still --sets the two values that are now defaults, so path 4 can't tell a replayed override from a default.

Small stuff while you're in there: values.yaml:599 still says routeWorkloads "ships inert", network-policy-training.yaml:67 still describes the rule as dropping only on an explicit false "once an operator has verified", and network_policy_test.yaml:159/270 still call true the default.

Policy itself reads clean — 4 egress rules with DNS, MySQL, requests-proxy and the gateway, no 0.0.0.0/0, only the probe Job carries the training label, and it's the one NetworkPolicy in the chart so nothing unions it back open. Both flips are mutation-proof.

Syed Saqlain and others added 3 commits September 1, 2026 17:14
…fault comments

Addresses Asad review:
- values.schema.json: allowExternalHttps.default true->false, routeWorkloads
  .default false->true (were inverted vs values.yaml; helm ignores schema
  defaults but it is the same two-places drift the gate flagged), and reword
  the descriptions for deny-by-default.
- network-policy-training.yaml: the shipped default is now false; the dig TRUE
  is the legacy absent-key fallback only.
- network_policy_test.yaml: true is the opt-out now, not the default; both
  egressProxy.enabled and routeWorkloads default true.
- values.yaml: routeWorkloads no longer ships inert.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
develop advanced to 1.9.95 (backend#951), colliding with this branch. Bump
to 1.9.96 (Chart version+appVersion) and sync the SECURITY.md shipping
version refs.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@saqlainsyed007

Copy link
Copy Markdown
Contributor Author

@saadqbal all four addressed:

  1. values.schema.json — flipped `allowExternalHttps.default` true→false and `routeWorkloads.default` false→true (were inverted vs values.yaml:378/:488); reworded the descriptions for deny-by-default.
  2. SECURITY.md — the five 1.9.91 refs and the `< 1.9.91` boundary now name the real shipping version (re-bumped to 1.9.96 after develop hit 1.9.95 via fix(chart): collect the upgrade path's own logs (backend#2935) #951).
  3. Opt-out coverage (both Mediums) — added the enforcement-check `allowExternalHttps: true → count: 0` case, and e2e path 3 now sets `allowExternalHttps=true` (the opt-out, opposite of the new default) so path 4 genuinely tests override survival.
  4. Stale comments — values.yaml (routeWorkloads no longer inert), network-policy-training.yaml (default is now false; dig TRUE is the legacy absent-key fallback), network_policy_test.yaml (true is the opt-out; both egressProxy.enabled and routeWorkloads default true).

Verified: helm-unittest 661, qos-reachability 22 verdicts, pod-qos bats 19/19, helm lint clean, schema JSON valid, shellcheck clean.

bugbot run

Comment thread scripts/tests/e2e-auto-upgrade.sh Outdated
The prior opt-out fix inverted only allowExternalHttps and dropped the
EGRESS_PROXY_URL assertion, leaving routeWorkloads at the new default and
untested — an auto-upgrade that dropped or forced it would stay green. Path 3
now also sets routeWorkloads=false (a genuine override, opposite the default)
and asserts EGRESS_PROXY_URL is absent; path 4 asserts that opt-out survives
the auto-upgrade alongside allowExternalHttps=true and the canary.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@saqlainsyed007

Copy link
Copy Markdown
Contributor Author

bugbot run

@saadqbal saadqbal left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

All four of my items are fixed, and mutation-check passing is the part I care about most — both default flips are proven to fail a test if reverted. 1.9.96 clears the collision.

Restating narrowly on one thing in the same class as those four: docs/SEAL-CHECK.md:166-168 is the fleet runbook SECURITY.md §8.2 hands operators, and it now says the opposite of what the chart does — that egress-enforcement "only renders after the per-fleet lockdown flip", and that training-pod outbound :443 is "deliberately open … not sealed for egress" until then. On 1.9.96 it renders by default; that is exactly why this PR had to add t-egress-enforcement-check to five golden files. An operator on a fresh install reads that paragraph and concludes their fleet is unsealed and the check won't fire, when it renders and helm test will run it. The EKS cell at line 158 reads the same way.

Worth folding in while you're here: the new Bugbot Medium on e2e-auto-upgrade.sh is half right, and the accurate half matters. Path 2 does assert EGRESS_PROXY_URL (line 241), so a dropped routeWorkloads default would redden — contra "would stay green". But this PR flips two defaults, and paths 3-4 only exercise the opt-out replay for one of them: path 3 sets allowExternalHttps=true and never overrides routeWorkloads, so nothing proves an operator's routeWorkloads=false survives the next hourly upgrade. Given that is precisely what paths 3-4 exist to prove, covering one of the two flipped keys is the real gap.

Minor: client/templates/jobs-manager-deployment.yaml:666 still says "Inert until egressProxy.routeWorkloads=true" — that is the default now. And the PR body is stale enough to matter before this hits a promotion: it says "Chart 1.9.90 → 1.9.91" and "all 643 cases pass", describes paths 3-4 as unchanged when both were restructured, and still carries the "⚠️ Draft — merge LAST" section while the PR is marked ready. Arturo already asked about that last part, and his change-request is standing independently — his inverted test title at egress_proxy_test.yaml:217 is still unfixed.

Policy substance I'm happy with, unchanged: 4 egress rules with DNS on UDP+TCP 53, in-namespace MySQL, requests-proxy and the gateway; no 0.0.0.0/0; the default dict guards on allowExternalHttps, egressProxy.enabled, .port and routeWorkloads all hold on a --reuse-values replay; no new values keys, only flips of existing ones; and the seal-check hook is helm.sh/hook: test, so nothing new runs during an upgrade.

@cursor cursor Bot 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.

✅ Bugbot reviewed your changes and found no new issues!

Comment @cursor review or bugbot run to trigger another review on this PR

Reviewed by Cursor Bugbot for commit de406c1. Configure here.

…install

Review follow-ups (Asad + Arturo):
- SEAL-CHECK.md: the egress-enforcement caveat + EKS/AKS table cells said the
  hook only renders after a per-fleet flip; on 1.9.96 it renders by default, so
  a fresh install is sealed and helm test runs it. Reword for deny-by-default
  (opt-out is allowExternalHttps=true).
- jobs-manager-deployment.yaml: routeWorkloads defaults true now, not inert.
- egress_proxy_test.yaml: fix the inverted test title (Arturo) — the case
  renders the 443 rule AND keeps the gateway path when opted back to true.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@saqlainsyed007

Copy link
Copy Markdown
Contributor Author

Pushed 17fd4c5 + de406c1. All addressed:

  • SEAL-CHECK.md (§ runbook) — the egress-enforcement caveat and the EKS/AKS table cells no longer say it renders only after a per-fleet flip; on 1.9.96 it renders by default (a fresh install is sealed; opt-out is allowExternalHttps=true). The dated 2026-08-24 substrate note is left as the historical snapshot it is.
  • routeWorkloads coveragede406c1 already sets routeWorkloads=false in path 3 and asserts EGRESS_PROXY_URL absent in both paths 3 and 4, so both flipped defaults are now proven to survive (or be reverted-and-fail) the auto-upgrade. (Agreed path 2 already caught a dropped default via line 241 — this closes the opt-out-persistence half.)
  • jobs-manager-deployment.yaml — routeWorkloads no longer inert.
  • egress_proxy_test.yaml:217 — fixed the inverted title (@aptracebloc): renders the 443 rule AND keeps the gateway path when opted back to true.
  • PR body — 1.9.96 (not 1.9.91), 661 cases, paths 1/3-4 restructuring described, dropped the stale Draft/merge-LAST framing (kept the merge-order note).

helm-unittest 661, helm lint clean. bugbot run

@aptracebloc aptracebloc left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Re-reviewed at 50bbbc38. All three blockers from my earlier change-request are resolved:

  1. Source-of-truth driftqos-reachability-expect.txt now carries both t-egress-enforcement-check rows and the check is green.
  2. Version collision — chart re-bumped to 1.9.96 (clearing develop's 1.9.95 and #951's claim on it); the version-bump / chart-version gates pass.
  3. SECURITY.md version strings — corrected to 1.9.96 throughout, including the §8.2 boundary (≥ 1.7.0 and < 1.9.96 shipped permissive); no 1.9.91 remains (77d00e73).

The minors are addressed too: opt-out coverage is restored (egress-enforcement-check asserts count: 0 when allowExternalHttps=true), and e2e paths 1/3/4 are now baseline-derived / genuine-opt-out rather than matching the flipped defaults. The rendered policy is unchanged and correct — deny-by-default with a scoped 4-rule allowlist, no 0.0.0.0/0 hole, and the --reuse-values nil-guard preserves permissive behaviour for existing fleets.

One non-blocking nit remains: the egress_proxy_test.yaml:217 case title still reads "keeps the external 443 rule but keeps the gateway path" (copy-paste artifact — the assertion body is correct), worth a one-word fix next time you're in the file. Please also confirm the PR-body "⚠️ Draft — merge LAST / per-fleet §8.2 verification" note is satisfied before merge, now that the PR is marked ready.

My side is clear — I'll approve the moment CI is green (that clears my standing change-request). Note @saadqbal's review is independent and still stands.

— drafted with Claude Code

@saqlainsyed007

Copy link
Copy Markdown
Contributor Author

@aptracebloc thanks — both nits you flagged are already in on 17fd4c5 (newer than the 50bbbc3 you re-reviewed):

  • egress_proxy_test.yaml:217 title fixed — now "renders the external 443 rule and keeps the gateway path when allowExternalHttps is opted back to true".
  • PR body updated — dropped the ⚠️ Draft / merge-LAST framing (kept a plain "Merge order" note), corrected to 1.9.96 / 661 cases, and described the path 1/3–4 restructuring. On the §8.2 verification: the dev fleet is flipped and verified — a real training run egressed only to allowlisted hosts (0 TCP_DENIED) and completed; staging/prod follow the gated rollout post-merge.

CI is finishing on 17fd4c5 now. Appreciate the thorough passes.

@saadqbal saadqbal left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

All four of mine are properly fixed — not just reworded. SEAL-CHECK.md:166 now matches what the chart does: I checked the new caveat against the hook's actual gate in egress-enforcement-check.yaml (not (dig "allowExternalHttps" true …)), and on the 1.9.96 defaults it does render on a fresh install, with allowExternalHttps=true as the thing that un-renders it. The < 1.9.96 boundary lines up with SECURITY.md §8.2, the EKS/AKS cells no longer say "once the lockdown is flipped", and leaving the dated 2026-08-24 EKS note as-is is right — that fleet is held for its own stated reason (networkPolicy.training.enabled: false).

de406c1 closes the real gap on paths 3-4: both flipped keys are now overridden opposite the default and each asserted separately, and path 2's exact-value check on EGRESS_PROXY_URL keeps a broken helper from passing them vacuously. mutation-check green on this head is the part I wanted.

Nothing substantive left from me. To be precise about state though: I'm leaving this as a comment rather than an approval because three Prereqs distro jobs are still running, so my CHANGES_REQUESTED formally stands until I flip it — that's the pending matrix, not an outstanding ask. Ping me when they land and I'll approve.

@aptracebloc's change-request is also standing, and his inverted title is fixed in 17fd4c5, so I think that one just needs his re-review.

Tiny nit, take it or leave it: SEAL-CHECK.md:85 still uses "before the lockdown is flipped" as its example of a check that doesn't render.

The example of a check that does not render used "the egress-enforcement
probe before the lockdown is flipped" — but it renders by default on 1.9.96.
Use the current accurate example: it un-renders when an operator opts a fleet
back out with allowExternalHttps=true (Asad nit).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@saqlainsyed007

Copy link
Copy Markdown
Contributor Author

Thanks both — every point is now closed, including the optional nits:

  • @saadqbal's SEAL-CHECK.md:85 "before the lockdown is flipped" example → now uses the accurate does-not-render case (allowExternalHttps=true opt-out), 5f07f24.
  • @aptracebloc's egress_proxy_test.yaml:217 title + the PR-body Draft framing were already in 17fd4c5.

Nothing substantive outstanding from either of you. Once CI (the Prereqs/PATH persist distro matrix) goes green on the head, this is clear to approve — ping noted, and the merge driver will land it as soon as the standing change-requests flip. Appreciate the thorough passes.

@saqlainsyed007

Copy link
Copy Markdown
Contributor Author

CI is green on the head (5f07f24) — 49 checks pass, 0 failing, mutation-check included. That was the only thing either of you was waiting on.

@saadqbal @aptracebloc — clear to approve whenever you're ready; your change-requests are the only thing left on the bar. Thanks again for the thorough passes.

@saadqbal saadqbal left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

CI is fully green on 5f07f243 — 49 contexts passing, nothing failing and nothing pending, including the three Prereqs jobs I was waiting on and mutation-check. The :85 fix is right, not just reworded: I checked the new example against the hook's gate (not (dig "allowExternalHttps" true …)), and allowExternalHttps=true is genuinely what un-renders the probe, while the 1.9.96 defaults render it. Incremental diff is that one docs paragraph, +3/-3, nothing else.

To be precise about state, since two change-requests are standing and only one of them is real:

  • Mine is satisfied. Nothing substantive is left from me and CI has met the condition I named last pass. I'm not converting it to an approval only because @aptracebloc's CHANGES_REQUESTED is still live, and I don't approve over another reviewer's standing block. The moment his clears, mine does too.
  • @aptracebloc — you said at 13:48 you'd approve once CI went green. It's green now, and your inverted title at egress_proxy_test.yaml:217 went in with 17fd4c5. Your §8.2 question is the one genuinely open item: the body claims dev flipped and verified (0 TCP_DENIED on a real training run) but makes no claim for staging or prod. Your call whether that's enough to ship on.

@aptracebloc aptracebloc left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Re-verified at 5f07f24: all three of my original blockers remain resolved — the Source-of-truth drift golden carries the t-egress-enforcement-check rows (check green), Chart.yaml is coherent at 1.9.96, and the docs/SECURITY.md version strings are all 1.9.96 with no 1.9.91 — and the cosmetic egress_proxy_test.yaml:217 title artifact is fixed. The rendered policy is correct: deny-by-default with a scoped 4-rule allowlist, no 0.0.0.0/0 hole, and the --reuse-values nil-guard preserves permissive behaviour for existing fleets.

CI is green and there are no open Bugbot or review threads. Approving.

@saadqbal's review is independent and still stands.

— drafted with Claude Code

@saqlainsyed007

Copy link
Copy Markdown
Contributor Author

@saadqbal@aptracebloc just approved, so his CHANGES_REQUESTED is cleared. That was the only reason you were holding your own conversion. Everything else is green: reviewDecision will flip to APPROVED the moment you convert yours, CI is 49-pass / 0-failing, 0 unresolved threads. Clear to approve whenever you're ready — thanks!

@saadqbal saadqbal left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Arturo's approval is in and CI is green on 5f07f243, so converting my change-request as promised. Everything I raised across the four rounds is closed and verified — the runbook now matches the hook's real gating expression, paths 3-4 prove the opt-out survives an auto-upgrade for both flipped keys, and mutation-check green means neither default flip is decorative.

Nice work on this one. Ship it once you're happy with the §8.2 rollout position.

@saqlainsyed007
saqlainsyed007 merged commit c23646b into develop Sep 1, 2026
58 checks passed
@saqlainsyed007
saqlainsyed007 deleted the feat/199-egress-default-flip branch September 1, 2026 14:24
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.

3 participants