From 99f71e73b13e68e624a74d0e782af92380cffa5d Mon Sep 17 00:00:00 2001 From: atharva-bhange Date: Thu, 23 Jul 2026 19:08:02 +0530 Subject: [PATCH 1/9] docs(changelog): add automation insertion marker Co-Authored-By: Claude Fable 5 --- src/pages/changelog.mdx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/pages/changelog.mdx b/src/pages/changelog.mdx index 47b2945dc..bef7ab3fd 100644 --- a/src/pages/changelog.mdx +++ b/src/pages/changelog.mdx @@ -8,6 +8,8 @@ import Callout from '../components/docs/Callout.astro'; Stay up to date with the latest features, improvements, and bug fixes. +{/* changelog:insert-below — automation inserts new releases here; do not remove */} + ## v2.0.0 - December 2024 From f5917916ce9c25ba88f295b47cb47cfb6be5bbaf Mon Sep 17 00:00:00 2001 From: atharva-bhange Date: Thu, 23 Jul 2026 19:08:02 +0530 Subject: [PATCH 2/9] ci(changelog): add release transform script with tests Co-Authored-By: Claude Fable 5 --- scripts/changelog-from-release.mjs | 58 +++++++++++++++++++++++++ scripts/changelog-from-release.test.mjs | 49 +++++++++++++++++++++ 2 files changed, 107 insertions(+) create mode 100644 scripts/changelog-from-release.mjs create mode 100644 scripts/changelog-from-release.test.mjs diff --git a/scripts/changelog-from-release.mjs b/scripts/changelog-from-release.mjs new file mode 100644 index 000000000..4d5a572f4 --- /dev/null +++ b/scripts/changelog-from-release.mjs @@ -0,0 +1,58 @@ +#!/usr/bin/env node +// Transforms a GitHub Release body (release-please format) into a changelog.mdx +// section and inserts it below the marker. Usage: +// node scripts/changelog-from-release.mjs +import { readFileSync, writeFileSync } from "node:fs"; + +const MARKER = "{/* changelog:insert-below — automation inserts new releases here; do not remove */}"; +const SECTION_MAP = new Map([ + ["Features", "New Features"], + ["Bug Fixes", "Bug Fixes"], + ["Performance Improvements", "Improvements"], + ["Reverts", "Reverts"], +]); + +export function transform(version, body, now = new Date()) { + const month = now.toLocaleString("en-US", { month: "long", year: "numeric" }); + const lines = body.split("\n"); + const out = [`## ${version} - ${month}`, ""]; + let currentMapped = null; + let breaking = []; + let inBreaking = false; + for (const line of lines) { + const h = line.match(/^#{2,3}\s+(.*)$/); + if (h) { + const title = h[1].trim(); + if (/BREAKING CHANGES/i.test(title)) { inBreaking = true; currentMapped = null; continue; } + inBreaking = false; + currentMapped = SECTION_MAP.get(title) ?? null; + if (currentMapped) out.push(`### ${currentMapped}`, ""); + continue; + } + if (inBreaking && line.trim().startsWith("*")) breaking.push(line.replace(/^\s*\*/, "-")); + else if (currentMapped && line.trim().startsWith("*")) out.push(line.replace(/^\s*\*/, "-")); + else if (currentMapped && line.trim() === "") { + if (out[out.length - 1] !== "") out.push(""); + } + } + if (breaking.length) out.push("### Breaking Changes", "", ...breaking, ""); + if (out[out.length - 1] !== "") out.push(""); + out.push("---", ""); + return out.join("\n"); +} + +export function insert(changelog, section) { + const idx = changelog.indexOf(MARKER); + if (idx === -1) throw new Error("changelog marker not found"); + const insertAt = idx + MARKER.length; + return changelog.slice(0, insertAt) + "\n\n" + section.trimEnd() + "\n" + changelog.slice(insertAt); +} + +const isMain = process.argv[1] && import.meta.url.endsWith(process.argv[1].split("/").pop()); +if (isMain && process.argv.length >= 5) { + const [, , version, bodyFile, changelogFile] = process.argv; + const body = readFileSync(bodyFile, "utf8"); + const changelog = readFileSync(changelogFile, "utf8"); + writeFileSync(changelogFile, insert(changelog, transform(version, body))); + console.log(`Inserted ${version} into ${changelogFile}`); +} diff --git a/scripts/changelog-from-release.test.mjs b/scripts/changelog-from-release.test.mjs new file mode 100644 index 000000000..96378261b --- /dev/null +++ b/scripts/changelog-from-release.test.mjs @@ -0,0 +1,49 @@ +import { test } from "node:test"; +import assert from "node:assert/strict"; +import { transform, insert } from "./changelog-from-release.mjs"; + +const RELEASE_BODY = `## [2.1.0](https://github.com/future-agi/future-agi/compare/v2.0.0...v2.1.0) (2026-08-01) + +### ⚠ BREAKING CHANGES + +* **api:** remove deprecated /v1/eval endpoint + +### Features + +* **observe:** session-level trace grouping ([#901](https://github.com/future-agi/future-agi/pull/901)) +* **gateway:** streaming responses ([#905](https://github.com/future-agi/future-agi/pull/905)) + +### Bug Fixes + +* **tracer:** off-by-one in span pagination ([#903](https://github.com/future-agi/future-agi/pull/903)) + +### Chores + +* bump deps ([#900](https://github.com/future-agi/future-agi/pull/900)) +`; + +test("transform maps release-please sections to changelog sections", () => { + const s = transform("v2.1.0", RELEASE_BODY, new Date("2026-08-01T00:00:00Z")); + assert.match(s, /^## v2\.1\.0 - August 2026/m); + assert.match(s, /^### New Features/m); + assert.match(s, /session-level trace grouping/); + assert.match(s, /^### Bug Fixes/m); + assert.match(s, /^### Breaking Changes/m); + assert.match(s, /remove deprecated \/v1\/eval endpoint/); + assert.doesNotMatch(s, /Chores/); + assert.doesNotMatch(s, /bump deps/); + assert.match(s, /---\s*$/); +}); + +test("insert places section after marker and preserves the rest", () => { + const changelog = `intro\n\n{/* changelog:insert-below — automation inserts new releases here; do not remove */}\n\n## v2.0.0 - July 2026\nold entry\n`; + const out = insert(changelog, "## v2.1.0 - August 2026\nnew\n\n---"); + const iMarker = out.indexOf("changelog:insert-below"); + const iNew = out.indexOf("## v2.1.0"); + const iOld = out.indexOf("## v2.0.0"); + assert.ok(iMarker < iNew && iNew < iOld); +}); + +test("insert throws when marker missing", () => { + assert.throws(() => insert("no marker here", "x"), /marker not found/); +}); From 2bdd45a0aaad214d402122f6e3357ff6fa708627 Mon Sep 17 00:00:00 2001 From: atharva-bhange Date: Thu, 23 Jul 2026 19:08:02 +0530 Subject: [PATCH 3/9] ci(changelog): open changelog PR on platform-release dispatch Co-Authored-By: Claude Fable 5 --- .github/workflows/changelog-sync.yml | 45 ++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 .github/workflows/changelog-sync.yml diff --git a/.github/workflows/changelog-sync.yml b/.github/workflows/changelog-sync.yml new file mode 100644 index 000000000..1d9b76e57 --- /dev/null +++ b/.github/workflows/changelog-sync.yml @@ -0,0 +1,45 @@ +# Receives platform-release dispatch and opens an editorial PR adding the new +# version to the changelog page (RELEASE-PROCESS-PLAN.md §5.4). +name: changelog-sync + +on: + repository_dispatch: + types: [platform-release] + +permissions: + contents: write + pull-requests: write + +jobs: + open-changelog-pr: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: 20 + - name: Generate changelog entry + env: + VERSION: ${{ github.event.client_payload.version }} + BODY_B64: ${{ github.event.client_payload.release_body_b64 }} + run: | + set -eu + printf '%s' "$BODY_B64" | base64 -d > /tmp/release-body.md + node scripts/changelog-from-release.mjs "$VERSION" /tmp/release-body.md src/pages/changelog.mdx + - name: Open PR + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + VERSION: ${{ github.event.client_payload.version }} + RELEASE_URL: ${{ github.event.client_payload.release_url }} + run: | + set -eu + branch="chore/changelog-${VERSION}" + git config user.name "futureagi-release-bot" + git config user.email "release-bot@futureagi.com" + git switch -c "$branch" + git add src/pages/changelog.mdx + git commit -m "docs(changelog): add ${VERSION}" + git push origin "$branch" + gh pr create --base main --head "$branch" \ + --title "docs(changelog): ${VERSION}" \ + --body "Auto-generated from the [${VERSION} release notes](${RELEASE_URL}). Edit for a product audience before merging — rewrite or drop raw commit bullets; merging as-is is acceptable." From 4fd5ce28d97922a59b8745985cd853075e7db907 Mon Sep 17 00:00:00 2001 From: atharva-bhange Date: Thu, 23 Jul 2026 23:19:49 +0530 Subject: [PATCH 4/9] docs(changelog): remove placeholder version entries MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Wipe the fictional v1.0.0–v2.0.0 entries so the page starts empty, ready for the first real automated release below the insert marker. Drop the now unused Callout import. Co-Authored-By: Claude Fable 5 --- src/pages/changelog.mdx | 107 ---------------------------------------- 1 file changed, 107 deletions(-) diff --git a/src/pages/changelog.mdx b/src/pages/changelog.mdx index bef7ab3fd..020a2b7b2 100644 --- a/src/pages/changelog.mdx +++ b/src/pages/changelog.mdx @@ -4,113 +4,6 @@ title: Changelog description: Latest updates and improvements to Future AGI. --- -import Callout from '../components/docs/Callout.astro'; - Stay up to date with the latest features, improvements, and bug fixes. {/* changelog:insert-below — automation inserts new releases here; do not remove */} - -## v2.0.0 - December 2024 - - - This is a major release with significant improvements to evaluation, tracing, and the overall developer experience. - - -### New Features - -- **70+ Evaluation Metrics** - Expanded metric library covering quality, safety, RAG, and more -- **Agent Compass** - New error analysis system for debugging AI agents -- **Prompt Optimization** - Bayesian optimization and meta-prompting algorithms -- **Session Management** - Group related traces into user sessions -- **Real-time Streaming** - Support for streaming responses in tracing - -### Improvements - -- 3x faster evaluation performance -- Reduced API latency by 40% -- New dark mode dashboard -- Improved code block syntax highlighting - -### Breaking Changes - -- `client.eval()` renamed to `client.evaluate()` -- Minimum Python version is now 3.8 -- Removed deprecated `callback` parameter - ---- - -## v1.5.0 - November 2024 - -### New Features - -- **Custom Metrics** - Define your own evaluation metrics -- **CI/CD Integration** - GitHub Actions and GitLab CI support -- **Cost Tracking** - Monitor AI spending across projects - -### Improvements - -- Better error messages -- Improved documentation -- New LangChain integration features - ---- - -## v1.4.0 - October 2024 - -### New Features - -- **LlamaIndex Integration** - Full support for LlamaIndex pipelines -- **Batch Evaluation** - Evaluate multiple samples efficiently -- **Dataset Management** - Create and manage evaluation datasets - -### Bug Fixes - -- Fixed memory leak in long-running traces -- Resolved authentication timeout issues -- Fixed incorrect token counting for Claude models - ---- - -## v1.3.0 - September 2024 - -### New Features - -- **Anthropic Integration** - Support for Claude models -- **Safety Metrics** - Toxicity, bias, and PII detection -- **Export API** - Export traces to your data warehouse - ---- - -## v1.2.0 - August 2024 - -### New Features - -- **RAG Evaluation** - Context relevance and groundedness metrics -- **Team Collaboration** - Invite team members to projects -- **Webhooks** - Real-time notifications for events - ---- - -## v1.1.0 - July 2024 - -### New Features - -- **OpenAI Integration** - Automatic tracing for OpenAI calls -- **Dashboard v2** - Redesigned UI with better visualization -- **Alerts** - Set up alerts for anomalies - ---- - -## v1.0.0 - June 2024 - - - Initial public release! - - -### Features - -- Core evaluation framework -- Basic tracing and observability -- LangChain integration -- REST API -- Python SDK From 9f0d647205cb2ab2e8e9e9ebf571e5929341d3c4 Mon Sep 17 00:00:00 2001 From: atharva-bhange Date: Thu, 23 Jul 2026 23:19:49 +0530 Subject: [PATCH 5/9] fix(changelog): escape MDX-significant chars in release body Add escapeMdx() and apply it to bullet lines in mapped sections and breaking-changes lines so <, { and } in release notes can't break the MDX build. Add a test covering the escaping and a lockstep comment tying SECTION_MAP to release-please-config.json. Co-Authored-By: Claude Fable 5 --- scripts/changelog-from-release.mjs | 15 +++++++++++++-- scripts/changelog-from-release.test.mjs | 22 +++++++++++++++++++++- 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/scripts/changelog-from-release.mjs b/scripts/changelog-from-release.mjs index 4d5a572f4..81f4d8486 100644 --- a/scripts/changelog-from-release.mjs +++ b/scripts/changelog-from-release.mjs @@ -5,6 +5,17 @@ import { readFileSync, writeFileSync } from "node:fs"; const MARKER = "{/* changelog:insert-below — automation inserts new releases here; do not remove */}"; + +// Escape characters that are syntactically significant in MDX ({/} for JSX +// expressions, < for JSX tags) so release-body content can't break the build. +export function escapeMdx(text) { + return text + .replace(/ { test("insert throws when marker missing", () => { assert.throws(() => insert("no marker here", "x"), /marker not found/); }); + +test("transform escapes MDX-significant characters in release body content", () => { + const body = `### Features + +* **render:** wrap output in and interpolate {expr} safely + +### ⚠ BREAKING CHANGES + +* **api:** now takes {options} instead of positional args +`; + const s = transform("v3.0.0", body, new Date("2026-09-01T00:00:00Z")); + assert.match(s, /<Tag>/); + assert.match(s, /{expr}/); + assert.match(s, /<Config>/); + assert.match(s, /{options}/); + assert.doesNotMatch(s, //); + assert.doesNotMatch(s, /\{expr\}/); + assert.doesNotMatch(s, //); + assert.doesNotMatch(s, /\{options\}/); +}); From d41885918004455005a2f27aa858ca4be4c8d922 Mon Sep 17 00:00:00 2001 From: atharva-bhange Date: Fri, 24 Jul 2026 17:00:54 +0530 Subject: [PATCH 6/9] fix(release-notes): target docs/release-notes page, not the orphan changelog MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The sync was pointed at src/pages/changelog.mdx — orphan scaffold with no navigation links. The real, actively maintained surface is src/pages/docs/release-notes.mdx (weekly product-voice entries). Transform now emits that page's exact format (styled wrapper + Features / Bugs/Improvements / Breaking Changes subsections, Bug Fixes + Performance merged into the existing Bugs/Improvements bucket) and inserts new versions on top of the existing entries. Orphan changelog.mdx deleted. Tests: 5/5. Co-Authored-By: Claude Fable 5 --- .github/workflows/changelog-sync.yml | 10 +-- scripts/changelog-from-release.mjs | 85 ++++++++++++++----------- scripts/changelog-from-release.test.mjs | 61 ++++++++++-------- src/pages/changelog.mdx | 9 --- src/pages/docs/release-notes.mdx | 2 + 5 files changed, 87 insertions(+), 80 deletions(-) delete mode 100644 src/pages/changelog.mdx diff --git a/.github/workflows/changelog-sync.yml b/.github/workflows/changelog-sync.yml index 1d9b76e57..5f3217f06 100644 --- a/.github/workflows/changelog-sync.yml +++ b/.github/workflows/changelog-sync.yml @@ -1,5 +1,5 @@ # Receives platform-release dispatch and opens an editorial PR adding the new -# version to the changelog page (RELEASE-PROCESS-PLAN.md §5.4). +# version to the top of the release-notes page (RELEASE-PROCESS-PLAN.md §5.4). name: changelog-sync on: @@ -25,7 +25,7 @@ jobs: run: | set -eu printf '%s' "$BODY_B64" | base64 -d > /tmp/release-body.md - node scripts/changelog-from-release.mjs "$VERSION" /tmp/release-body.md src/pages/changelog.mdx + node scripts/changelog-from-release.mjs "$VERSION" /tmp/release-body.md src/pages/docs/release-notes.mdx - name: Open PR env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -37,9 +37,9 @@ jobs: git config user.name "futureagi-release-bot" git config user.email "release-bot@futureagi.com" git switch -c "$branch" - git add src/pages/changelog.mdx - git commit -m "docs(changelog): add ${VERSION}" + git add src/pages/docs/release-notes.mdx + git commit -m "docs(release-notes): add ${VERSION}" git push origin "$branch" gh pr create --base main --head "$branch" \ - --title "docs(changelog): ${VERSION}" \ + --title "docs(release-notes): ${VERSION}" \ --body "Auto-generated from the [${VERSION} release notes](${RELEASE_URL}). Edit for a product audience before merging — rewrite or drop raw commit bullets; merging as-is is acceptable." diff --git a/scripts/changelog-from-release.mjs b/scripts/changelog-from-release.mjs index 81f4d8486..d123f81d1 100644 --- a/scripts/changelog-from-release.mjs +++ b/scripts/changelog-from-release.mjs @@ -1,13 +1,34 @@ #!/usr/bin/env node -// Transforms a GitHub Release body (release-please format) into a changelog.mdx -// section and inserts it below the marker. Usage: -// node scripts/changelog-from-release.mjs +// Transforms a GitHub Release body (release-please format) into a section for +// src/pages/docs/release-notes.mdx — matching that page's existing convention +// (## heading + styled wrapper div + "Features" / "Bugs/Improvements" +// subsections) — and inserts it below the marker, on top of existing entries. +// Usage: +// node scripts/changelog-from-release.mjs import { readFileSync, writeFileSync } from "node:fs"; -const MARKER = "{/* changelog:insert-below — automation inserts new releases here; do not remove */}"; +const MARKER = "{/* release-notes:insert-below — automation inserts new releases here; do not remove */}"; + +// Must stay in lockstep with the visible changelog-sections in +// future-agi/future-agi release-please-config.json — a visible section missing +// here is silently dropped from the release-notes page. +// Maps release-please section -> release-notes subsection (several merge into +// the page's existing "Bugs/Improvements" bucket). +const SECTION_MAP = new Map([ + ["Features", "Features"], + ["Bug Fixes", "Bugs/Improvements"], + ["Performance Improvements", "Bugs/Improvements"], + ["Reverts", "Bugs/Improvements"], +]); +const SUBSECTION_ORDER = ["Features", "Bugs/Improvements", "Breaking Changes"]; + +const WRAPPER_OPEN = '
'; +const subsectionHeading = (title) => `
${title}
`; // Escape characters that are syntactically significant in MDX ({/} for JSX // expressions, < for JSX tags) so release-body content can't break the build. +// Applied to release-body content lines only — never to the markup this +// script generates itself. export function escapeMdx(text) { return text .replace(/ [k, []])); + let current = null; + for (const line of body.split("\n")) { const h = line.match(/^#{2,3}\s+(.*)$/); if (h) { const title = h[1].trim(); - if (/BREAKING CHANGES/i.test(title)) { inBreaking = true; currentMapped = null; continue; } - inBreaking = false; - currentMapped = SECTION_MAP.get(title) ?? null; - if (currentMapped) out.push(`### ${currentMapped}`, ""); + current = /BREAKING CHANGES/i.test(title) ? "Breaking Changes" : SECTION_MAP.get(title) ?? null; continue; } - if (inBreaking && line.trim().startsWith("*")) breaking.push(escapeMdx(line.replace(/^\s*\*/, "-"))); - else if (currentMapped && line.trim().startsWith("*")) out.push(escapeMdx(line.replace(/^\s*\*/, "-"))); - else if (currentMapped && line.trim() === "") { - if (out[out.length - 1] !== "") out.push(""); + if (current && line.trim().startsWith("*")) { + buckets.get(current).push(escapeMdx(line.replace(/^\s*\*/, "-"))); } } - if (breaking.length) out.push("### Breaking Changes", "", ...breaking, ""); - if (out[out.length - 1] !== "") out.push(""); - out.push("---", ""); + const out = [`## ${version} (${date})`, "", WRAPPER_OPEN, ""]; + for (const title of SUBSECTION_ORDER) { + const bullets = buckets.get(title); + if (!bullets.length) continue; + out.push(subsectionHeading(title), "", ...bullets.flatMap((b) => [b, ""])); + } + out.push("
", ""); return out.join("\n"); } -export function insert(changelog, section) { - const idx = changelog.indexOf(MARKER); - if (idx === -1) throw new Error("changelog marker not found"); +export function insert(releaseNotes, section) { + const idx = releaseNotes.indexOf(MARKER); + if (idx === -1) throw new Error("release-notes marker not found"); const insertAt = idx + MARKER.length; - return changelog.slice(0, insertAt) + "\n\n" + section.trimEnd() + "\n" + changelog.slice(insertAt); + return releaseNotes.slice(0, insertAt) + "\n\n" + section.trimEnd() + "\n" + releaseNotes.slice(insertAt); } const isMain = process.argv[1] && import.meta.url.endsWith(process.argv[1].split("/").pop()); if (isMain && process.argv.length >= 5) { - const [, , version, bodyFile, changelogFile] = process.argv; + const [, , version, bodyFile, notesFile] = process.argv; const body = readFileSync(bodyFile, "utf8"); - const changelog = readFileSync(changelogFile, "utf8"); - writeFileSync(changelogFile, insert(changelog, transform(version, body))); - console.log(`Inserted ${version} into ${changelogFile}`); + const notes = readFileSync(notesFile, "utf8"); + writeFileSync(notesFile, insert(notes, transform(version, body))); + console.log(`Inserted ${version} into ${notesFile}`); } diff --git a/scripts/changelog-from-release.test.mjs b/scripts/changelog-from-release.test.mjs index b977d19b8..405167038 100644 --- a/scripts/changelog-from-release.test.mjs +++ b/scripts/changelog-from-release.test.mjs @@ -2,7 +2,7 @@ import { test } from "node:test"; import assert from "node:assert/strict"; import { transform, insert, escapeMdx } from "./changelog-from-release.mjs"; -const RELEASE_BODY = `## [2.1.0](https://github.com/future-agi/future-agi/compare/v2.0.0...v2.1.0) (2026-08-01) +const RELEASE_BODY = `## [1.23.1](https://github.com/future-agi/future-agi/compare/v1.23.0...v1.23.1) (2026-08-01) ### ⚠ BREAKING CHANGES @@ -17,30 +17,45 @@ const RELEASE_BODY = `## [2.1.0](https://github.com/future-agi/future-agi/compar * **tracer:** off-by-one in span pagination ([#903](https://github.com/future-agi/future-agi/pull/903)) +### Performance Improvements + +* **eval-task:** batch ClickHouse reads ([#907](https://github.com/future-agi/future-agi/pull/907)) + ### Chores * bump deps ([#900](https://github.com/future-agi/future-agi/pull/900)) `; -test("transform maps release-please sections to changelog sections", () => { - const s = transform("v2.1.0", RELEASE_BODY, new Date("2026-08-01T00:00:00Z")); - assert.match(s, /^## v2\.1\.0 - August 2026/m); - assert.match(s, /^### New Features/m); +test("transform emits release-notes page format with merged buckets", () => { + const s = transform("v1.23.1", RELEASE_BODY, new Date("2026-08-01T00:00:00Z")); + assert.match(s, /^## v1\.23\.1 \(2026-08-01\)/m); + assert.match(s, /class="mb-12 pb-8 border-b/); + assert.match(s, /text-lg font-semibold">Features<\/div>/); assert.match(s, /session-level trace grouping/); - assert.match(s, /^### Bug Fixes/m); - assert.match(s, /^### Breaking Changes/m); + // Bug Fixes AND Performance Improvements merge into Bugs/Improvements + assert.match(s, /text-lg font-semibold">Bugs\/Improvements<\/div>/); + assert.match(s, /off-by-one in span pagination/); + assert.match(s, /batch ClickHouse reads/); + assert.match(s, /text-lg font-semibold">Breaking Changes<\/div>/); assert.match(s, /remove deprecated \/v1\/eval endpoint/); assert.doesNotMatch(s, /Chores/); assert.doesNotMatch(s, /bump deps/); - assert.match(s, /---\s*$/); + assert.match(s, /<\/div>\s*$/); }); -test("insert places section after marker and preserves the rest", () => { - const changelog = `intro\n\n{/* changelog:insert-below — automation inserts new releases here; do not remove */}\n\n## v2.0.0 - July 2026\nold entry\n`; - const out = insert(changelog, "## v2.1.0 - August 2026\nnew\n\n---"); - const iMarker = out.indexOf("changelog:insert-below"); - const iNew = out.indexOf("## v2.1.0"); - const iOld = out.indexOf("## v2.0.0"); +test("transform omits empty subsections", () => { + const s = transform("v1.23.2", "### Bug Fixes\n\n* **ui:** fix button\n", new Date("2026-08-02T00:00:00Z")); + assert.doesNotMatch(s, />FeaturesBreaking ChangesBugs\/Improvements { + const page = `---\ntitle: "x"\n---\n\n{/* release-notes:insert-below — automation inserts new releases here; do not remove */}\n\n## Week of 2026-06-18\nold entry\n`; + const out = insert(page, "## v1.23.1 (2026-08-01)\nnew\n"); + const iMarker = out.indexOf("release-notes:insert-below"); + const iNew = out.indexOf("## v1.23.1"); + const iOld = out.indexOf("## Week of 2026-06-18"); assert.ok(iMarker < iNew && iNew < iOld); }); @@ -48,22 +63,12 @@ test("insert throws when marker missing", () => { assert.throws(() => insert("no marker here", "x"), /marker not found/); }); -test("transform escapes MDX-significant characters in release body content", () => { - const body = `### Features - -* **render:** wrap output in and interpolate {expr} safely - -### ⚠ BREAKING CHANGES - -* **api:** now takes {options} instead of positional args -`; - const s = transform("v3.0.0", body, new Date("2026-09-01T00:00:00Z")); +test("MDX-significant characters in release bullets are escaped", () => { + const body = "### Bug Fixes\n\n* **gateway:** handle and {expr} in payloads\n"; + const s = transform("v1.23.3", body, new Date("2026-08-03T00:00:00Z")); assert.match(s, /<Tag>/); assert.match(s, /{expr}/); - assert.match(s, /<Config>/); - assert.match(s, /{options}/); assert.doesNotMatch(s, //); assert.doesNotMatch(s, /\{expr\}/); - assert.doesNotMatch(s, //); - assert.doesNotMatch(s, /\{options\}/); + assert.equal(escapeMdx("{b}"), "<a>{b}"); }); diff --git a/src/pages/changelog.mdx b/src/pages/changelog.mdx deleted file mode 100644 index 020a2b7b2..000000000 --- a/src/pages/changelog.mdx +++ /dev/null @@ -1,9 +0,0 @@ ---- -layout: ../layouts/DocsLayout.astro -title: Changelog -description: Latest updates and improvements to Future AGI. ---- - -Stay up to date with the latest features, improvements, and bug fixes. - -{/* changelog:insert-below — automation inserts new releases here; do not remove */} diff --git a/src/pages/docs/release-notes.mdx b/src/pages/docs/release-notes.mdx index a51a4fe58..724068bd9 100644 --- a/src/pages/docs/release-notes.mdx +++ b/src/pages/docs/release-notes.mdx @@ -3,6 +3,8 @@ title: "Future AGI Release Notes: Features, Fixes, and Updates" description: "Latest Future AGI release notes covering new features, improvements, and bug fixes across datasets, evaluations, simulation, and observability products." --- +{/* release-notes:insert-below — automation inserts new releases here; do not remove */} + ## Week of 2026-06-18
From 0558d1fd4009c42aaa444012b9955f16a8c019a5 Mon Sep 17 00:00:00 2001 From: atharva-bhange Date: Fri, 24 Jul 2026 17:08:39 +0530 Subject: [PATCH 7/9] docs(changelog): restore changelog.mdx untouched MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Owner decision: this PR no longer touches the changelog page at all — neither deletion nor placeholder wipe. It is restored byte-identical to main. The release-notes sync is unaffected (targets docs/release-notes.mdx). Co-Authored-By: Claude Fable 5 --- src/pages/changelog.mdx | 114 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 src/pages/changelog.mdx diff --git a/src/pages/changelog.mdx b/src/pages/changelog.mdx new file mode 100644 index 000000000..47b2945dc --- /dev/null +++ b/src/pages/changelog.mdx @@ -0,0 +1,114 @@ +--- +layout: ../layouts/DocsLayout.astro +title: Changelog +description: Latest updates and improvements to Future AGI. +--- + +import Callout from '../components/docs/Callout.astro'; + +Stay up to date with the latest features, improvements, and bug fixes. + +## v2.0.0 - December 2024 + + + This is a major release with significant improvements to evaluation, tracing, and the overall developer experience. + + +### New Features + +- **70+ Evaluation Metrics** - Expanded metric library covering quality, safety, RAG, and more +- **Agent Compass** - New error analysis system for debugging AI agents +- **Prompt Optimization** - Bayesian optimization and meta-prompting algorithms +- **Session Management** - Group related traces into user sessions +- **Real-time Streaming** - Support for streaming responses in tracing + +### Improvements + +- 3x faster evaluation performance +- Reduced API latency by 40% +- New dark mode dashboard +- Improved code block syntax highlighting + +### Breaking Changes + +- `client.eval()` renamed to `client.evaluate()` +- Minimum Python version is now 3.8 +- Removed deprecated `callback` parameter + +--- + +## v1.5.0 - November 2024 + +### New Features + +- **Custom Metrics** - Define your own evaluation metrics +- **CI/CD Integration** - GitHub Actions and GitLab CI support +- **Cost Tracking** - Monitor AI spending across projects + +### Improvements + +- Better error messages +- Improved documentation +- New LangChain integration features + +--- + +## v1.4.0 - October 2024 + +### New Features + +- **LlamaIndex Integration** - Full support for LlamaIndex pipelines +- **Batch Evaluation** - Evaluate multiple samples efficiently +- **Dataset Management** - Create and manage evaluation datasets + +### Bug Fixes + +- Fixed memory leak in long-running traces +- Resolved authentication timeout issues +- Fixed incorrect token counting for Claude models + +--- + +## v1.3.0 - September 2024 + +### New Features + +- **Anthropic Integration** - Support for Claude models +- **Safety Metrics** - Toxicity, bias, and PII detection +- **Export API** - Export traces to your data warehouse + +--- + +## v1.2.0 - August 2024 + +### New Features + +- **RAG Evaluation** - Context relevance and groundedness metrics +- **Team Collaboration** - Invite team members to projects +- **Webhooks** - Real-time notifications for events + +--- + +## v1.1.0 - July 2024 + +### New Features + +- **OpenAI Integration** - Automatic tracing for OpenAI calls +- **Dashboard v2** - Redesigned UI with better visualization +- **Alerts** - Set up alerts for anomalies + +--- + +## v1.0.0 - June 2024 + + + Initial public release! + + +### Features + +- Core evaluation framework +- Basic tracing and observability +- LangChain integration +- REST API +- Python SDK From 1a11d8d636a30f42f97d03aa7573de7a2253dcb6 Mon Sep 17 00:00:00 2001 From: atharva-bhange Date: Tue, 28 Jul 2026 11:43:31 +0530 Subject: [PATCH 8/9] ci(changelog): open the release-notes PR with the App token, not GITHUB_TOKEN MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The org forbids GitHub Actions from creating PRs with GITHUB_TOKEN; App installation tokens are exempt (release bot App already installed on this repo). Mint a scoped token and use it for both the branch push and gh pr create — consistent with how future-agi opens its release PRs, and avoids relaxing the org-wide setting. Co-Authored-By: Claude Fable 5 --- .github/workflows/changelog-sync.yml | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/.github/workflows/changelog-sync.yml b/.github/workflows/changelog-sync.yml index 5f3217f06..d64d0dd4e 100644 --- a/.github/workflows/changelog-sync.yml +++ b/.github/workflows/changelog-sync.yml @@ -14,7 +14,16 @@ jobs: open-changelog-pr: runs-on: ubuntu-latest steps: + # App token (not GITHUB_TOKEN): the org forbids Actions from creating PRs + # with GITHUB_TOKEN, and App-minted tokens are exempt. Scoped to this repo. + - uses: actions/create-github-app-token@v2 + id: app-token + with: + app-id: ${{ secrets.RELEASE_BOT_APP_ID }} + private-key: ${{ secrets.RELEASE_BOT_PRIVATE_KEY }} - uses: actions/checkout@v4 + with: + token: ${{ steps.app-token.outputs.token }} - uses: actions/setup-node@v4 with: node-version: 20 @@ -28,7 +37,7 @@ jobs: node scripts/changelog-from-release.mjs "$VERSION" /tmp/release-body.md src/pages/docs/release-notes.mdx - name: Open PR env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GH_TOKEN: ${{ steps.app-token.outputs.token }} VERSION: ${{ github.event.client_payload.version }} RELEASE_URL: ${{ github.event.client_payload.release_url }} run: | From f468f3b0064e314c4fc1ca3a6aef217305419df7 Mon Sep 17 00:00:00 2001 From: Yash Mohan Date: Tue, 25 Aug 2026 16:14:17 +0530 Subject: [PATCH 9/9] docs(release-notes): add weeks of Jul 22 to Aug 10, 2026 --- src/pages/docs/release-notes.mdx | 109 +++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) diff --git a/src/pages/docs/release-notes.mdx b/src/pages/docs/release-notes.mdx index 724068bd9..03626000d 100644 --- a/src/pages/docs/release-notes.mdx +++ b/src/pages/docs/release-notes.mdx @@ -5,6 +5,115 @@ description: "Latest Future AGI release notes covering new features, improvement {/* release-notes:insert-below — automation inserts new releases here; do not remove */} +## Week of 2026-08-10 + +
+ +
Features
+ +- **Enterprise Code Joins the Open-Source Repository:** Future AGI's enterprise code, which used to live in a separate private repository, now sits in the same open-source repository as the core, behind a license. Capabilities like the Cluster RCA agent, guardrails, and agent optimization now build from one place alongside the Apache 2.0 core, so self-hosted and licensed deployments come from a single source. github.com/future-agi/future-agi. + +
Bugs/Improvements
+ +- **Sharper Error Clustering:** The Error Feed's clustering engine got a precision upgrade. It reads each turn in full context, groups related failures more tightly, and titles every cluster from the shared pattern across its traces, so each cluster gives you a cleaner, more accurate picture of what is actually going wrong and how widespread it is. + +- **Model Lifecycle Awareness:** Future AGI now tracks when a model is renamed or retired from the catalog. Historical runs that reference a retired model continue to load reliably, the model is clearly flagged as deprecated, and starting a new run on an unavailable model returns a clear message pointing you to a supported one. + +
+ +## Week of 2026-08-04 + +
+ +
Features
+ +- **Guided Setup for Self-Hosting:** Standing up your own Future AGI instance is now a smooth, guided experience. A setup screen walks you through the infrastructure checks and lets you move ahead as soon as your stack is ready, the first admin account signs in the moment it is created, and you can invite your team with shareable links, no email server required. + +
Bugs/Improvements
+ +- **Click-to-Map Variable Mapping:** When mapping variables for evaluations, simulations, and datasets, you can now click a column or value to assign it, instead of typing the path by hand. If there is one variable it maps straight away; if there are several, a short menu lets you pick the one you want or copy the path. + +- **Smoother Cluster RCA Investigations:** Following an investigation in the Fix tab is now easier to read as it streams. You can scroll back through the reasoning without being pulled down to the newest step, the steps you open stay open, and every run ends with a clear outcome. Each investigation is also faster and more consistent. + +- **Voice Recording Playback:** Voice call recordings now play more reliably across browsers, falling back to your browser's built-in player when needed. + +- **Annotation Queue: View Session:** Items in an annotation queue now have a View Session action, so you can open the full session an item belongs to without leaving the queue. + +
+ +## Week of 2026-07-28 + +
+ +
Features
+ +- **Bland.ai Voice Integration:** Bland.ai is now a supported voice provider, alongside VAPI and Retell. Connect your inbound and outbound Bland voice agents so their production calls are verified, ingested, and fully observable in Future AGI, and run simulations against them like any other agent. + +- **OSS Mode and Unified Docker Setup:** The open-source build now ships with a unified Docker setup and cleanly gates enterprise-only features, with a CLI-based setup flow for first run. + +
Bugs/Improvements
+ +- **New Model Support:** Claude 5 and the Gemini 3.x family, including Gemini 3.6 Flash, are now in the model catalog and available through the gateway, with pricing. + +- **Faster Annotation Queues:** A round of performance work makes the annotation grid, bulk review, submit, and assign noticeably faster on large queues. + +- **Faster, More Resilient Observe Lists:** Trace and span lists load faster with a smaller default page size, and a single row with an unreadable date value no longer prevents the Observe page from loading. + +- **Dark Mode Readability:** Some surfaces and controls in the evals, trace, and Error Feed views were low-contrast in dark mode. They now use proper dark-theme colors. + +- **Simulation Fixes:** Choice-based evaluation results previously failed to load in the Analytics tab under certain conditions. This has been resolved, and the Analytics tab now displays results reliably for all evaluation types. + +- **Voice Fixes:** Fixed a case where the Observe voice call detail view could come up empty, and combined recordings now play. + +
+ +## Week of 2026-07-22 + +
+ +
Features
+ +- **Cluster RCA Agent (Enterprise):** The Error Feed can investigate a cluster of failing traces for you. It reads each trace, correlates the failure across version, model, region, and error type, and returns a root cause, a suggested fix, and a confidence level, streamed live in the Fix tab. + +- **Faster Telemetry at Scale (ClickHouse 25.3):** The telemetry backend moved to ClickHouse 25.3, so traces, sessions, and voice calls all load faster and hold up as your volume grows. + +- **Eval Usage Tab:** Every eval template now has a Usage tab showing run counts, pass rate over time, and the exact eval version behind each score. + +- **GPT-5 and o-Series on the Gateway:** The gateway now sends max_completion_tokens to OpenAI and Azure, so GPT-5, its mini and nano variants, and the o-series work through the gateway with no client change. + +- **Sessions and Users Filtering:** The Sessions and User tabs can now be filtered by session, by user, and by first or last message. + +- **Write-Access Controls (RBAC):** Write actions in the agent playground and dashboards are now gated behind write access. + +- **API Hardening:** Request and response contracts and serializers were standardized across the platform for a consistent, well-typed API surface, part of our open-source-readiness work. + +
Bugs/Improvements
+ +- **Error Feed Refresh:** Redesigned Overview, Traces, Trends, and Fix tabs, with feed views loading 80 to 85 percent faster. + +- **Edited Custom-Eval Prompts Now Apply:** Editing a custom eval on the dataset page now uses your updated prompt at runtime, and each dataset pins the exact eval version it runs. + +- **Optional Variable Mapping for Agent Evals:** When an agent eval task already receives trace or session context, you no longer have to map every variable. + +- **Users CSV Export:** Export large user lists to CSV, with streaming for big exports. + +- **Redesigned JSON and Array Column Picker:** The dataset variable-mapping column picker was redesigned to handle nested JSON and array fields. + +- **Larger Dataset Uploads:** The dataset upload size cap was raised from 10 MB to 25 MB. + +- **Simulation Fixes:** The chat simulation results view is now easier to read. Evaluations run inside a simulation no longer receive empty inputs from a mapping issue. Scenarios now show their Failed or Processing status, and running a simulation on a scenario with no data is blocked with a clear message. + +- **Prompt Fixes:** In a prompt's Evaluation tab, newly added rows are no longer lost when you run an evaluation. In the prompt workbench, comparing versions no longer shows a version's variables as missing by mistake, and opening a prompt now shows the correct version's content. + +- **Observe and Voice Fixes:** Some voice calls would not load in Observe due to a provider configuration issue; these calls now load reliably. Filtering and columns in Observe lists are cleaner. The Users grid now supports up to 50 rows per page. + +- **Dataset Fixes:** CSV files whose cells contain curly or smart quotes now upload correctly. + +- **API Key Configuration:** Fixes to API-key configuration and additional security hardening. + +
+ + ## Week of 2026-06-18