Repository navigation
fix: make code defaults match the values deployments run - #1305
Conversation
…gin image allowlist
|
Took a deep pass through this one. Overall it's really solid work: one item per commit, the fail-before/pass-after table holds up, and P3-1, P3-2, P3-4, P3-6, P3-8, P3-10 and the Q-LM here-string fix all check out. The one real problem is in P3-3 (Host workspace StorageClass): the omitted 🔴 Not ready to approve
This is my read from the review, not a formal GH approval. Must resolve before approval
Optional (non-blocking)You can merge without these. They're follow-ups or your call.
What checked out clean
|
With CONTEXT_MAPPER_HOST_WORKSPACE_STORAGE_CLASS unset, buildPvc omits storageClassName. The live claim still has one: the DefaultStorageClass admission plugin sets it on create, older claims keep do-block-storage-retain, and the PV controller can assign a default later. The apiserver allows only nil -> class on a PVC update, so the replace that ensurePvc sends to every unbound claim was rejected as an immutable spec change on each reconcile, and the Host stayed not ready. When no class is configured, the replace now carries the class already set on the live claim. A configured class is unchanged. Tests: an unbound claim shaped like the apiserver returns it after admission (class set, Pending, no volumeName) must converge and the replace body must keep its class; an explicit "" class must stay on the built claim. The release note now says how existing claims keep their class. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
host-layout-merge.sh now treats an unset CONTEXT_MAPPER_HOST_IMAGE_PULL_SECRET as no pull Secret, but inventory runs before the upgrade, against an HCC whose default is still clerum. A check Pod for an orphan claim or a Host without a Deployment takes its pull Secret from that variable, so on a registry that needs clerum it cannot pull the image and the PVC reports UNREADABLE. The layout runbook and the release note now say to set the variable to clerum on HCC before inventory when the Host image needs that Secret. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Set HCC_EXTERNAL_EGRESS_OVERLAP_SEC=3600 and the WRC accumulator knobs (WRC_EXTERNAL_EGRESS_OVERLAP_SECONDS=3600, WRC_EXTERNAL_EGRESS_MAX_ENTRIES=256) explicitly in deploy/base so the production values are reviewable instead of arriving from the code defaults changed in this release. The minikube overlay adds env entries through strategic-merge patches and does not override these keys, so it renders the same values. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
R1-L5: list what CONTEXT_MAPPER_RUNTIME_NAMESPACES, CONTEXT_MAPPER_MINIMAL_INFRA_NAMESPACES, and WORKFLOW_APPROVAL_READER_ENABLED_MEDIA defaulted to before this release, so an operator who deleted one of them knows what changed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
R1-L6: the reader's code default and the shipped manifests both include teams, so the troubleshooting note no longer points at a telegram,slack default that no longer exists. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
R1-L7: when CONTEXT_MAPPER_MINIMAL_INFRA_NAMESPACES is absent from the rendered HCC Deployment, derive sandbox-ui like the code default instead of treating it as an empty list. An explicit value, including "", still overrides the default, so the preflight no longer expects K8s API egress from a namespace HCC does not grant it to. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
R1-L8: WRC's DEFAULT_EXTERNAL_EGRESS_MAX_ENTRIES is now 256, so the independent oracle accepts policies with up to 256 accumulated entries instead of rejecting 129-256 as INVALID_PROVENANCE_LIST. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
R1-L10: add the { name } fixture, which is how an apiserver read returns an env
var whose value is empty, alongside the hand-written { name, value: '' } form.
Both resolve to no pull Secret.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
R1-L11: import the env-less config and assert that config.allowedPluginImagePrefixes equals DEFAULT_ALLOWED_PLUGIN_IMAGE_PREFIXES after the split/trim/filter, as the HCC test already does. A second case covers the override parsing. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
@zach88 thanks for the deep pass. The blocker and every optional item are addressed on BlockerR1-H1 — unbound PVC replace drops OptionalR1-M1 — R1-L1 — body: the minikube overlay does pick up P3-8 — fixed in the body: P3-8 changes the overlay's effective values too (300 s → 3600 s, 128 → 256). R1-L2 — "existing PVCs are not touched" — agreed, HCC does try the replace. The release note and body now say bound claims are skipped and an unbound claim keeps the class already set on it; the R1-H1 test pins it. R1-L3 — builder test for explicit R1-L4 — P3-8 not declared in R1-L5 — old values in the release note — added ( R1-L6 — R1-L7 — R1-L8 — R1-L9 — Q-LM exit 2 wording — fixed in the body: on the base the R1-L10 — layout test fixture shape — added ( R1-L11 — control-api parsed allowlist default — added ( Verification on
|
The unbound-claim converge replaced the live PVC with the body buildPvc returns, which carries only HCC's name, namespace and labels. The PUT therefore dropped what other controllers had written on the Pending claim: the scheduler's volume.kubernetes.io/selected-node, the provisioner annotations and the kubernetes.io/pvc-protection finalizer. With no class configured the cluster default (WaitForFirstConsumer on GKE) reaches this path. Copy the live annotations and finalizers into the replace body. Labels stay HCC-authoritative. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
np-enforce-preflight.sh read CONTEXT_MAPPER_RUNTIME_NAMESPACES from the rendered HCC Deployment and turned an absent entry, a valueFrom entry and a missing Deployment into an empty list. HCC uses its code default in the absent case, and the empty list replaced the script's own namespace list, so the K8s API and RBAC-label checks for the runtime namespaces were skipped and still reported as passed. Move the derivation into deploy/scripts/np-preflight-inventory.rb. It selects the host-context-controller container by name, applies HCC's code defaults for absent entries, and refuses a valueFrom entry, an absent entry on a container with envFrom, and a render without the HCC Deployment. A refusal reaches the script's existing "failed to derive" exit 2. Renders that set both variables literally produce the same inventory as before. scripts/tests/test-np-preflight-inventory.sh covers seven cases, including a drift check of the helper's defaults against host-context-controller/src/config.ts, and runs in the shell job. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… bound The WRC egress degradation E2E bounds its autonomous-recovery wait by the stored DNS window and refuses a window above 10 minutes with DNS_WINDOW_EXCEEDS_GATE_RECOVERY_BUDGET. The minikube profile used to run WRC on its 300 s code default; with the new deploy/base entry it rendered 3600 s, so the lane refused on every run. Pin WRC_EXTERNAL_EGRESS_OVERLAP_SECONDS=300 in the minikube overlay, which the ghcr and no-uis overlays inherit. deploy/base and production keep 3600. Name the gate's recovery cap, slack and DNS fixture TTL, and export them with maxSupportedExternalEgressOverlapSeconds() (505 s), without changing the gate's behaviour. The new render-contract test scripts/tests/test-wrc-egress-gate-overlap-render.sh checks every minikube overlay against that bound, with a 3600 s negative control, and runs in the deploy-manifest job. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
git diff --name-only quotes a path with a non-ASCII character or a double quote, and the quote hid the path's service, so a commit adding control-api/src/café.ts passed with no bump. The check now reads the list with -z. The hook still skips such a path, so the doc tells the author to set the version by hand, as for a file moved out of a service. No tracked path, now or in dev's history, has either character. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A failure quotes versions from package.json, and the runner reads each line starting with :: as a workflow command, so a version holding a newline printed a second command. The check now escapes %, CR and LF in the message, as the runner decodes them. The test sets such a version and counts one command. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The pin refused any key on the Repo hygiene job beyond name, runs-on and steps, and any checkout input beyond fetch-depth, so adding permissions, timeout-minutes or persist-credentials: false turned the required check red. None of the three can skip a step or turn the job green, so the pin now allows them. if, needs, continue-on-error, strategy and a checkout ref stay refused. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
CONTRIBUTING.md said the CI validators would catch what a bypassed hook missed, without saying that the required check then blocks the pull request or how to clear it. Replayed over dev's 350 first-parent merges, the check fails 65, and every one of its 94 stayed-at pairs is a pull request that never bumped. Both documents now name that failure and its two fixes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The bound test rebuilt the window WRC stores as now + (overlap + TTL) * 1000, a copy of packages/network-policy-core's formula. A TTL floor or a new clamp in the core would have left the 505 s bound green while the gate refused it. The test now asks reconcileEgressState for the entry's expiresAt. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…on check A test file under packages/jwt-key-policy/ now counts in neither mode, where the default mode used to count it. The probe pins that agreement. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
@zach88 round 5 handled, on Must resolve
Optional, all closed
I left the Verification on
CI: 60/60 green on this head. One job, Ready for another look, please. |
|
Took another pass on 🟡 Approve with nits
This is my read from the review, not a formal GH approval. The version check and its test now have three Must resolve before approvalNothing open here. Optional (non-blocking)You can merge without these. Follow-up or your call.
Tiny one, not numbered: What checked out clean
|
Round 6 review of #1305: - R6-L6: the release note says a fresh install that does not use deploy/base and leaves CONTEXT_MAPPER_RUNTIME_NAMESPACES unset gets no deny-all-mcp-host from HCC, and how to add one. - R6-L7: the version-check doc names every path git would quote, not only non-ASCII characters and double quotes. - R6-L5: the WRC bound test's observation drops `protocol`, which the accumulator never emits. - Restore the blank line between two ci-public.yml steps lost in the dev merge. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…/base The previous commit told operators to apply deploy/base/mcp-host/networkpolicies.yaml. Outside deploy/base that file's mcp-host policy has no egress exceptions and opens 443 and 80 to 0.0.0.0/0. Say to create only the deny-all policy, and that listing mcp-host in CONTEXT_MAPPER_RUNTIME_NAMESPACES is not a way to get it. Name control characters in general among the paths git quotes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
bf79963 told such an install to create only deny-all-mcp-host. That policy selects every pod in both directions, so without the allow policies it also cuts DNS for mcp-host. Under the old runtime default HCC wrote deny-all, DNS, HCC API and Kubernetes API egress there. State that the install gets none of them and point to the set deploy/base applies, with the patch its mcp-host policy needs. Also: git quotes non-ASCII characters only with its default core.quotePath, and the paragraph no longer breaks mid-sentence. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
@zach88 thanks for round 6. Handled on Fixed here
Follow-up issue
Verification on
CI: 60/60 green on this head. Nothing is open from round 6 on my side. If this matches your read, could you approve? |
|
Review pass on What happens. The infra CI job Repro. I replayed that job's assemble, render and contract steps against infra
Impact. Once this merges, that job goes red on every infra PR, every push to infra Ordering. The infra job renders
Dropping the entries from |
|
Took another pass on 🔴 Not ready to approve
This is my read from the review, not a formal GH approval. Must resolve before approval
Optional (non-blocking)These can merge as they are. Follow-up or your call.
Small nit, no need to track: the What checked out clean
|
|
@jozer-rami thanks, confirmed. Replaying that job's assemble, render and contract steps against infra
|
|
@zach88 on R7-H1: this is the merge order, and the infra change is ready for you to test before this PR merges.
Since the head you tested, that PR added a test that pins the accepted minikube values and a comment that states what the contract's env walker checks and what it does not see. The contract logic did not change. Its cases run 12/12 with |
a925bbd replaced the warning about this file with a note about its egress exceptions. Applied as is, the mcp-host policy in deploy/base/mcp-host/networkpolicies.yaml opens 443 and 80 to 0.0.0.0/0 with an empty except list; deploy/base fills that list through a replacements entry, not a patch. Restore the warning, say how to apply the file, and say that allow-k8s-api-egress-mcp-host ships with an example IP. Also name the four namespace-wide baseline policies: HCC still writes the context-allow and per-Host policies in mcp-host. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
@zach88 thanks for round 7. R7-L1 and R7-L2 are fixed in
Could you take a closing look and approve if nothing else is open? |
jozer-rami
left a comment
There was a problem hiding this comment.
Approving b0a64e495, on one condition: merge the infra repo's contract PR (461eebb) before this one. If this one merges first, the infra repo's assembled-overlay-contract job goes red.
The major from my earlier comment is fixed.
-
"Follow-ups after the release" now gives the merge order instead of "No infra edit is required".
-
I re-ran the infra contract against this repo before and after the PR:
this repo infra maininfra PR 461eebbdevd02fcb9f1exit 0 exit 0 this head b0a64e495exit 1 (the three leakederrors)exit 0 -
The infra PR's test cases pass 12/12. The new check is tight: it rejects a wrong value, an unquoted value, a duplicate, and the value on another container.
-
devhasn't moved, so this head is still the tree after the merge.
Before merging: Build / test / typecheck (desktop-app) failed on b0a64e495 in FilesPage.seedLocation.test.tsx, the flake tracked in #1416. a925bbd76..b0a64e495 changes only a doc, so a re-run should clear it.
Non-blocking. These can go in a small commit or a follow-up:
- "Effect per consumer" leaves out managed tenants. The tenant stack builds its own WRC ConfigMap and sets neither WRC egress variable, while tenant HCC already runs
HCC_EXTERNAL_EGRESS_OVERLAP_SEC=3600. Once a release with this PR reaches tenants, their WRC moves from 300 s / 128 entries to 3600 s / 256. That is probably what you want, since it matches WRC to HCC. Still, it changes tenant egress, and neither the body nor the release note mentions it. - The release note understates the egress window.
docs/deploy/releases-and-upgrades.md:351says a rotated-out IP "stays allowed for at most that hour". The code (packages/network-policy-core/index.cjs:289) computesexpiresAt = now + min(ttl, 24h) + overlap, so the upper bound is the record's TTL, capped at 24 h, plus the hour. The body's "after its DNS TTL for up to one hour" is right. - The
stayed atremedy blames skipped hooks only.docs/deploy/releases-and-upgrades.md:79-82andCONTRIBUTING.md:90-96give a commit made without the hook as the usual cause. The hook also skips the bump when the staged version differs from HEAD (scripts/precommit/bump-staged-package-versions.mjs:203), and resolving adevmerge can leave a branch in that state (#1166). Both docs should name that cause and link #1166, because the check now covers every service. - No replace-path test for a configured
""StorageClass. The only configured-""case is the builder test. In a mutation run, changing the guard athost-context-controller/src/hostReconciler.ts:4141from=== undefinedto!config.hostWorkspaceStorageClassNamekept the HCC suite green. With that change, HCC copies the live class over an operator's explicit"". A test beside the #1310 case, with""configured andstandard-rwolive, should expectstorageClassName === ''. - The control-api and WAR parity tests read only the ConfigMap.
control-api/test/config.deployBaseDefaults.test.ts:11-18andworkflow-approval-request-reader/test/config.deployBaseDefaults.test.ts:19-22stay green if thedeploy/baseDeployment gains anenventry, which overridesenvFrom. The HCC test's extra assertions would close that gap:envFromreferences the ConfigMap, and noenventry names the variable.
…aults * origin/dev: ci: gate React bundled inside next, lockfile advisories and Next.js images fix(deps): upgrade Next.js 16.3.5 -> 16.4.6 in control-ui and profile-ui
deploy/base sets CONTROL_API_PROXY_TIMEOUT_MS to 300000 and every deployment inherits it, while the route handler defaulted to 30000. A control-ui that runs without the variable, or with a value the handler rejects, cut body-bearing proxy calls at 30 s. The default is now 300000. The fallback for an absent, non-integer, non-positive or out-of-range value uses the same constant, so it moves too. The browser's own 30 s request limit is unchanged. Tests: a new case reads the deploy/base value and checks the route arms the timeout with it when the variable is unset; the override case now uses 45000 so it still proves the variable is read. Reverting the constant to 30000 fails both default cases. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Review of acf5d49. The control-ui README and the control-api gfsc timeout comment still gave the old 30 s route default. The release note and docs/surfaces/control-ui.md now say the timeout covers every method except GET and HEAD, that GFS upload-v2 parts use their own timeout, and that values above 2147483647 also fall back to the default. The GET case of the proxy route test now asserts the request was proxied, so its "no timeout" assertion cannot pass on a skipped path, and it sets a value different from the default. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…aults dev b6db9c2 raised the sharp override to 0.35.5 in control-ui and profile-ui. The only conflict was the control-ui version line: this branch had 0.1.764 and dev 0.1.763. The merged control-ui takes dev's package.json and lock and sets 0.1.765, above both parents. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
@jozer-rami @zach88 every precondition for this PR is met. Could you take a last look and approve?
|
Summary
Seven code defaults disagreed with the values
deploy/baseor the overlays set,and one shell check was fail-open. This PR makes each code default equal the
value
deploy/basesets, or removes a value that is valid on one provider only, apart from P3-4, whosedefault is the
deploy/baselist plus one registry (see below the table). For P3-8 thedeploy/basevalueis new in this PR: the in-repo renders ran the old code default, so they change (see
"Effect per consumer"). Most items have a main commit and one or more follow-ups from review; no new environment variable.
562d2e480, the PR's first base)clerumimagePullSecrets)host-context-controller/src/config.ts:708,755(5d663a496); second copy atdeploy/scripts/host-layout-merge.sh:457(a4c1b1c3b)host-layout-merge.sh)deploy/scripts/host-layout-merge.sh:503here-string discards thediestatus (a4c1b1c3b)mcp-server,mcp-host,sandbox-recipes,rpc-proxy/''mcp-server,sandbox-recipes,rpc-proxy,sandbox-ui/sandbox-uihost-context-controller/src/config.ts:656-659,672(5d663a496)do-block-storage-retainstorageClassName(an explicit""is kept)host-context-controller/src/config.ts:712-715,hostReconciler.ts:3072(5d663a496)@clerum/image-policy)us-central1-docker.pkg.dev/your-gcp-project/clerum/,registry.evenfire.ai/,mongodb/,mcr.microsoft.com/,clerum/ghcr.io/evenfire-ai/,mongodb/,mcr.microsoft.com/,clerum/,registry.evenfire.ai/packages/image-policy/index.cjs:53-59(cc86e5b6f,106efe7c4)WORKFLOW_APPROVAL_MAX_TTL_SEC(control-api)604800172800control-api/src/config.ts:887(5d663a496)300/1283600/256workflow-recipes/src/config.ts:129,138(1ac021146);host-context-controller/src/config.ts:867(17eb4d5b9)WORKFLOW_APPROVAL_READER_ENABLED_MEDIA(WAR)telegram,slacktelegram,slack,teamsworkflow-approval-request-reader/src/config.ts:83(5d663a496);404960c73addedteamsto the parser and todeploy/basebut not to the code defaultCONTROL_API_PROXY_TIMEOUT_MS(control-ui)30000300000control-ui/app/control-api/[...path]/route.ts:7(a2c9bf79e)P3-4's default is the
deploy/baselist plus the shared Evenfire registry. Comparedwith the old default it adds
ghcr.io/evenfire-ai/, so with enforcement on and thevariable unset those images go from refused to accepted. It drops the
your-gcp-projectplaceholder.
Effect per consumer
deploy/basewithout an overlay: P3-1 changes (one restart, see below), P3-3changes for new PVCs, and P3-8 changes the egress window. P3-2, P3-4, P3-6 and
P3-10 keep the values
deploy/basealready sets."", which at this head means no pull Secret(
deploy/scripts/host-layout-merge.sh:458, covered byhost-layout-merge.test.mjs), sohost-layout-merge.shproceeds. The P3-1 follow-up (Q-LM) makes the script stop at the HCC image lookupwith the reason when a value cannot be resolved, such as a
valueFromit cannot read; before, it went onto create a check Pod with an empty image and ended with exit 2. P3-8 moves the overlay's HCC overlap from
300to3600s and the WRC entry cap from128to256through the newdeploy/baseentries. Theoverlay pins
WRC_EXTERNAL_EGRESS_OVERLAP_SECONDSat300(
deploy/overlays/minikube/patches/wrc-external-egress-overlap.yaml), because the WRC egress degradationE2E refuses a DNS window above its 505 s bound (
DNS_WINDOW_EXCEEDS_GATE_RECOVERY_BUDGET);scripts/tests/test-wrc-egress-gate-overlap-render.shchecks this in CI. No other item changes the overlay.300→3600s,128→256).variables: no change for any item.
npm run dev): the new defaults.One-time effects
reconcile after the upgrade removes
imagePullSecrets: [{name: clerum}]fromevery Host and workspace-files-controller Deployment. Both use the
Recreatestrategy, so each running Host pod and each workspace-files-controller pod
restarts once; suspended Hosts start nothing, and a Host whose suspension is blocked keeps its
template until the hold ends.
and when it replaces an unbound one with the variable unset it carries over
the class already set (Kubernetes allows only nil → class on update). A Host
workspace PVC that stayed
Pendingbecause the cluster has nodo-block-storage-retainclass therefore keeps that class; delete it and HCCrecreates it with the default class on the next reconcile.
clerumpull Secret andCONTEXT_MAPPER_HOST_IMAGE_PULL_SECRETis unset on HCC, set it toclerumonHCC before running
deploy/scripts/host-layout-merge.sh inventory. The toolnow reads an unset value as no pull Secret, so without it the orphan check
Pods cannot pull and their PVCs report
UNREADABLE(seedocs/deploy/host-pvc-layout-upgrade.md)./32stays in the egress NetworkPolicies after itsDNS TTL for up to one hour instead of up to five minutes, and WRC keeps up to 256 entries per policy. An IP rotated
out of a stable set stays for between about half an hour and an hour (measured 29 to 60 minutes through
reconcileEgressStateand its write gate), because the window is written again only when under half of it is left. While DNS lookups for adeclared hostname fail with a transient error such as a timeout or
SERVFAIL, HCC and WRC keep the IPs theyalready have beyond that hour (fail-static) until a lookup succeeds or the hostname is removed from the
declaration. When the resolver answers that the hostname has no records (
ENOTFOUND,ENODATA), HCC and WRC removeits IPs on the next pass that reaches that policy, without waiting for that hour. Values supplied through
envFromnolonger apply, because the
deploy/baseenventries take precedence.Release note
Changed code defaults
adds one subsection to the upgrade notes: what changes for each item, the
maintenance window P3-1 needs, the PVC note for P3-3, the egress window for
P3-8, the control-ui proxy timeout for P3-13, and how to keep an old value.
Tests
Fail-before / pass-after per commit (test changes applied with the production
code at the previous commit):
EXIT=1, 179/180 (pull-Secret config); layoutEXIT=1, 24/26EXIT=0EXIT=1, 26/27 (the Q-LM case)EXIT=0EXIT=1, 2/4 (runtime default, minimal-infra default)EXIT=0EXIT=1, 121/123 (PVC builder, storage-class config)EXIT=0EXIT=1, 7/10 (three cases); HCC imagePolicy 2/2EXIT=0EXIT=1, 81/82 ("above 2-day cap")EXIT=0EXIT=1, 13/14; WRCEXIT=1, 60/61EXIT=0EXIT=1, 1/2EXIT=015 cases are red before their item and green after (HCC 6, control-api 4, WRC 1,
WAR 1, layout 3). Two cases pass before and after on purpose: the Host builder
case pins the consumer contract the P3-1 fix relies on ("empty means none"), and
the "2 days exactly" case witnesses the "above 2-day cap" case.
Every negative assertion has a witness: a
regcredread-back and the builtDeployment's image for P3-1; list equality plus
not.toContain('mcp-host')andan explicit
""for P3-2;not.toHaveProperty('storageClassName')beside theaccess modes and size for P3-3; the deny loop beside a listed host accepted by
the same list for P3-4; the at-the-cap case for P3-6; explicit override values
(HCC overlap
120, WRC512) for P3-8; an explicitslacklist read back andan unsupported medium that throws for P3-10; the check-Pod image plus status 2
and stderr for Q-LM.
Mutations, each applied to the final tree and each turning its named case red
(17/17):
p31-default0/1;p31-builder-vacuity121/122;p31-wfc-vacuity57/58;
p31-script26/27;lm-herestring26/27;p32-default3/4;p32-minimal3/4;p33-empty121/122;p33-default0/1;q7-placeholder8/10;q7-registry8/10;q7-ghcr7/10 (the deny case's witness goes red);p36-default81/82;p38-hcc13/14;p38-wrc60/61;q9-wrc60/61;p310-default1/2.Desktop flaky tests (
0b458b27f)Two T2 runs on
35ec08f2astopped inpre-gate-syncon Desktop renderer teststhis PR does not otherwise touch. All three defects are in the tests; no
production code changes.
App.deepLinks.test.tsx› "renders a fresh B workspace after successful Alogout and null session" (Desktop test App.deepLinks 'renders a fresh B workspace after successful A logout' is flaky #1278). The suite teardown only unmounted the real
App, so the previous test's pending post-paint bootstrap ran during the next
test and read the new bridge's team directory. The teardown now ends the
controller's session through its external-logout listeners, so the
controller's own identity check drops that task, and the test checks the call
count once the directory is hydrated.
FilePreviewPage.test.tsx› "does not let a rename digest started in the oldgeneration…". Switching to generation 2 legitimately re-reads the resource and
source-folder authority; the test counted those reads whenever they landed
before its sample. It now holds generation 2's read while the stale rename
continues, asserts no rename, then releases it and witnesses the +2 reads.
FilePreviewPage.test.tsx› "keeps the preview delete confirmation busy…"(test(desktop): FilePreviewPage delete-confirmation focus assertion is flaky #1317). The dialog opens after an awaited permission check, so its initial
focus could land after the spy was installed. The spy is now installed after
that focus.
Each file passed 5 of 5 runs (107/107 and 23/23). One mutation per test turns it
red: no session retirement with 40 ms animation frames (#1278), the rename's
post-digest check removed, and the focus effect re-run on
pending.Fixes #1278
Fixes #1317
Verification
Pre-review run, on HEAD
90892308d, per package in the order.github/workflows/ci-public.ymlruns it:
packages/workflow-runtime-core(needed byworkflow-recipesandcontrol-api):npm ciEXIT=0;npm run buildEXIT=0.host-context-controller:npm ciEXIT=0; the Playwright MCP cluster probenode suites 37/37,
EXIT=0;npm run buildEXIT=0;npm test120 files,2789 passed, 0 failed,
EXIT=0;npx tsc --noEmitEXIT=0.workflow-recipes:npm ciEXIT=0;npm run buildEXIT=0;npm test154 files (150 passed, 4 skipped), 3275 passed, 29 skipped, 0 failed,
EXIT=0;npx tsc --noEmitEXIT=0.control-api:npm ciEXIT=0;external-rest-apinpm ciandnpm run buildEXIT=0(CI builds it before the control-api build);npm run buildEXIT=0;npm run typecheck:jwt-contractEXIT=0;npm testwith the default and JSON reporters 658 files (567 passed,91 skipped), 8312 passed, 671 skipped, 0 failed,
EXIT=0; pinned suitesEXIT=0; pinned casesEXIT=0;npx tsc --noEmitEXIT=0.workflow-approval-request-reader:npm ciEXIT=0;npm run buildEXIT=0;npm test11 files, 88 passed, 0 failed,EXIT=0;npx tsc --noEmitEXIT=0.packages/image-policy: no test or build script, as in CI.npm ciEXIT=0;node --check index.cjsEXIT=0; the exported default equals thefive prefixes in order. Its consumers hold: control-api
test/imagePolicy.test.ts10/10 and HCCtest/config.imagePolicy.test.ts2/2, both
EXIT=0.bash -n deploy/scripts/host-layout-merge.shEXIT=0;shellcheck --severity=errorandshellcheckat all severitiesEXIT=0(0.11.0);
deploy/scripts/host-layout-merge.test.mjs27/27EXIT=0;bash -noverdeploy/scriptsandscripts391 files,EXIT=0; theshell-syntax job's four node test files 52/52,
EXIT=0.node scripts/release/validate-release-version-bumps.mjs --previous origin/dev:"Release package version bumps are valid.",
EXIT=0.git diff --check origin/dev...HEAD:EXIT=0.No run reported zero tests; the package without a test script is covered by its
two consumer suites above.
Local T0 (
ELECTRON_RUN_AS_NODEunset for every command), from the worktreeroot:
bash -nonscripts/minikube/t2-common.sh,t2-preflight.sh,t2.sh,t2-setup-handoff.shandscripts/tests/test-minikube-t2-setup-handoff.sh:EXIT=0.bash scripts/minikube/t0.sh: affected packagescontrol-api host-context-controller packages/image-policy workflow-approval-request-reader workflow-recipes;T0_SHELLCHECK=PASS; every package test and buildEXIT=0(control-api 658 files / 8312 passed / 671 skipped; HCC 120 / 2789;WAR 11 / 88; WRC 154 / 3275 passed / 29 skipped;
image-policyreported "notest script" and "no build script");
T0_AFFECTED_CHECKS=PASS;T0_EXIT=0.bash scripts/tests/test-minikube-t2-contract.sh:EXIT=0.bash scripts/tests/test-minikube-t2-setup-handoff.sh:EXIT=0.desktop-appis not in T0's affected set for this diff, so no Desktop installwas needed.
After the first review fixes, on
f65037cde: HCC 2791/2791, control-api 8314 passed, WRC 3275 passed, WAR 88/88,host-layout-merge.test.mjsand the egress proof oracle (43/43) green;scripts/minikube/t0.shT0_AFFECTED_CHECKS=PASS;make minikube-t2on the branch-owned profile (full reconcile):MINIKUBE_T2_PASS,T2_EXIT=0(T1 790 tests, 97/97 files; NP-08 passed; port-forwards passed).Before the review fixes, on
90892308d:make minikube-t2on a branch-owned profile (full bootstrap):MINIKUBE_T2_PASS,T2_EXIT=0(T1 790 tests, 97/97 files; NP-08 passed; port-forwards passed). The first run on that head stopped inpre-gate-syncon one Desktop test,App.deepLinks.test.tsx› "renders a fresh B workspace after successful A logout and null session" (5411/5412), a known flaky test tracked in #1278; that file is not in this diff, it passed 5 of 5 isolated runs, and the re-run on the unchanged head passed.After the final review fixes, on
35ec08f2a: HCC 2793/2793 (120 files), WRC 3275 passed / 29 skipped,host-layout-merge.test.mjs27/27, WRC egress unit contract 143/143,test-np-preflight-inventory.sh7/7,test-wrc-egress-gate-overlap-render.sh4/4 overlays plus the negative control; the minikube renders differ fromf65037cdeonly in the WRC overlap (3600 → 300);scripts/minikube/t0.shT0_AFFECTED_CHECKS=PASS. On0b458b27f(that tree plus the Desktop test fixes):make minikube-t2on the branch-owned profile (full bootstrap):MINIKUBE_T2_PASS,T2_EXIT=0(T0 including Desktop 447/447 files; Desktop 5412/5412 inpre-gate-sync; T1 790 tests, 97/97 files; NP-08 passed; port-forwards passed).381202d47mergesdevtwice on top of that: #1086 (Desktop tab overflow; itsFilePreviewPagerename-test fix conflicted with this PR's and was resolved to this PR's version, which keeps the digest-delivery witness; #1086's generation-key witness was lost in that resolution and is restored ine0854be98) and #1295 (rpc-proxy; the release-notes table now has rows for the rpc-proxy and snippet runner notes, and1fffea7bcadds the row for "Changed code defaults").scripts/minikube/t0.shon381202d47:T0_AFFECTED_CHECKS=PASS(control-api 568 files, Desktop 455/455 files including the browser tests #1086 added, HCC 120/120, WAR 11/11, WRC 150 passed / 4 skipped);test-wrc-egress-gate-overlap-render.sh4/4 overlays plus the negative control;test-np-preflight-inventory.shpassed.c99e9b028mergesdevagain, up to #1299 (snippet runner). The only conflict was theworkflow-recipesversion line, resolved todev's0.1.490; that leftdevand this branch shipping differentworkflow-recipes/src/config.tsunder one version, andvalidate-release-version-bumps.mjs(which checks onlyexternal-rest-apiandrpc-proxy) did not flag it.c310e8b8cbumps it to0.1.491.The second review round adds
e0854be98(the rename test's generation-key witness, and afinallyin theApp.deepLinksteardown),c310e8b8c(the version bump),99107a44b(tests for the egress cap parity, the allowlist override parsing and the configured PVC class; the 422 mock now allows nil -> class),2dc2dfa28(the NP preflight inventory refuses an explicitly empty runtime list and takes the last duplicatedenventry) and1fffea7bc(docs). Each new test was shown to fail under the mutation it targets: generation-1 affordance key, oracle cap 128,toLowerCase()and||in the allowlist parser, dropping the no-class condition, and the three inventory mutations (9/10 each). Touched suites: DesktopFilePreviewPage+App.deepLinks130/130, HCChostReconciler.test.ts127/127, control-api image policy 4/4, egress proof 44/44, NP inventory 10/10.scripts/minikube/t0.shon1fffea7bc:T0_AFFECTED_CHECKS=PASS(control-api 568 files, Desktop 455/455, HCC 120/120, WAR 11/11, WRC 151 passed / 4 skipped).make minikube-t2on1fffea7bc(branch-owned profile, full bootstrap):MINIKUBE_T2_PASS,T2_EXIT=0; Desktop 5494/5494 inpre-gate-sync; T1 790 tests, 97/97 files; NP-08 passed; port-forwards passed.0915f2815mergesdevup to #1356 with no conflict. Both sides had moved control-api from0.1.866to0.1.870, sodevand this branch shipped differentcontrol-api/src/config.tsunder one version: a clean merge runs no pre-commit hook, andvalidate-release-version-bumps.mjsdid not cover control-api.6923fe97cbumps it.8af728fd1mergesdevup to #1271. The only conflict was the HCC version line; the hook then moved it to0.1.421. #1271'sscripts/e2e/e2e-egress-cdn-rotation.shread theHCC_EXTERNAL_EGRESS_OVERLAP_SECentry this PR adds todeploy/baseas a leftover override and refused to start on every profile;f1cc6a1f1fixes that by comparing the value the run sets.The third review round adds:
2d26e0448: one apiserver-like mock for the unbound PVC replace tests. The class-change test now expects the failed pass the apiserver really causes (fix(hcc): unbound Host PVC replace fails on every reconcile after CONTEXT_MAPPER_HOST_WORKSPACE_STORAGE_CLASS changes #1310), and new rows cover a live claim with no class.57d32113d: tests that read each changed code default and itsdeploy/basevalue, in control-api, HCC, WRC and WAR. Overlays differ on purpose and are not compared. Variablesdeploy/baseleaves unset are asserted absent.584646e25: theApp.deepLinksteardown resets suite state when session retirement fails.8994bca0a:hcc_envinhost-layout-merge.shtakes the last duplicatedenventry, like the NP preflight inventory.25860ffde: corrects who sets the infra pull Secret inregistry-pull-secret-self-provisioning.md.29bdd394d: this PR's version collision happened twice, sovalidate-release-version-bumps.mjsgains--all-services, which CI runs on pull requests intodevagainst the merge result. It stays off the push leg, where a failure has no branch left to fix, and off promotions intomain. That commit's message says an out-of-date branch can still collide;devrequires up-to-date branches, so it cannot, unless the ruleset is bypassed.docs/deploy/releases-and-upgrades.mdlists what the check covers and what it does not, which includesworkflow-approval-request-readerandpackages/**other thanpackages/jwt-key-policy/.Each new test was shown to fail before its fix or under the mutation it targets. Touched suites:
test-egress-cdn-rotation-cleanup.sh121/121 on bash 5 (on/bin/bash3.2 it failed check 120 until the fifth round), HCChostReconciler.test.ts129/129, theconfig.deployBaseDefaultstests 10/10,App.deepLinks108/108,host-layout-merge.test.mjs28/28,test-validate-release-version-bumps.sh6/6. The validator fails on the real collision (e946cdecdagainst0915f2815) and passes on this head.e2e-egress-cdn-rotation.shphase 0 itself needs a cluster and was not run; the hermetic test covers its predicate and call site.scripts/minikube/t0.shon29bdd394d:T0_AFFECTED_CHECKS=PASS,T0_EXIT=0(control-api 8323 passed / 671 skipped, Desktop 5495/5495, HCC 2898/2898, WAR 89/89, WRC 3289 passed / 29 skipped).3b050e441mergesdevup to #1210.The fourth round adds:
91171e6cf: renames a test variable the public boundary read as a credential, which had turnedShell script syntaxred.scripts/minikube/t0.shdoes not run the boundary; the contract test does.52360f70d: moves the--all-servicesstep to the requiredRepo hygienejob, fails a version below the base, stops counting test files, and pins the service list against the hook's roots. The pin itself stayed in the non-requiredShell script syntaxjob until the fifth round.8fd096b35: tests the WFC pull Secret through the reconciler's default config, and a live""PVC class.77da97a54: corrects the egress and approval upgrade notes.9defe5cf8: shows the kustomize error in the NP preflight, and tests its helper call and the layout tool's image stops.Local checks on
9defe5cf8:make minikube-t2-public-boundaryPUBLIC_BOUNDARY_PASS;test-validate-release-version-bumps.sh76 checks, 0 failed;validate-release-version-bumps.mjs --previous origin/dev --all-servicespasses;test-np-preflight-inventory.shNP_PREFLIGHT_INVENTORY_PASS.scripts/minikube/t0.sh:T0_AFFECTED_CHECKS=PASS(control-api 8323 passed / 671 skipped, Desktop 5510/5510, HCC 2901/2901, WAR 89/89, WRC 3289 passed / 29 skipped).make minikube-t2on9defe5cf8(branch-owned profile, full bootstrap):MINIKUBE_T2_PASS,T2_EXIT=0; Desktop 5510/5510 inpre-gate-sync; T1 790 tests, 97/97 files; NP-08 passed; port-forwards passed;Health=NOT_RUN.e2e-egress-cdn-rotation.shwas not run: it is a manual lane, and its fix is covered by the hermetic test.03af981d1mergesdevup to #1285. The conflicts were the control-api version line, moved abovedev's0.1.891to0.1.892, and the release note table, which keeps both rows. On03af981d1:make minikube-t2-public-boundaryPUBLIC_BOUNDARY_PASS;test-validate-release-version-bumps.shpasses;validate-release-version-bumps.mjs --previous origin/dev --all-servicespasses.scripts/minikube/t0.sh:T0_AFFECTED_CHECKS=PASS(control-api 8504 passed / 765 skipped, Desktop 5510/5510, HCC 2901/2901, WAR 89/89, WRC 3289 passed / 29 skipped). Themake minikube-t2result above is on9defe5cf8; the final checks below replace it.The fifth round adds:
4ed2694c2: builds the leftover overlap JSON outside the command substitution intest-egress-cdn-rotation-cleanup.sh, which/bin/bash3.2 brace-expanded.d40a20630: moves the version check's test to the requiredRepo hygienejob, makes it pin the exact commands and refuse anything that softens them, and has the check look at every file under a service as the hook does. It leaves out what a running service does not load (test code, Markdown,Makefile,makefile,vitest.config.*and.env.exampleat the service's root, andscripts/incontrol-api,mcp-hostandworkflow-recipes) and the release manifest, counts both sides of a rename, and addspackages/jwt-key-policy/forcontrol-api. A service the base does not have now passes, and a missingpackage.jsonor an unorderable version gives an annotation.d8e2f195c: documents that coverage, what a revert does, and what to do when the check is wrong.0718f8052corrects the egress window and the first-reconcile note, and adds the NP preflight's version skew.514c5a47bstates that the hook also skips the release manifest.d68be4537,63c56fd16,5aebf44a2: test that the NP preflight walks the derived namespaces, that the WRC recovery bound is the one the gate refuses, and the layout tool's empty and unset image stops.63c56fd16moves the gate's budget check into a function the test and the flow both call.91861f29d: models the PVC update rules the apiserver applies to an unbound claim, and uses that model in the annotations test.Replayed over the 349 first-parent merges of
dev, the previous check fails 59 and this one 64. The 5 new ones are lockfile,package.json,tsconfig.jsonornext-env.d.tschanges at an unchanged version. In that replay, excludingscripts/keeps one merge green and excluding the root files changes no verdict. Each new test was shown to fail under the mutation it targets, and every changed shell test passes on/bin/bash3.2 and bash 5.The sixth round adds:
3b205f048: corrects the release note: when the resolver answers that a hostname has no records, HCC and WRC remove its IPs on the next pass that reaches that policy.f290fe864: corrects what the version check's doc and comment say it leaves out.channel-readerandexternal-rest-apicompile the test files undersrc/intodist/, so the reason is that nothing loads them, not that no image holds them. The test-name pattern covers JavaScript and TypeScript names only. A file moved out of a service gets no hook bump, so the author sets that version by hand; none of the 6055 non-merge commits ondevtouched a service only as a rename source, so the hook stays as it is. The check's behaviour does not change.2514932ba,1d6964175: the version check's test also refuses a checkoutref, a second checkout and workflow-leveldefaultsorenv, gives aFAILline forfetch-depth: 0, and probes a stylesheet, images, Dockerfile variants and build ignore files.e63ee5ec2,5c7805aa9: the NP preflight case reads the calls check 4 sends instead of its summary line, and the WRC recovery pin matches the whole statement instead of a substring. That pin is still a source read: the flow needs a cluster.68d8bfd0f: limits the no-records sentence to passes that reach the policy, because WRC stops a recipe at its first blocking failure.b08437105: states that the version check's test does not pin the job's other steps, and adds a negative for check 4 in the NP preflight case.The seventh round adds:
6322a0aac: one rule per service in both modes of the version check.d40a20630gave--all-servicesits own entries forexternal-rest-apiandrpc-proxyand left the default mode on the old list, so a test file there failed only the default mode, and a Dockerfile, lockfile orpackage.jsonedit failed only--all-services. The old list is gone: the default mode checks the two servicesreleaseManifest.tspublishes, with the same rule. The test now runs both modes on the same changes and requires the same verdict: 49 at the head, 47 under those services and 2 underpackages/jwt-key-policy/(8d288c9d2). Replayed over the 350 first-parent merges ofdevand 89 commits ofmain, no verdict changes.a2c69fc84: the check reads changed paths with-z, so a path with a non-ASCII character or a double quote still counts for its service. No tracked path has either.197df8583: the check escapes%, CR and LF in its annotations, so a version cannot print a workflow command of its own.e0823bb52: the version check's pin acceptspermissions,timeout-minutesandpersist-credentialson theRepo hygienejob.91dc684ad:CONTRIBUTING.mdand the release doc say how to clear astayed atfailure.5653def26: the WRC overlap bound test reads the window fromreconcileEgressStateinstead of restating its formula.8d288c9d2: a test file underpackages/jwt-key-policy/now counts in neither mode (the default mode used to count it forexternal-rest-apiandrpc-proxy); the test probes it in both modes. Deletingexternal-rest-api/package.jsonorrpc-proxy/package.jsonalone now also fails the default mode, as--all-servicesalready did.The eighth round (zach88's round 6, no must-resolve items) adds:
63c736788,bf799634c,a925bbd76, corrected byb0a64e495: the release note says a fresh install that does not usedeploy/baseand leavesCONTEXT_MAPPER_RUNTIME_NAMESPACESunset gets none of the four namespace-wide baseline policies HCC used to write inmcp-host, and warns thatdeploy/base/mcp-host/networkpolicies.yaml, applied as is, opens 443 and 80 to0.0.0.0/0(R6-L6, R7-L1, R7-L2). The version check's doc lists the paths git quotes: a double quote, a backslash, a control character, and with git's defaultcore.quotePatha non-ASCII character (R6-L7).63c736788: the WRC overlap bound test dropsprotocol, which the accumulator never emits (R6-L5).ci-public.ymlgets back the blank line between two steps that thedevmerge lost.f54b69d76mergesdevup tod02fcb9f1. The conflicts wereci-public.yml(both new steps kept), the control-api version (0.1.941, abovedev's0.1.940),App.deepLinks.test.tsx(this branch's reviewed cleanup kept;devcarried an earlier copy) and the release notes table (both rows kept). The merge commit's hook also bumped services this PR does not change;b3a83af17putscontrol-ui,mcp-hostand the E2E fixtures back ondev's versions.The ninth round (zach88's round 7) adds:
b0a64e495: restores the release note's warning about applyingdeploy/base/mcp-host/networkpolicies.yamlon its own, says how to apply it and thatallow-k8s-api-egress-mcp-hostships with an example address, and names the four baseline policies (R7-L1, R7-L2).The tenth round adds:
3602cb330: mergesdevat18052d9ce(the Next.js upgrade in control-ui and profile-ui, and new dependency gates). No conflicts; the two files both sides touch (.github/workflows/ci-public.yml,CONTRIBUTING.md) keep both sides' hunks unchanged, and no service version goes below either parent.acf5d4994: P3-13. control-ui'sCONTROL_API_PROXY_TIMEOUT_MSdefaults to300000(was30000), the valuedeploy/basesets. A new test reads the base value and checks that the route uses it when the variable is unset; the override case now uses45000. Reverting the constant fails both default cases.6e54c106d: review fixes foracf5d4994. The control-ui README and a control-api comment still gave the 30 s default; the release note anddocs/surfaces/control-ui.mdnow say which requests the timeout covers; the GET test asserts the request was proxied.3f1ff4819: mergesdevatb6db9c297(the sharp 0.35.5 override in control-ui and profile-ui). The only conflict was the control-ui version line: this branch had0.1.764anddev0.1.763; the merge takes dev'spackage.jsonand lock and sets0.1.765. Everything else in6e54c106d..3f1ff4819is dev's own change.Final checks on
3f1ff4819:scripts/minikube/t0.shT0_AFFECTED_CHECKS=PASS; the version check's test 320 checks, 0 failed. A blind review of the merge found nothing and judged a new T2 unnecessary: the delta does not touch T1, NP-08 or any backend, and sharp loads only to optimize images, which T2 does not exercise. The T2 below stays pinned to6e54c106d.Final checks on
6e54c106d:make minikube-t2on the branch-owned profile:MINIKUBE_T2_PASS,T2_EXIT=0, with its own T0 (T0_AFFECTED_CHECKS=PASS) and T1 on this head (T1 1064 tests, 132 files; NP-08 passed; port-forwards passed; Health and Playwright not run). Standalonescripts/minikube/t0.shonacf5d4994:T0_AFFECTED_CHECKS=PASS(control-api 8836 passed / 944 skipped, control-ui 3105/3105, Desktop 5728/5728, HCC 2904/2904, WAR 89/89, WRC 3289 passed / 29 skipped); the version check's test 320 checks, 0 failed. A blind review of thedevmerge found nothing; one ofacf5d4994found four Lows, fixed in6e54c106d. These replace the final checks onb0a64e495below.Final checks on
b0a64e495:scripts/minikube/t0.shT0_AFFECTED_CHECKS=PASS(control-api 8836 passed / 944 skipped, Desktop 5728/5728, HCC 2904/2904, WAR 89/89, WRC 3289 passed / 29 skipped).a925bbd76..b0a64e495changes onlydocs/deploy/releases-and-upgrades.md, so themake minikube-t2pass ona925bbd76below was not repeated.Final checks on
a925bbd76:scripts/minikube/t0.shon63c736788T0_AFFECTED_CHECKS=PASS(control-api 8836 passed / 944 skipped, Desktop 5728/5728, HCC 2904/2904, WAR 89/89, WRC 3289 passed / 29 skipped);63c736788..a925bbd76changes onlydocs/deploy/releases-and-upgrades.md. On63c736788: the version check's test 320 checks, 0 failed, and the CDN cleanup test 121/121, each on/bin/bash3.2 and bash 5;wrc-egress-gate39/39;make minikube-t2-public-boundaryPUBLIC_BOUNDARY_PASS.make minikube-t2on the branch-owned profile:MINIKUBE_T2_PASS,T2_EXIT=0, with its own T0 and T1 ona925bbd76(T1 1064/1064 tests, 132/132 files; NP-08 passed; port-forwards passed; Health and Playwright not run). CI 60/60 ona925bbd76after one re-run of a Desktop test this PR does not touch (#1416). These replace the final checks on8d288c9d2below.Final checks on
8d288c9d2:scripts/minikube/t0.shT0_AFFECTED_CHECKS=PASS(control-api 8836 passed / 944 skipped, Desktop 5728/5728, HCC 2904/2904, WAR 89/89, WRC 3289 passed / 29 skipped); the version check's test 320 checks, 0 failed, and the CDN cleanup test 121/121, each on/bin/bash3.2 and bash 5;make minikube-t2-public-boundaryPUBLIC_BOUNDARY_PASS.make minikube-t2on a fresh branch-owned profile:MINIKUBE_T2_PASS,T2_EXIT=0(T1 1064/1064 tests, 132/132 files; NP-08 passed; port-forwards passed; Health and Playwright not run). These replace the final checks onb08437105below.Final checks on
b08437105:scripts/minikube/t0.shT0_AFFECTED_CHECKS=PASS(control-api 8504 passed / 765 skipped, Desktop 5588/5588, HCC 2904/2904, WAR 89/89, WRC 3289 passed / 29 skipped);make minikube-t2-public-boundaryPUBLIC_BOUNDARY_PASS; the version check's test 265 checks, 0 failed, and the CDN cleanup test 121/121, each on/bin/bash3.2 and bash 5.make minikube-t2on a fresh branch-owned profile:MINIKUBE_T2_PASS,T2_EXIT=0(T1 884/884 tests, 106/106 files; NP-08 passed; port-forwards passed; Health and Playwright not run). This T2 supersedes the earlier T2 results in this body.CI on
9defe5cf8:Real Postgres integrationfailed once inpasswordPersistence.realPostgres.integration.test.ts(does not repeat an ambiguous successful terminal commit), the race tracked in #1296. This PR does not touch that test or the code it covers, and the re-run of that job on the same head passed.CI: the first run of "Shell script syntax (bash -n)" failed in
scripts/tests/test-minikube-t2-lock-race.sh(two stale-lock reclaimers entered the critical section), the intermittent race tracked in #1254. This PR adds and changes files underscripts/(scripts/tests/test-np-preflight-inventory.sh,test-wrc-egress-gate-overlap-render.sh,scripts/e2e/_lib/wrc-egress-{gate,proof}.cjs) but not that test or the lock code it covers, and the re-run of that job on the same head passed.Not in this PR
Desktop/Control UI public URLs (issue control-api sends loopback Desktop URLs in invitations when a deployment does not override them #1294) and the audit §7 renames are
separate.
deploy/scripts/validate-hcc-gcp-pull-ref-render.shhas no caller andcontrol-ui/lib/recipeDefaults.ts:33holds a pre-existing copy of theplaceholder path; tracked in chore: remove the your-gcp-project placeholder registry from the Control UI default and the uncalled render validator #1327.
minimal-infra or leaves the runtime list; no shipped configuration reaches it
(tracked in fix(hcc): remove HCC-owned API egress policies when a runtime namespace becomes minimal-infra #1325).
timeoutSecondsaboveWORKFLOW_APPROVAL_MAX_TTL_SECis accepted bythe CRD and the editor and rejected at run time (tracked in fix(workflows): reject approval timeoutSeconds above WORKFLOW_APPROVAL_MAX_TTL_SEC before a run starts #1326).
CONTEXT_MAPPER_HOST_WORKSPACE_STORAGE_CLASS=""as anempty class (Kubernetes: no class and no dynamic provisioning), matching the
existing workspace-files-controller behaviour. The SharedFileSystem CRD doc
and that code disagree about
""; recorded as a fact, not changed here and noissue opened.
CONTEXT_MAPPER_HOST_WORKSPACE_STORAGE_CLASSstill fails the replace on everyreconcile; this predates the PR and is tracked in fix(hcc): unbound Host PVC replace fails on every reconcile after CONTEXT_MAPPER_HOST_WORKSPACE_STORAGE_CLASS changes #1310. A changed size on such a claim fails the same way; the size row in the new PVC model test pins it.
scripts/tests/test-minikube-makefile.shrunsmake -non a recipe with$(MAKE), so it sends realkubectl get secretcalls; neither that test nor theMakefileis in this diff.deploy/scripts/np-enforce-preflight.shreports PASS when some reads in checks 4 and 5 are refused; this predates the PR and is tracked in fix(deploy): np-enforce-preflight reports PASS when kubectl reads in checks 4 and 5 are refused #1383.jwt-key-policyprobe, an invalidpackage.json, the hand-written default-mode list) are tracked in ci(release): close four test and robustness gaps in the version check #1417.Follow-ups after the release
devand allowsHCC_EXTERNAL_EGRESS_OVERLAP_SEC,WRC_EXTERNAL_EGRESS_OVERLAP_SECONDSandWRC_EXTERNAL_EGRESS_MAX_ENTRIESonly in its gcp overlays, so with this PR'sdeploy/baseit reports them as leaked in minikube. Order: merge the infra change that accepts both minikube states (absent, or3600/300/256), then this PR, then tighten that contract to the new values. Deploys do not run that contract, and the gcp renders are byte-identical before and after this PR, so nothing changes at runtime.hcc-pull-ref-overrides.yaml, because both pull Secret keys now default to none.300and128) in the present tense; refreshing them belongs to that repository and is not part of this PR.git revert -m 1on its merge commit, orgit reverton the squash commit if it was squashed. That also removes the version check, and a conflict-free revert runs no pre-commit hook and lowers every version it touches, so set each service's version abovedev's before you push.hostReconciler.test.ts,host-layout-merge.test.mjsand the release note, so a revert also takes other items' tests and the note's corrections. To keep an old value on a deployment, set the variable as the release note says; that needs no code change. To change a default back in the code, edit that default by hand, in a commit of its own. The item's case inconfig.deployBaseDefaults.test.*then goes red: update it in the same change, becausedeploy/baseand the code default then differ on purpose or both need changing. Edit the item's lines in the release note by hand. The hook bumps the version for a default under a hook root; P3-4'spackages/image-policyand P3-10'sworkflow-approval-request-readerare not under one. For P3-4, bumpcontrol-api,host-context-controllerandworkflow-recipesby hand: all three shippackages/image-policy(file:../packages/image-policy, copied by their Dockerfiles), and neither the hook nor the version check sees a change there.🤖 Generated with Claude Code