Repository navigation
docs: Frigg 2.0 release notes and migration guide - #660
seanspeaks wants to merge 8 commits into
Conversation
Rewrite the July draft against the code on next. Fix the database selection (DB_TYPE or Definition.database, DATABASE_URL is only the connection string), describe reports as admin operations, and drop the features that have not shipped. Add the shipped work the draft missed: admin scripts, telemetry, structured logging, SSM offload, token refresh reliability, atomic config and process updates, queryMappings, and the final SQS attempt signal. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Rewrite the July draft against the code on next. The database engine comes from Definition.database or DB_TYPE, integrations move from Config/Options to static Definition, and data moves by a fresh database or a scripted copy. Drop the @friggframework/ui renames that never shipped and move the extension route change to a section for 2.0 prerelease adopters, next to the retired reporting key. Install commands use ^2.0.1. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2.0.1 is the first stable 2.x release. Tell readers to install ^2.0.1, because ^2.0.0 can resolve to a deprecated 2024 build of core. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
npm's latest tag for prisma currently points at an 8.x release candidate, outside @friggframework/core's ^6.19.3 peer range. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
If your organization's extra usage balance is empty, an organization admin can add extra usage credits at claude.ai/admin-settings/usage. If its monthly spend limit was reached, an admin can raise it on the same page. If neither applies, contact Anthropic support.
Once extra usage is available, comment @claude review on this pull request, or push a new commit, to trigger a review.
✅ Deploy Preview for friggframework-org canceled.
|
…guide Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… their agents Rewrite What's New around five pillars: three ways to define an integration (code, a validated document, a catalogue entry), connections agents use without seeing a credential (Management API v2, adopter JWTs, memberships, entity scopes, the locked-down proxy), the product and operations profiles, production defaults, and Netlify as a second host. Add the new breaking changes and requirements. Update the migration guide for Node 22.13+/24 and osls 4, frigg validate, module credential encryption, and a Management API v2 step that keeps v1 clients working and links the v1 to v2 table. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013b2UUFaQ5Lk6TFPqzRr1j7
There was a problem hiding this comment.
If your organization's extra usage balance is empty, an organization admin can add extra usage credits at claude.ai/admin-settings/usage. If its monthly spend limit was reached, an admin can raise it on the same page. If neither applies, contact Anthropic support.
Once extra usage is available, someone with write access to this repository can comment @claude review on this pull request to trigger a review.
Group 5 review (docs) — COMMENT only (smoke)Testing whether this agent can post review findings on the Frigg release PRs. |
Group 5 review (docs) — COMMENT only (not an approval / not a formal request-changes)Checked every claim against current Would-approve verdict: changes needed. Do not treat as release-ready until the docs either (a) match code already on Inline findings are posted on the diff with severity + failure scenario. Docs-only; no new test failures relative to (Ignore the earlier smoke “testing whether this agent can post” comment — this is the real review.) |
|
|
||
| ### From a catalogue | ||
|
|
||
| `GET /api/integration-definitions` lists the latest published version of each |
There was a problem hiding this comment.
blocking — GET/POST /api/integration-definitions, document publishing, sync engine, previewWorkflow / previewSurface, and recurring Definition.triggers are written as current behavior. None of that surface exists on next (#692–#700 / #669 open).
Failure scenario: Client calls GET /api/integration-definitions on a 2.0.1 build from current next → 404 / no route → catalogue and document install flow described here cannot be followed.
| } | ||
| ``` | ||
|
|
||
| This is abridged from `examples/pipedrive-hubspot.definition.json`. That |
There was a problem hiding this comment.
blocking — Points at examples/pipedrive-hubspot.definition.json, but that path (and any examples/ tree with definition JSON) is not on next or this branch.
Failure scenario: Reader follows “abridged from examples/pipedrive-hubspot.definition.json” → file not found → cannot verify the document shape or the lifecycle.onInstall webhook claim.
|
|
||
| ([ADR-053](https://github.com/friggframework/frigg/pull/668), #671) | ||
|
|
||
| * Every route lives under `/api/v2/*`. Errors share one shape, and every |
There was a problem hiding this comment.
blocking — Management API v2 under /api/v2/*, GET /api/meta, v1 Deprecation headers, and managementApi: { v1: false } are presented as shipped. On next, /api/v2 only covers reporting; there is no general Management API v2 / /api/meta (#671 / #668 open).
Failure scenario: Adopter sets managementApi: { v1: false } or probes GET /api/meta after upgrading → config key ignored / route missing → clients cannot discover versions or migrate using the steps in the migration guide.
| A class that extends `IntegrationBase` with a `static Definition` works as it | ||
| did in every 2.0 prerelease. 2.0.1 adds `defineIntegration`, which builds that | ||
| class from one object | ||
| ([ADR-054](https://github.com/friggframework/frigg/pull/669)): |
There was a problem hiding this comment.
blocking — defineIntegration is described as what “2.0.1 adds”, but there is no defineIntegration export or implementation on next (#669 still open; the PR body already notes this).
Failure scenario: Reader copies the snippet after installing @friggframework/core@^2.0.1 built from today’s next → require('@friggframework/core').defineIntegration is undefined → app fails at load.
|
|
||
| * **Encryption fails closed** (#663). Every deployed stage encrypts sensitive | ||
| fields, `dev` included. A deployed function with no key refuses to start | ||
| with `EncryptionConfigurationError`. Set |
There was a problem hiding this comment.
blocking — “Encryption fails closed” / EncryptionConfigurationError / fieldLevelEncryptionMethod: 'none' are not on next. Current schema enum is only ["kms","aes"], and encryption still bypasses on dev/test/local (#663 open). Same section’s frigg validate (#666), osls 4 (#664; osls still ^3.78.0), credentialFields fix (#680), and Netlify provider (#686) are also unmerged — unlike rate limits, which correctly say “if merged”.
Failure scenario: Operator deploys a dev stage with no key expecting fail-closed startup → Lambda starts and writes plaintext (today’s behavior) → docs’ security guarantee is false. Or they set fieldLevelEncryptionMethod: 'none' → schema/runtime reject or ignore the value.
| the callers left to move. | ||
|
|
||
| * Move each call with the v1 to v2 table in the | ||
| [API reference](../reference/api-reference.md). Clients can call |
There was a problem hiding this comment.
blocking — Points readers to a “v1 to v2 table” in docs/reference/api-reference.md. That table is not present on next (the reference is still the unversioned Management API swagger).
Failure scenario: Client owner opens the API reference to remap /api/integrations → /api/v2/... → no mapping table → step 7 cannot be completed from the linked doc.
| through `IN_DELETION`. | ||
| * **Encryption fails closed in every deployed stage, `dev` included.** A | ||
| deployed function without a key refuses to start. Opt out only with | ||
| `fieldLevelEncryptionMethod: 'none'`. `BYPASS_ENCRYPTION_STAGE` is no longer |
There was a problem hiding this comment.
should-fix — States BYPASS_ENCRYPTION_STAGE is “no longer read”. On next, check-encryption-health-use-case.js still splits and honors BYPASS_ENCRYPTION_STAGE.
Failure scenario: Operator removes BYPASS_ENCRYPTION_STAGE believing it is inert, or leaves it set believing the docs → runtime still depends on the env var → migration checklist and behavior disagree.
| Unknown keys are errors. Rename retired values: `database.postgres.management` | ||
| takes `discover`, `managed`, or `use-existing`, and `vpc.management` takes | ||
| `use-existing` instead of `existing`. Set `user.usePassword` and | ||
| `user.authModes` explicitly, because their schema defaults changed. |
There was a problem hiding this comment.
blocking — Documents renamed management values (database.postgres.management: discover | managed | use-existing; vpc.management: use-existing). On next (post-#639), the live schema still uses create-new / existing / external for postgres and existing for VPC. Those renames live in open #666.
Failure scenario: Adopter following this guide against a build from current next writes management: 'managed' or 'use-existing' → schema validation fails (or, if #666 merges without reconciling #639’s external, the near-$0 scaffold breaks).
| This checks `DATABASE_URL`, generates the Prisma client, and runs migrations | ||
| (PostgreSQL) or `db push` (MongoDB and DocumentDB). The schema includes the | ||
| 2.0.1 tables for organization memberships, entity and integration | ||
| `organizationId` columns, and integration definitions. |
There was a problem hiding this comment.
blocking — Claims frigg db:setup creates “2.0.1 tables for organization memberships, entity and integration organizationId columns, and integration definitions”. On next, Entity and Integration have no organizationId / scope fields, and there is no organization-memberships or integration-definitions model (#681 / #682 / definitions stack still open).
Failure scenario: Migrator runs frigg db:setup then expects membership / scope columns for step 7 → schema has neither → later scope/membership config fails or data has nowhere to land.
…ents vision Rewrite whats-new and trim the migration guide so they only claim work on next. Unmerged items move to In review with ADR/PR pointers. Keep the agents/capabilities vision line as approved. Co-authored-by: Sean Matthews <sean.matthews@lefthook.co>
There was a problem hiding this comment.
If your organization's extra usage balance is empty, an organization admin can add extra usage credits at claude.ai/admin-settings/usage. If its monthly spend limit was reached, an admin can raise it on the same page. If neither applies, contact Anthropic support.
Once extra usage is available, someone with write access to this repository can comment @claude review on this pull request to trigger a review.
|
| (PostgreSQL) or `db push` (MongoDB and DocumentDB). The schema includes the | ||
| 2.0.1 tables for organization memberships, entity and integration | ||
| `organizationId` columns, and integration definitions. |
There was a problem hiding this comment.
The text says frigg db:setup creates "2.0.1 tables for organization memberships, entity and integration organizationId columns, and integration definitions".
The companion whats-new-in-2.0.md lists memberships, entity scopes and integration definitions as data (ADR-063) as in review and not in 2.0.1.
The two docs contradict each other, and users cannot tell whether these tables exist in the released schema.
Fix: make the statements consistent, and drop this sentence if the schema is not shipped.
| (PostgreSQL) or `db push` (MongoDB and DocumentDB). The schema includes the | |
| 2.0.1 tables for organization memberships, entity and integration | |
| `organizationId` columns, and integration definitions. | |
| (PostgreSQL) or `db push` (MongoDB and DocumentDB). | |
Spotted by Graphite
Is this helpful? React 👍 or 👎 to let us know.



Summary
Reframes the Frigg 2.0 release notes and migration guide around the decided story: "Frigg 2.0: the integration backend for people and their agents." The notes now cover everything that ships in 2.0.1 by decision, including work in PRs that are still open (listed below). Every API name, config key, route, and command was checked against the PR branches.
docs/getting-started/whats-new-in-2.0.mdopens with the one-sentence story and a short Left Hook dogfooding note. It then has five pillar sections with verified examples:defineIntegrationsnippet and a JSON document snippet;After those come a short "Under the hood" section (the earlier seven themes, condensed), breaking changes, a requirements table, and "What's next".
docs/guides/migrating-to-2.0.mdchanges only where the 2.0.1 scope changes steps:frigg validateand the renamedmanagementvalues;docs/reference/api-reference.md, the adopter-JWT option, and entity scopes that keep 1.x behavior by default.Later steps are renumbered and the checklist is extended.
Dependencies (what the notes describe, by pillar)
1. Three ways to define an integration
defineIntegrationand ADR-055 recurring triggers: open.defineIntegrationexists only in ADR-054. No PR implements it yet.2. Connections agents can use without seeing a credential
/api/meta, v1 deprecation, entity proxy: open.3. Two app profiles
4. Production by default
frigg initscaffolding #639 workingfrigg initand the near-$0-idle scaffold: open.frigg validateand ADR-051: open.5. More than one host
Claims I changed or could not verify
defineIntegrationhas no implementation. The snippet follows ADR-054's API and is labeled as such.frigg initscaffolding #639 still pins osls^3.78.0.fieldLevelEncryptionMethod: 'none'(from feat(core)!: fail closed on field-level encryption in deployed stages #663).database.postgres.management: 'external'(from fix: lazy-load scheduler AWS SDK in core and repairfrigg initscaffolding #639).next, so the notes link them through their PRs. Relative links can replace those once the ADRs merge.previewWorkflow,previewSurface) and attach/detach (addEntitiesToIntegration,removeEntitiesFromIntegration) are function and command APIs, so the notes describe them that way.Test plan
nextonce the dependencies merge, and drop the rate-limit line if feat(core): honour Retry-After and let API modules declare rate limits #656–feat(core): tell the integration when a rate limit is too long to wait for #658 don't make 2.0.1/2.0GitHub Release body for v2.0.1 (applied with
gh release editafter the release)Frigg 2.0: the integration backend for people and their agents
With Frigg 2.0, each person and each organization connects their own accounts once. People, your product, and the agents working for them then use those connections through one versioned API, and nobody outside Frigg ever holds the credential.
2.0.1 is the first stable 2.x release. Install
^2.0.1. Do not use^2.0.0, which can resolve to a deprecated 2024 build of@friggframework/core.Read the full overview in What's New in Frigg 2.0.
We run it ourselves. Left Hook, the company that maintains Frigg, runs both app profiles on 2.0:
Three ways to define an integration, one runtime
IntegrationBaseclass withstatic Definition, or onedefineIntegration({ ... })call (ADR-054).extendIntegrationClass()lets code embed a document.GET /api/integration-definitionslists what your app offers, and workspaces can publish their own.delayand wait for anapproval. A sync engine handles one-way and two-way syncs.Definition.triggersadds recurring triggers with per-installation intervals (ADR-055).previewWorkflow()dry-runs a workflow, andpreviewSurface()renders UI as Slack, HubSpot, or HTML.Connections agents can use without seeing a credential
/api/v2/*, withGET /api/metafor discovery. Entities never return credential fields, and credentials are masked (ADR-053).Deprecationheaders. Turn v1 off withmanagementApi: { v1: false }once nothing calls it.user.authModes.adopterJwt. Organization memberships let one person act in several organizations. Organization roles gate changes to shared connections.individual,organization, orglobal, with ownership rules. The default keeps 1.x behavior. Credentials are scoped through their entities.POST /api/v2/entities/:entityId/proxycalls the connected account's API with the stored credential. It is off by default, each module allows only the paths it lists, the host always comes from the module, named base URLs are supported, andmanagementApi.proxy.scopescontrols whose connections it may use (ADR-052).appDefinition.entitieslets people connect modules that no integration uses (ADR-059).Two app profiles
Production by default
devincluded. A deployed function without a key refuses to start (EncryptionConfigurationError). Opt out only withfieldLevelEncryptionMethod: 'none'.credentialFieldsare now actually encrypted. Reads decrypt only exact ciphertext, so stored plaintext stays readable.frigg initwrites a working scaffold that costs about $1 a month idle: no VPC, no NAT gateway, your own PostgreSQL, and KMS encryption.frigg validate, backed by an app-definition schema that matches the runtime (ADR-051).buildanddeployrun it first.static rateLimiton API modules,Retry-Afterhandling, and queue messages deferred to their retry time (ADR-049).More than one host
provider: 'netlify'(ADR-028).Under the hood
frigg doctor,repair,generate-iam, SSM offload, structured JSON logs, and opt-in OpenTelemetry and usage counters.delivery.isLastAttempt,queryMappings, andfrigg auth.Breaking changes
mongoose, the Mongoose models,connectToDatabase,createFriggBackend,ModuleManager,Auther, orIntegrationFactory.DATABASE_URLis only the connection string and replacesMONGO_URI.static Definitionandthis.events. OneUsermodel with atypefield replaces the discriminators. Integrations start inIN_CREATIONand pass throughIN_DELETION.devincluded.BYPASS_ENCRYPTION_STAGEis no longer read.POST /api/integrationsnow checks that the caller owns every entity.organizationIdon entities and integrations, and the integration-definition tables.managementvalues stopbuildanddeploy. Setuser.usePasswordanduser.authModesexplicitly.infrastructure.js. AWS SDK v3 replaces v2.Upgrade
Follow the 1.x to 2.0 migration guide. It links to the v1 to v2 route table.
What's next
These are not part of 2.0.1:
defineIntegrationfile.frigg initand a default UI for each profile.globalentities.Thanks
Thank you to everyone who filed issues, reviewed pull requests, and ran the 2.0 prereleases in production.
🤖 Generated with Claude Code
Note
Low Risk
Documentation-only changes with no runtime or config behavior; risk is limited to inaccurate upgrade guidance for adopters.
Overview
Adds Frigg 2.0.1 documentation to the GitBook nav:
docs/SUMMARY.mdnow links What's New in Frigg 2.0 and Migrating from 1.x to 2.0.whats-new-in-2.0.mdis new release notes framed as the integration backend story, but scoped to what ships in 2.0.1 (Prisma,static Definition,frigg validate/init, ops tooling, connection reliability). It calls out breaking changes, install^2.0.1(not^2.0.0), requirements, and an In review, not in 2.0.1 yet section so agent/Management API v2/Netlify-style work is not presented as released.migrating-to-2.0.mdis a new 10-step upgrade guide (Node 22+, fresh or in-place backend, explicit DB engine,frigg db:setup/validate, porting integrations and data access, optional adopter JWT, SDK v3, data migration options, deploy/verify) plus prerelease deltas and a checklist.Reviewed by Cursor Bugbot for commit d5e77cf. Bugbot is set up for automated code reviews on this repo. Configure here.
Summary
Reframes the Frigg 2.0 release notes and migration guide around the decided story: "Frigg 2.0: the integration backend for people and their agents." The notes now cover everything that ships in 2.0.1 by decision, including work in PRs that are still open (listed below). Every API name, config key, route, and command was checked against the PR branches.
docs/getting-started/whats-new-in-2.0.mdopens with the one-sentence story and a short Left Hook dogfooding note. It then has five pillar sections with verified examples:defineIntegrationsnippet and a JSON document snippet;After those come a short "Under the hood" section (the earlier seven themes, condensed), breaking changes, a requirements table, and "What's next".
docs/guides/migrating-to-2.0.mdchanges only where the 2.0.1 scope changes steps:frigg validateand the renamedmanagementvalues;docs/reference/api-reference.md, the adopter-JWT option, and entity scopes that keep 1.x behavior by default.Later steps are renumbered and the checklist is extended.
Dependencies (what the notes describe, by pillar)
1. Three ways to define an integration
defineIntegrationand ADR-055 recurring triggers: open.defineIntegrationexists only in ADR-054. No PR implements it yet.2. Connections agents can use without seeing a credential
/api/meta, v1 deprecation, entity proxy: open.3. Two app profiles
4. Production by default
frigg initscaffolding #639 workingfrigg initand the near-$0-idle scaffold: open.frigg validateand ADR-051: open.5. More than one host
Claims I changed or could not verify
defineIntegrationhas no implementation. The snippet follows ADR-054's API and is labeled as such.frigg initscaffolding #639 still pins osls^3.78.0.fieldLevelEncryptionMethod: 'none'(from feat(core)!: fail closed on field-level encryption in deployed stages #663).database.postgres.management: 'external'(from fix: lazy-load scheduler AWS SDK in core and repairfrigg initscaffolding #639).next, so the notes link them through their PRs. Relative links can replace those once the ADRs merge.previewWorkflow,previewSurface) and attach/detach (addEntitiesToIntegration,removeEntitiesFromIntegration) are function and command APIs, so the notes describe them that way.Test plan
nextonce the dependencies merge, and drop the rate-limit line if feat(core): honour Retry-After and let API modules declare rate limits #656–feat(core): tell the integration when a rate limit is too long to wait for #658 don't make 2.0.1/2.0GitHub Release body for v2.0.1 (applied with
gh release editafter the release)Frigg 2.0: the integration backend for people and their agents
With Frigg 2.0, each person and each organization connects their own accounts once. People, your product, and the agents working for them then use those connections through one versioned API, and nobody outside Frigg ever holds the credential.
2.0.1 is the first stable 2.x release. Install
^2.0.1. Do not use^2.0.0, which can resolve to a deprecated 2024 build of@friggframework/core.Read the full overview in What's New in Frigg 2.0.
We run it ourselves. Left Hook, the company that maintains Frigg, runs both app profiles on 2.0:
Three ways to define an integration, one runtime
IntegrationBaseclass withstatic Definition, or onedefineIntegration({ ... })call (ADR-054).extendIntegrationClass()lets code embed a document.GET /api/integration-definitionslists what your app offers, and workspaces can publish their own.delayand wait for anapproval. A sync engine handles one-way and two-way syncs.Definition.triggersadds recurring triggers with per-installation intervals (ADR-055).previewWorkflow()dry-runs a workflow, andpreviewSurface()renders UI as Slack, HubSpot, or HTML.Connections agents can use without seeing a credential
/api/v2/*, withGET /api/metafor discovery. Entities never return credential fields, and credentials are masked (ADR-053).Deprecationheaders. Turn v1 off withmanagementApi: { v1: false }once nothing calls it.user.authModes.adopterJwt. Organization memberships let one person act in several organizations. Organization roles gate changes to shared connections.individual,organization, orglobal, with ownership rules. The default keeps 1.x behavior. Credentials are scoped through their entities.POST /api/v2/entities/:entityId/proxycalls the connected account's API with the stored credential. It is off by default, each module allows only the paths it lists, the host always comes from the module, named base URLs are supported, andmanagementApi.proxy.scopescontrols whose connections it may use (ADR-052).appDefinition.entitieslets people connect modules that no integration uses (ADR-059).Two app profiles
Production by default
devincluded. A deployed function without a key refuses to start (EncryptionConfigurationError). Opt out only withfieldLevelEncryptionMethod: 'none'.credentialFieldsare now actually encrypted. Reads decrypt only exact ciphertext, so stored plaintext stays readable.frigg initwrites a working scaffold that costs about $1 a month idle: no VPC, no NAT gateway, your own PostgreSQL, and KMS encryption.frigg validate, backed by an app-definition schema that matches the runtime (ADR-051).buildanddeployrun it first.static rateLimiton API modules,Retry-Afterhandling, and queue messages deferred to their retry time (ADR-049).More than one host
provider: 'netlify'(ADR-028).Under the hood
frigg doctor,repair,generate-iam, SSM offload, structured JSON logs, and opt-in OpenTelemetry and usage counters.delivery.isLastAttempt,queryMappings, andfrigg auth.Breaking changes
mongoose, the Mongoose models,connectToDatabase,createFriggBackend,ModuleManager,Auther, orIntegrationFactory.DATABASE_URLis only the connection string and replacesMONGO_URI.static Definitionandthis.events. OneUsermodel with atypefield replaces the discriminators. Integrations start inIN_CREATIONand pass throughIN_DELETION.devincluded.BYPASS_ENCRYPTION_STAGEis no longer read.POST /api/integrationsnow checks that the caller owns every entity.organizationIdon entities and integrations, and the integration-definition tables.managementvalues stopbuildanddeploy. Setuser.usePasswordanduser.authModesexplicitly.infrastructure.js. AWS SDK v3 replaces v2.Upgrade
Follow the 1.x to 2.0 migration guide. It links to the v1 to v2 route table.
What's next
These are not part of 2.0.1:
defineIntegrationfile.frigg initand a default UI for each profile.globalentities.Thanks
Thank you to everyone who filed issues, reviewed pull requests, and ran the 2.0 prereleases in production.
🤖 Generated with Claude Code
Note
Overview
Unable to generate summary.
Reviewed by Cursor Bugbot for commit 4b56877. Bugbot is set up for automated code reviews on this repo. Configure here.
Cut: merged-on-
nextonly (2026-10-24)Sean approved the cut list and asked to keep the agents/capabilities vision line.
This commit rewrites
whats-new-in-2.0.mdand trimsmigrating-to-2.0.mdso they only claim work merged onnext. Unmerged items move to In review, not in 2.0.1 yet with ADR/PR pointers.Kept as vision (not shipped claims):
Cut (still open / not on
next): defineIntegration, Mgmt API v2 / proxy / scopes / profiles, fail-closed encryption, osls 4, Netlify host, rate limits, credentialFields encryption, and the Left Hook dogfood note that names unmerged profiles/hosts.See
cut-list-660-662.mdin the Frigg Docs workspace for the full table.