Skip to content

Release/v1.0.6#5738

Merged
ja8zyjits merged 12 commits into
mainfrom
Release/v1.0.6
Jul 21, 2026
Merged

Release/v1.0.6#5738
ja8zyjits merged 12 commits into
mainfrom
Release/v1.0.6

Conversation

@cafalchio

@cafalchio cafalchio commented Jul 21, 2026

Copy link
Copy Markdown
Collaborator

[1.0.6] - 2026-07-22 - OAuth Token Exchange, Vault Credentials, MCP Apps, Dataplane Publishing, and Security Hardening

Overview

Release 1.0.6 consolidates 61 PRs focused on OAuth RFC 8693 token exchange, HashiCorp Vault per-user credential resolution, MCP Apps support, dataplane resource and tool publishing, SSRF/TLS security hardening, plugin observability, and CI/DevOps improvements:

  • Security - SSRF/TLS validation in gRPC endpoint, SSRF validation for all OAuth config URLs, CSP modernisation, output neutralisation (CWE-117), global SSRF flag respected in gateway test endpoint, output-length guard resource bypass fix, and stricter auth-header key validation.
  • OAuth & Auth - RFC 8693 On-Behalf-Of token exchange for OAuth gateways, unified email extraction across all resource operations, and Keycloak test-user collision fix.
  • Vault - Per-user credential resolution from HashiCorp Vault for all auth types.
  • MCP Apps - New MCP Apps support added to the platform.
  • Dataplane - Publish original tool names, streamable-HTTP-only backends, resource URIs and capabilities, per-worker lock IDs with safer key TTL.
  • Plugins - CPEX plugin trace context and metrics (G0+G1), metrics from 5 remaining bundled cpex-* plugins, single-worker initialisation across instances, fork-poisoned FileLock rebuild.
  • API & Fixes - Bootstrap race condition fix, resource proxy templated reads, savepoint for personal-team cascade delete, 404 for missing server/gateway deletes, team invitation duplicate membership check.
  • CI / DevOps - PR-scoped pyright workflow, s390x build flag, remove Slack direct-merge notification, remove Renovate in favour of Dependabot, Redis maxclients increase.

Breaking Changes

  • Stricter auth_headers Key Validation (Gateways, Tools, A2A Agents) (#5314) - Header-key validation is now shared across all create/update schemas and the admin form. Keys with embedded whitespace (e.g. X Api Key) were previously accepted and stored as invalid HTTP header names that failed at invocation time; they are now rejected with a 422 at config time, and surrounding whitespace is trimmed before storage. Gateway or A2A configs relying on the old behaviour will need their header keys corrected on the next update.

    Before 1.0.6 From 1.0.6
    Header key X Api Key Accepted, stored, failed at invocation Rejected with HTTP 422 at config time
    Header key Authorization Accepted with leading/trailing spaces Stored as Authorization (trimmed)

Added

API & Platform

  • POST /v1/mcp-servers/test Endpoint (#5443) - Added POST endpoint for connection testing.
  • GET /v1/resources/test/{resource_uri} Endpoint (#5455) - Added public resource test endpoint.
  • MCP Apps Support (#5079) - Added MCP Apps support to the platform.

OAuth & Auth

  • RFC 8693 Token Exchange (#5224) - Added On-Behalf-Of token exchange for OAuth gateways per RFC 8693.

Vault

  • Per-User Vault Credential Resolution (#5651) - Resolve per-user credentials from HashiCorp Vault for all auth types.

Plugins & Observability

  • CPEX Plugin Trace Context and Metrics (#5470) - Build and consume CPEX plugin trace context and metrics (G0+G1).
  • Remaining CPEX Plugin Metrics (#5611) - Consume metrics from 5 remaining bundled cpex-* plugins.

Dataplane

  • Publish Resource URIs and Capabilities (#5588) - Publish dataplane resource URIs and capabilities.

Changed

API

  • Custom Auth Headers on Tools (#5314) - POST /tools and PUT /tools/{tool_id} now correctly persist the auth_headers array instead of silently storing auth_value: null. Invalid header keys/values are rejected with a 422 rather than an unhandled 500.

Build & Packaging

  • JS Libraries Packaged (#5481) - All JS libraries are now packaged into the bundle.
  • Move Rust and Go MCP Servers (#5425) - Moved Rust and Go MCP servers to the contextforge-examples repository.
  • Python Dependencies Update (#5605) - Updated Python dependencies.
  • Secrets Detection Version Bump (#5635) - Bumped SecretsDetection and updated field filter config.

Fixed

Security

  • gRPC SSRF/TLS Validation (#5410) - Enforced SSRF and TLS validation in GrpcEndpoint.start().
  • OAuth Config URL SSRF Validation (#5601) - Validated all oauth_config URLs to prevent SSRF during gateway registration.
  • Global SSRF Flag in Gateway Test (#5023) - Respected ssrf_protection_enabled global flag in the gateway test endpoint.
  • Output Length Guard Resource Bypass (#5619) - Fixed output length guard bypass via resource path.
  • CWE-117 Log Output Neutralisation (#5441) - Fixed improper output neutralisation in log statements.
  • CSP Modernisation (#5111) - Modernised Content Security Policy configuration.

Auth

  • Unified Email Extraction (#4821) - Unified email extraction across all resource operations.
  • Keycloak Test User Collision (#5647) - Renamed Keycloak test user to avoid email collision with default admin.

API & Database

  • Missing Server and Gateway Deletes (#5672) - DELETE /servers/{id} and DELETE /gateways/{id} now return 404 Not Found instead of 403 Forbidden when the target does not exist.
  • Personal Team Cascade Delete (#5659) - Used savepoint for personal team cascade delete and reordered FK deletes.
  • Team Invitation Duplicate Membership (#5543) - Check for existing team membership before accepting an invitation.
  • Bootstrap Resource Assignments Race (#5003) - Fixed race condition in bootstrap_resource_assignments on concurrent pod restart.
  • Resource Name Conflict Message (#5158) - Show meaningful conflict message for duplicate resource names.
  • Resource Name Uniqueness Constraint Revert (#5664) - Reverted resource name uniqueness constraint introduced in fix(resources): show meaningful conflict message for duplicate resource name #5158.

Dataplane & Transport

  • Publish Original Tool Names (#5510) - Published original_name in allowed_tool_names from the dataplane publisher.
  • Streamable-HTTP Only Backends (#5519) - Dataplane publisher now publishes streamable-HTTP backends only.
  • Per-Worker Lock ID and Key TTL (#5517) - Fixed per-worker lock ID and made key TTL safer.
  • Templated Resource Proxy Reads (#5569) - Fixed templated resource proxy reads.
  • Content-Length Headers Causing Compression Errors (#5663) - Removed manual Content-Length headers that caused compression errors.

A2A

  • Safe Headers to Tool Pre-Invoke Hooks (#4925) - Pass safe headers to tool pre-invoke hooks in A2A.

Plugins

  • Single-Worker Plugin Initialisation (#5406, #5430) - Restricted non-hook plugin initialisation to a single worker across instances.
  • Fork-Poisoned FileLock Rebuild (#5654) - Rebuilt fork-poisoned FileLock and added back-off on health-check errors.

Build & Infrastructure

  • Redis maxclients Increase (#4724) - Raised Redis maxclients from 10000 to 15000 and reduced max connections.
  • Containerfile Premature Exit (#5596) - Removed premature exit in Containerfile and restored Go linting targets.
  • CI a2a-echo-agent Docker Scan (#5590) - Removed deleted a2a-echo-agent from docker-scan workflow and fixed Makefile actionlint quote.
  • ppc64le and s390x CSS Builds (#5620) - Fixed ppc64le and s390x CSS builds.

Documentation

  • Generic MCP Extension Framework ADR (#5007) - Added ADR for the generic MCP extension framework.

Known Issues

  • 🔒 CSRF Validation Failure Saving LLM Provider/Model (#5739) – Saving an LLM Provider or Model in the Admin UI fails with 403 CSRF validation failed. Recurrence of the class of failure documented in #5151.
    • Workaround: Copy the CSRF_EXEMPT_PATHS value from .env.example into your .env and restart the application.
  • 💬 LLM Chat Sessions Are In-Memory Only (#5740) – redis_client is hardcoded to None, so chat sessions are not shared across workers and are lost on process restart. Under multi-worker gunicorn (the default for make serve), sessions will drop intermittently with no diagnostic message.
    • Workaround: Run a single worker (--workers 1) if session continuity is required.
  • 🔗 LLM Chat Cannot Connect to a Same-Gateway Virtual Server (#5215) – The forwarded session token is rejected with a 401 by /servers/{id}/mcp when LLM Chat targets a Virtual Server on the same gateway instance.
  • 🧪 Tools Table Row Action Button Not Found (#5526) – Row action button is not found for the JSON-schema test tool in the Tools table.

Chores

PR Description Author
#5545 ci: temporarily disable s390x builds on push to main madhu-mohan-jaishankar
#5513 ci(plugins): replace fast-time-server source build with pre-built Docker image madhu-mohan-jaishankar
#5503 ci: remove direct-merge Slack notification madhu-mohan-jaishankar
#4518 Improve test coverage on rbac admin delete tool cafalchio
#5515 test: wait for per-server route before compliance gateway_virtual runs lucarlig
#5523 test: align admin private-server listing test with owner matching lucarlig
#5482 test: retry live RBAC per-server access lucarlig
#5603 test(protocol): remove xfail for GAP-001/GAP-002 — log and progress notifications now relayed jonpspri
#5622 Update secrets and reset .secrets.baseline brian-hussey
#5623 FIX(CHORE): Remove renovate json file and update security.md to include dependabot claudia-gray
#5625 Fix playwright tests gcgoncalves
#5653 test: Fix pw test gcgoncalves
#5646 chore(templates): remove CSP-violating airgapped Tailwind JS branch prakhar-singh1928
#5576 chore: update-release documentation prakhar-singh1928
#5634 ci(pyright): add PR-scoped type check workflow and pyright-pr make target madhu-mohan-jaishankar
#5637 Update fix_file_headers to have generic default AUTHOR and defined COPYRIGHT brian-hussey
#5669 Update python call in fix_file_headers pre-commit to use uv run brian-hussey
#5703 Disable pyright (unintended consequence requiring full compliance) brian-hussey
#5605 chore: updated python dependencies prakhar-singh1928
#5635 Version bump SecretsDetection and update field filter config gandhipratik203
#5710 Update roadmap for 1.0.6 jonpspri

prakhar-singh1928 and others added 5 commits July 21, 2026 12:21
Signed-off-by: prakhar-singh1928 <prakhar.singh1928@ibm.com>
Signed-off-by: cafalchio <mcafalchio@gmail.com>
Signed-off-by: cafalchio <mcafalchio@gmail.com>
Signed-off-by: cafalchio <mcafalchio@gmail.com>
Signed-off-by: cafalchio <mcafalchio@gmail.com>

@brian-hussey brian-hussey left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

@cafalchio Will you capture the load test results as part of the release as well please?
I'm thinking docs/release/test-results/ with a particular md file with the summary.
@ja8zyjits This might not need to block release right now but I'd like an immediate update afterwards with this kind of detail for this point in time.
And we should update the release management steps to include this update as well.

gcgoncalves
gcgoncalves previously approved these changes Jul 21, 2026

@gcgoncalves gcgoncalves left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Nice!

@gcgoncalves
gcgoncalves self-requested a review July 21, 2026 14:27
Signed-off-by: cafalchio <mcafalchio@gmail.com>
@cafalchio

Copy link
Copy Markdown
Collaborator Author

@brian-hussey I have added the benchmark.md

@cafalchio
cafalchio requested a review from brian-hussey July 21, 2026 14:42

@msureshkumar88 msureshkumar88 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Thanks for pulling this release together — consolidating 89 PRs into a coherent changelog is real work, and the mechanical bump is clean: .bumpversion.cfg, mcpgateway/__init__.py, Cargo.toml/Cargo.lock, pyproject.toml, uv.lock, and charts/mcp-stack/Chart.yaml are all consistent at 1.0.6.

A couple of things I checked and want to call out as good, since they're easy to get wrong:

  • The cargo-vet pruning in supply-chain/config.toml is sound. The removed exemptions (aes-gcm, aead, ctr, ghash, dashmap, criterion, bstr) are all for crates no longer present in Cargo.lock, hashbrown moved 0.14.5 → 0.17.1 and is now publisher-covered, and num-conv is covered by the imported mozilla/zcash/ariel-os audits. The Supply-chain vet job is green, which matches.
  • The check-manifest ignore additions in pyproject.toml line up with the new static bundle layout, and since it's check-manifest-only there's no wheel/packaging impact.
  • .secrets.baseline is line-number shifts and a timestamp only — no new findings.

I compared the file set against the previous release PRs (#5509 for 1.0.5, #5311 for 1.0.4) and a few checklist steps from docs/docs/development/release-management.md look like they were missed. Grouping them below.


Blocking

1. SECURITY.md — a paragraph got dropped along with the version bump

 **Current Version: 1.0.6**
-ContextForge is currently in beta and should be treated as such until the 1.0 release. While we implement comprehensive security measures and follow best practices, important limitations exist:

This leaves ## ⚠️ Beta Software Notice as an orphan heading with nothing under it. #5509 touched only the version line here (+1/−1), so this looks unintentional — worth restoring.

2. CHANGELOG.md — the [Unreleased] entries were removed rather than migrated

Three entries were deleted from [Unreleased]. Only one made it into the 1.0.6 section, and as a bare PR title (fix: return 404 for missing server and gateway deletes #5672) with the behavior detail stripped. Two are gone entirely:

  • Stricter authheaders Key Validation (#5314) — this one is a documented breaking change with migration impact ("Gateway or A2A configs relying on the old behavior will need their header keys corrected on the next update").
  • Custom Auth Headers on Tools (#5314 / #5201).

release-management.md §1.3 asks for a Breaking Changes section with migration tables, and 1.0.6 currently has none. Suggested addition under the 1.0.6 Overview:

### Breaking Changes

- **Stricter `authheaders` Key Validation (Gateways, Tools, A2A Agents)** ([#5314](https://github.com/IBM/mcp-context-forge/pull/5314)) - Header-key validation is now shared across all create/update schemas and the admin form. Keys with embedded whitespace (e.g. `X Api Key`) were previously accepted and stored as invalid HTTP header names that failed at invocation time; they are now rejected with a 422 at config time, and surrounding whitespace is trimmed before storage. Gateway or A2A configs relying on the old behavior will need their header keys corrected on the next update.

3. Containerfile:375 — OCI version label still says 1.0.5

-    org.opencontainers.image.version="1.0.5"
+    org.opencontainers.image.version="1.0.6"

#5509 bumped Containerfile (+4/−4) for exactly this. As-is, the 1.0.6 images ship labeled 1.0.5, which shows up in registry metadata and the SBOM.

Side note: commit 2ffc39fa is titled "bump-version 1.0.5 -> 1.0.6 / update ubi packages" but there's no Containerfile change in the final diff — possible the base-image update (§1.6) got lost in a rebase?

4. Stale >=1.0.5 pins

git grep '1\.0\.5' turns up four that previous releases bumped:

  • pyproject.toml:330 and :334 — the all / dev-all meta-extras (#5509 bumped these exact lines)
  • plugins/external/opa/pyproject.toml:49
  • plugins/external/cedar/pyproject.toml:49

Suggestions (non-blocking, but worth a look before tagging)

Dependency updates (§2 / §3) may be partial. uv.lock has no actual package upgrades — just the project version plus some resolver artifacts. For comparison, #5509 moved real pins (e.g. pydantic-settings>=2.14.12.14.2), and the npm lock here only picked up dev deps (biome 2.5.2 → 2.5.4, lru-cache). The release notes mention dependency updates under Infrastructure, so these may just be out of sync — or the uv lock --upgrade sweep hasn't run yet.

uv.lock reproducibility cutoff. The absolute exclude-newer was replaced with a sentinel:

-exclude-newer = "2026-07-06T09:32:49.364341Z"
+exclude-newer = "0001-01-01T00:00:00Z" # This has no effect...

Resolution is now governed only by the relative exclude-newer-span = "P10D", which means each re-lock drifts rather than pinning to a fixed date. This looks like an artifact of a newer uv writing the file. Is that the intended behavior going forward?

uv.lock marker relaxation. aiologic and culsans lost their python_full_version < '3.13' markers on sniffio / wrapt / typing-extensions, so those now install on 3.13+ as well. Almost certainly benign, but it is an unremarked change to the installed dependency set in a release lock.

tests/performance/benchmark.md. The table reports 7.83% and 31.56% failure rates, a max response of 85.5s, and p99 sitting right at the 30s timeout. Useful data to track, but published as-is it reads like a known-bad release. A sentence on whether those failures are load-generator saturation vs. real gateway errors would go a long way — or the numbers could live outside the release PR.

Minor: scripts/release-automation/release-checks.json (844 lines) is added in 2ffc39fa and gone by the head commit. Net-zero, so no impact — just checking the removal was deliberate and not a rebase casualty.


Happy to re-review once the four blocking items are in. CI is otherwise green apart from pytest (py3.12) and pytest-rust, which were still pending when I looked.

@gandhipratik203

Copy link
Copy Markdown
Collaborator

Some of the ui-rewrite stuff is merged to a feature branch, e.g. #5564. Do we have to mention that into the changelog as changelog is about what got merged to the context-forge main branch?

@gcgoncalves

gcgoncalves commented Jul 21, 2026

Copy link
Copy Markdown
Collaborator

Some of the ui-rewrite stuff is merged to a feature branch, e.g. #5564. Do we have to mention that into the changelog as changelog is about what got merged to the context-forge main branch?

Nice catch, @gandhipratik203, changes on the UI rewrite branch should not be on the changelog, for now.

@msureshkumar88 msureshkumar88 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Follow-up to my earlier review — two more CHANGELOG.md items surfaced while cross-checking the 1.0.6 section against the previous release sections and the open issue tracker. Both are changelog-only, no code involved.


1. Known Issues section is missing, and four open release-time-findings issues aren't documented

All four issues currently carrying the release-time-findings label are open and unmentioned in the 1.0.6 section:

Issue Opened Summary
#5739 2026-07-21 Saving LLM Provider/Model in Admin UI fails with 403 CSRF validation failed
#5740 2026-07-21 LLM Chat sessions are in-memory only (redis_client hardcoded None) — breaks under multi-worker gunicorn
#5215 2026-06-12 LLM Chat cannot connect to a Virtual Server on the same gateway — forwarded session token rejected (401)
#5526 2026-07-06 Tools table row action button not found for JSON-schema test tool

There's good precedent for documenting these — the 1.0.3 section (CHANGELOG.md:527) carries a ### Known Issues block with an issue link and a concrete workaround, which is exactly the shape that helps here.

Two of these feel worth prioritising:

  • #5739 looks like a recurrence of #5151 — the same CSRF validation failed class of failure that 1.0.3 explicitly documented, workaround and all. Regressing on a previously-documented known issue without re-documenting it is probably the most confusing outcome for anyone upgrading.
  • #5740 is a deployment-topology hazard. With redis_client hardcoded to None, LLM Chat sessions aren't shared across workers — and multi-worker gunicorn is the default make serve path. Undocumented, that surfaces to users as intermittent, non-deterministic session loss with nothing to search for.

Suggested block for the 1.0.6 section, following the 1.0.3 format:

### Known Issues

- **🔒 CSRF Validation Failure Saving LLM Provider/Model** ([#5739](https://github.com/IBM/mcp-context-forge/issues/5739)) – Saving an LLM Provider or Model in the Admin UI fails with `403 CSRF validation failed`. Related to the previously reported [#5151](https://github.com/IBM/mcp-context-forge/issues/5151).
  - **Workaround:** Copy the `CSRF_EXEMPT_PATHS` value from `.env.example` into your `.env` and restart the application.
- **💬 LLM Chat Sessions Are In-Memory Only** ([#5740](https://github.com/IBM/mcp-context-forge/issues/5740)) – `redis_client` is hardcoded to `None`, so chat sessions are not shared across workers and are lost on restart. Under multi-worker gunicorn (the default for `make serve`), sessions will appear to drop intermittently.
  - **Workaround:** Run a single worker if session continuity is required.
- **🔗 LLM Chat Cannot Connect to a Same-Gateway Virtual Server** ([#5215](https://github.com/IBM/mcp-context-forge/issues/5215)) – The forwarded session token is rejected with a 401 by `/servers/{id}/mcp`.
- **🧪 Tools Table Row Action Button Not Found** ([#5526](https://github.com/IBM/mcp-context-forge/issues/5526)) – Affects the JSON-schema test tool.

Happy to trim the list if some of these are considered already-fixed or out of scope for 1.0.6 — the main ask is that #5739 and #5740 get a mention with a workaround.


2. CHANGELOG.md:132 — the previous release PR is listed as a 1.0.6 change

- **Release/v1.0.5** ([#5509](https://github.com/IBM/mcp-context-forge/pull/5509))

#5509 is the 1.0.5 release PR itself. It merged into main during the 1.0.6 window, so an auto-generated merged-PR list would pick it up — but it carries no user-facing change, and its actual content is the ## [1.0.5] section six lines further down.

Worth noting the earlier sections don't do this: neither 1.0.5 (no reference to #5311 / Release/v1.0.4) nor 1.0.4 self-reference the prior release PR, so this looks like a filtering difference in how the 1.0.6 list was produced rather than an intentional change.

Suggested fix: drop line 132. #5710 ("Update roadmap for 1.0.6") is arguably in the same category, though it's more defensible as release-process history — your call on that one.


Both are small edits and can ride along with the other CHANGELOG.md changes from my first review (restoring the dropped [Unreleased] entries and adding the Breaking Changes section).

@msureshkumar88 msureshkumar88 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Third and last pass from me. I reconciled the 1.0.6 CHANGELOG section against what actually landed on main since the 1.0.5 release PR (#5509, merged 2026-07-07T11:01:04Z), and the two lists diverge in both directions. Flagging it before the tag goes out because one half affects what users are told they're getting.

First, the good news: the branch itself is in good shape. origin/main is 0 commits ahead of the branch head, so nothing that landed on main is missing from the release artifact. The gap is entirely in the changelog.


1. Twenty-six changelog entries describe code that isn't in the release

The UI Modernization block is the largest section in the 1.0.6 notes, and the release title leads with "UI Rewrite". Those PRs merged into epic/ui-rewrite, not into main:

$ git merge-base --is-ancestor origin/epic/ui-rewrite origin/main
# non-zero — not contained
$ git rev-list --count origin/main..origin/epic/ui-rewrite
302

There's no PR open or merged from epic/ui-rewrite into main, and the client/ tree doesn't exist on the release branch at all:

$ git ls-tree 0a2db45ad --name-only | grep -c '^client$'
0

Spot-checking #5707's files against the branch, they're all absent (client/src/components/gateways/CreateServerForm.tsx, client/src/components/layout/HeaderQuickNav.tsx, and the rest).

Affected entries: #5375, #5398, #5512, #5518, #5540, #5541, #5546, #5548, #5550, #5561, #5564, #5575, #5604, #5606, #5609, #5612, #5632, #5636, #5638, #5662, #5666, #5670, #5675, #5695, #5707.

Also in this bucket, for a different reason: #5678 ("OCP SCC UID compatibility and Helm volumeMounts indentation") merged into fix/ensure_helm_chart_in_ci, whose PR to main (#5269) is still open — so that fix isn't shipping either.

I suspect the list was generated from merged PRs across all base branches rather than filtered to main, which would explain it cleanly. Two ways forward depending on the release plan:

  • If epic/ui-rewrite is meant to ship in 1.0.6, it needs to land on main before tagging.
  • If it isn't, these entries should move to [Unreleased] and the release title probably shouldn't lead with "UI Rewrite".

Either is fine — the thing to avoid is tagging with the notes advertising a React UI that isn't in the artifact.

2. Nine PRs that did land on main have no changelog entry

All nine merged with base=main inside the release window, and git merge-base --is-ancestor <merge_sha> 0a2db45ad confirms each is in the branch:

PR Merged Size Title
#5224 07-13 +3679/−69, 27 files feat(oauth): RFC 8693 token exchange (On-Behalf-Of) for OAuth gateways — security, MUST
#4821 07-20 +468/−109, 12 files fix(auth): unify email extraction across all resource operations — bug, MUST, regression
#5314 07-15 +838/−203, 10 files fix(schemas): persist auth_headers array in POST/PUT /tools
#5470 07-13 +2967/−154, 29 files feat(plugins): build + consume CPEX plugin trace context and metrics (G0+G1)
#5430 07-15 +1231/−54, 22 files feat(plugins): restrict non-hook plugin init to a single worker across instances
#5611 07-15 +1489/−100, 10 files feat(plugins): consume metrics from 5 remaining bundled cpex-* plugins
#5406 07-13 +488/−31, 14 files fix(plugins): restrict non-hook plugin initialization to a single worker
#5637 07-16 +1515/−2674, 1280 files Update fix_file_headers generic default AUTHOR/COPYRIGHT
#5513 07-08 +53/−73, 3 files ci(plugins): replace fast-time-server source build with pre-built image

Three of these fall into categories release-management.md §1.3 asks for by name, and I'd treat them as the ones that really need entries:

  • #5224 adds a new OAuth grant with a new trust boundary — AGENTS.md describes token_url on a token-exchange gateway as an SSRF/egress boundary that receives the user's ContextForge JWT as subject_token, and notes that creating such gateways is a privileged action. It also ships an ADR (adr/041-identity-propagation.md) and two docs pages. Worth a Security entry.
  • #4821 changes which principal RBAC evaluates and which identity appears in audit logs (the email-over-sub precedence work). It's labelled regression, so it's fixing something users hit. Worth a Fixed entry.
  • #5314 is the breaking change whose [Unreleased] text was removed in this PR — covered in my first review, but it shows up here independently, which is a useful cross-check.

The plugin worker-initialization pair (#5406, #5430) and the CPEX metrics pair (#5470, #5611) change behaviour operators will notice under multi-worker gunicorn, so a Changed line each would help. #5513 is CI-only and #5637 is a mechanical header rewrite — both fine to omit, though #5637 touching 1280 files might be worth one line so nobody is startled by the diff.

Reconciliation

Count
PR description claims 89
CHANGELOG cites 79
Actually landed on main since 1.0.5 61
Cited but not shipping 26
Shipping but not cited 9

If it's useful, filtering the generated list on base=main and cross-checking against git log <last-release-sha>..HEAD --pretty=%s should close both gaps in one pass — the repo squash-merges, so PR numbers come out of the commit subjects reliably.

Happy to re-review once this and the earlier items are sorted. Thanks for bearing with three rounds on this one — the release-notes accuracy felt worth getting right before the tag is cut.

Signed-off-by: prakhar-singh1928 <prakhar.singh1928@ibm.com>
@brian-hussey

Copy link
Copy Markdown
Member

For @msureshkumar88's (#5738 (review)) above:
1.

**Current Version: 1.0.6**
-ContextForge is currently in beta and should be treated as such until the 1.0 release. While we implement comprehensive security measures and follow best practices, important limitations exist:

Should be removed,if there is a trailing Beta Software notice that should be removed too.

  1. CHANGELOG.md — the [Unreleased] entries were removed rather than migrated - this needs to be corrected, the Unreleased section let's us track things that need additional documentation during the course of our iteration.

Signed-off-by: cafalchio <mcafalchio@gmail.com>

@brian-hussey brian-hussey left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

One small change, linked to what @msureshkumar88 had identified before.

Comment thread SECURITY.md Outdated

@msureshkumar88 msureshkumar88 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Re-reviewed at 07ded2c6a. Almost everything from the previous three rounds is in — thanks for working through all of it, that was a lot of changelog reconciliation.

Confirmed fixed:

  • Containerfile:375 now labels 1.0.6.
  • All four stale >=1.0.5 pins are gone (pyproject.toml all/dev-all, plugins/external/opa, plugins/external/cedar).
  • ### Breaking Changes is in the 1.0.6 section with the auth_headers entry and a before/after migration table.
  • ### Known Issues covers all four release-time-findings issues (#5739, #5740, #5215, #5526) with workarounds on the two that needed them.
  • The #5509 self-reference is dropped.
  • All 25 epic/ui-rewrite entries are removed, and the nine PRs that did land on main (#5224, #4821, #5314, #5470, #5430, #5611, #5406, #5637, #5513) now have entries.

Two things are left, both one-liners.

Blocking

1. SECURITY.md — heading is now orphaned

The paragraph came out, but the heading it belonged to is still there with nothing under it:

# 🔐 Security Policy

## ⚠️ Beta Software Notice

**Current Version: 1.0.6**


### Admin UI is Development-Only

Per @brian-hussey's note ("if there is a trailing Beta Software notice that should be removed too"), the ## ⚠️ Beta Software Notice heading should go as well. **Current Version: 1.0.6** can either move up under the top-level heading or get its own line — either reads fine, it just shouldn't sit under an empty section header.

2. CHANGELOG.md:118#5678 isn't shipping in this artifact

- **OCP SCC UID Compatibility** ([#5678](https://github.com/IBM/mcp-context-forge/pull/5678)) - Fixed OCP SCC UID compatibility and Helm volumeMounts indentation.

#5678 merged with base=fix/ensure_helm_chart_in_ci, and that branch's PR to main (#5269, "fix(helm): resolve Helm chart linting issues") is still open — so the fix isn't in the release branch. Same category as the epic/ui-rewrite entries; it just survived the cleanup pass. Either move it to [Unreleased], or land #5269 before tagging if the Helm fix is meant to be in 1.0.6.

Non-blocking

  • [Unreleased] is now empty. The entries were correctly migrated, but @brian-hussey's point was that the section itself is how we track items still needing docs during the iteration. Worth keeping a placeholder there rather than leaving it bare — your call whether that matters before the tag.
  • Benchmark placement. @brian-hussey asked for docs/release/test-results/ with a summary md; the results currently live at tests/performance/benchmark.md. Also still no note on whether the 7.83% / 31.56% failure rates are load-generator saturation or real gateway errors — one sentence there would stop the numbers reading as a known-bad release.
  • uv.lock exclude-newer. Still "0001-01-01T00:00:00Z" with exclude-newer-span = "P10D", so resolution drifts on each re-lock rather than pinning to a fixed date. Fine if that's the intended direction now that uv writes it this way — just want to confirm it's deliberate rather than an artifact.

Happy to approve once the two blocking items are in.

Signed-off-by: cafalchio <mcafalchio@gmail.com>
brian-hussey
brian-hussey previously approved these changes Jul 21, 2026

@brian-hussey brian-hussey left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM

@gandhipratik203 gandhipratik203 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM!

@brian-hussey
brian-hussey self-requested a review July 21, 2026 15:56

@msureshkumar88 msureshkumar88 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Re-reviewed at 29ca93c7e. Thanks for the quick turnaround on the SECURITY.md item.

Confirmed fixed:

  • SECURITY.md — the orphaned ## ⚠️ Beta Software Notice heading is gone, and **Current Version: 1.0.6** now sits directly under the top-level heading. That resolves @brian-hussey's note.

Everything else confirmed in the previous round is untouched — the only commit since 07ded2c6a is the two-line SECURITY.md deletion.

That leaves one blocking item from the last review, which I don't think was picked up.

Blocking

CHANGELOG.md:118#5678 still listed under 1.0.6, but isn't in the artifact

#### **Build & Infrastructure**

- **OCP SCC UID Compatibility** ([#5678](https://github.com/IBM/mcp-context-forge/pull/5678)) - Fixed OCP SCC UID compatibility and Helm volumeMounts indentation.

Re-verified against the current head:

$ gh pr view 5269 --json state,mergedAt,baseRefName
{"baseRefName":"main","mergedAt":null,"state":"OPEN"}

$ git log --oneline origin/Release/v1.0.6 | grep '#5678'
# no match

#5678 merged with base=fix/ensure_helm_chart_in_ci, and that branch's PR to main (#5269, "fix(helm): resolve Helm chart linting issues") is still open — so the Helm/SCC fix isn't on the release branch. Same category as the epic/ui-rewrite entries that were cleaned up; this one just survived the pass.

Two ways to close it, whichever fits the release plan:

  • Move the line to [Unreleased] — this also gives that section the placeholder @brian-hussey wanted, so it'd close both items at once.
  • Or land #5269 before tagging, if the Helm fix is meant to be in 1.0.6.

The concern is only that a user reading the 1.0.6 notes would expect the OCP SCC UID fix to be in the image, and it isn't.

Non-blocking (carried over, no change needed to approve)

  • Benchmark results are still at tests/performance/benchmark.md rather than docs/release/test-results/ with a summary, and there's still no note on whether the 7.83% / 31.56% figures are load-generator saturation or real gateway errors. One sentence would stop those numbers reading as a known-bad release.
  • uv.lock still has exclude-newer = "0001-01-01T00:00:00Z" with exclude-newer-span = "P10D". Fine if that's deliberate now that uv writes it this way — just flagging so it's a choice rather than an artifact.

Happy to approve as soon as the changelog line is moved (or #5269 lands). Sorry to hold on a one-liner after everything else you've reconciled — it's the last one from my side.

Signed-off-by: cafalchio <mcafalchio@gmail.com>
@cafalchio
cafalchio dismissed stale reviews from gandhipratik203 and brian-hussey via 76890d8 July 21, 2026 16:04

@msureshkumar88 msureshkumar88 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Re-reviewed at 76890d861. The #5678 entry is out of the Build & Infrastructure list and the PR count is correctly adjusted 89 → 88 — thanks for that, and for moving the benchmark to docs/release/.

One residual of the same item, in the Overview bullet rather than the entry list.

Blocking

CHANGELOG.md:25 — Overview still advertises the OCP SCC UID fix

07ded2c6a..76890d861 removed "Helm volumeMounts indentation fix" from this line but left the other half:

- **CI / DevOps** - PR-scoped pyright workflow, s390x build flag, remove Slack direct-merge notification, remove Renovate in favour of Dependabot, Redis maxclients increase, OCP SCC UID compatibility.

Both halves came from #5678, which still isn't in the artifact:

$ gh pr view 5269 --json state,mergedAt
{"mergedAt":null,"state":"OPEN"}

$ git grep -n 'runAsUser' origin/Release/v1.0.6 -- charts/
charts/mcp-stack/values.yaml:157:    runAsUser: 10001
charts/mcp-stack/templates/job-migration.yaml:31:        runAsUser: 10001

The hardcoded UID that #5678 removes is still there, so a user reading the 1.0.6 Overview would expect SCC compatibility in the image and not get it — same concern as the entry that was just removed.

Exact fix:

-- **CI / DevOps** - PR-scoped pyright workflow, s390x build flag, remove Slack direct-merge notification, remove Renovate in favour of Dependabot, Redis maxclients increase, OCP SCC UID compatibility.
+- **CI / DevOps** - PR-scoped pyright workflow, s390x build flag, remove Slack direct-merge notification, remove Renovate in favour of Dependabot, Redis maxclients increase.

Or land #5269 before tagging, if the Helm/SCC fix is meant to be in 1.0.6.

Happy to approve as soon as this line is in — it's the last blocking one from my side.

Comment thread CHANGELOG.md
Signed-off-by: prakhar-singh1928 <prakhar.singh1928@ibm.com>

@madhu-mohan-jaishankar madhu-mohan-jaishankar left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM

msureshkumar88
msureshkumar88 previously approved these changes Jul 21, 2026

@msureshkumar88 msureshkumar88 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Re-reviewed at f3f0950cd. The last blocking item is closed — thanks for staying with this through five rounds of changelog reconciliation, that was a lot of cross-checking.

Confirmed fixed:

  • CHANGELOG.md:25 — "OCP SCC UID compatibility" is out of the CI / DevOps Overview bullet. The line now reads through "Redis maxclients increase", with no reference to #5678 anywhere in the 1.0.6 section:
$ git grep -n -iE 'OCP|SCC|5678' origin/Release/v1.0.6 -- CHANGELOG.md
CHANGELOG.md:893:  ... (1.0.3 section)
CHANGELOG.md:951:  ... (1.0.3 section)

Both remaining hits are in the historical 1.0.3 block, which is correct.

Full recap of what's now resolved across the earlier rounds:

  • SECURITY.md — beta paragraph and its orphaned ## ⚠️ Beta Software Notice heading removed; **Current Version: 1.0.6** sits under the top-level heading.
  • Containerfile:375 labels 1.0.6, and all four stale >=1.0.5 pins are gone (pyproject.toml all/dev-all, plugins/external/opa, plugins/external/cedar).
  • ### Breaking Changes covers auth_headers with a before/after migration table.
  • ### Known Issues covers all four release-time-findings issues (#5739, #5740, #5215, #5526), with workarounds on the two that needed them.
  • All 25 epic/ui-rewrite entries removed, the nine PRs that did land on main added, and the #5678 entry dropped with the PR count adjusted 89 → 88.
  • Load-test summary captured at docs/release/benchmark.md, per @brian-hussey's request.

The version bump itself remains consistent across .bumpversion.cfg, mcpgateway/__init__.py, Cargo.toml/Cargo.lock, pyproject.toml, uv.lock, and charts/mcp-stack/Chart.yaml, and origin/main is still 0 commits ahead of the branch head, so the artifact matches what's documented.

LGTM — good to tag.

brian-hussey
brian-hussey previously approved these changes Jul 21, 2026

@brian-hussey brian-hussey left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM

Signed-off-by: cafalchio <mcafalchio@gmail.com>

@brian-hussey brian-hussey left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM. Thanks @cafalchio and @prakhar-singh1928 and team!

@ja8zyjits ja8zyjits left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM

@ja8zyjits
ja8zyjits added this pull request to the merge queue Jul 21, 2026
Merged via the queue into main with commit d24df05 Jul 21, 2026
71 checks passed
@ja8zyjits
ja8zyjits deleted the Release/v1.0.6 branch July 21, 2026 17:08
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.

8 participants