Skip to content

Finish moving the CALM schema to finos/calm-schema and test the tools against each new release #3240

Description

@rocketstack-matt

Status

Updated 2026-10-27. Steps 1 to 5 and 7 to 12 are complete. calm-schema is the only publisher of release/, standards/ and interfaces/ on calm.finos.org. All tools use schema 1.3. The three released decorator standards are on calm.finos.org, and CALM Hub serves them. In this repository, calm/ holds CALM's own architecture and the 2026-03 draft, which early adopters still use (#3532).

Step State PR or blocker
P1 AWS credentials on calm-schema Done: release/* and interfaces/* (2026-10-05), standards/* (2026-10-26) —
P2 GitHub App credentials on calm-schema Done (2026-10-05) —
P3 CLI template change Agreed (2026-10-08) #3352
1. Publish from calm-schema, remove s3-sync.yml Done finos/calm-schema#33, #3365. First publish 2026-10-15: all 174 live URLs identical to the baseline.
2. Get the schema from npm Done #3244, #3247, #3249
3. Schema compatibility workflow Done #3251 and finos/calm-schema#33. The 1.2.0 dispatch on 2026-10-15 ran all tools and opened no issue.
4. CLI workspace templates use 1.2 Done #3356, #3378. The templates and calm timeline take the release from @finos/calm-schema. Docs and lab lesson for the command: #3351.
5. Deployment decorator standard to calm-schema Done (Option B) finos/calm-schema#41 released schema 1.3 and tagged standard-deployment-v1.0. finos/calm-schema#43 tagged standard-control-evaluation-v1.0. All tools use 1.3: #3437 and stack #3444 (#3438 to #3443). CALM Hub seeds and serves the three standards (#3435). The docs and the CALM Hub UI tests use them (#3464). publish-site.yml put them on calm.finos.org on 2026-10-26 (run 40318698209).
6. Delete drafts and release candidates In progress #3468 and #3496 deleted the release candidates and the drafts from this repository. #3508 and #3510 (closes #3495) merged. #3511 deleted draft/2026-03/ from calm.finos.org, but early adopters still use the draft (#3532), so #3534 puts it back in the CLI bundle and on calm.finos.org. Open: #3513 (seed patterns that declared the 2025-03 draft on a CALM Hub path). Split out, not needed to close this issue: #3533 (removes the 2026-03 draft after jpgough-ms confirms), #3507 (draft/2025-03/, which OpenRewrite declares) and #3514 (release/1.0-rc*/).
7. Delete calm/controls Done #3242, #3369. controls/ is gone from calm.finos.org.
8. Delete calm/getting-started Done #3243, #3416. The docs deploy of 2026-10-24 removed getting-started/ from calm.finos.org.
9. Remove calm/release and calm/interfaces Done #3368 (Hub seed off calm/), #3369. The release candidates stay for step 6.
10. AGENTS.md and CLAUDE.md in calm-schema and calm-governance Done finos/calm-schema#38, finos/calm-governance#21
11. Update this repo's AGENTS.md and README Done #3369
12. Correct the calm-schema docs Done finos/calm-schema#38. Each interface $id has the .json suffix and resolves.

Other open items

Item Note
#3434 How CALM Hub gets standards from now on
finos/calm-schema#44 Gaps in publish-site.yml that the 1.3 release found
release/{1.0,1.1,1.2}/RELEASE_NOTES.md on calm.finos.org Live, but nothing publishes them
conferences/osff-ln-2025/workshop/ Uses the release candidate URLs: #3514
CODEOWNERS /calm/ #3509 makes the maintainers the code owners
CALM Hub seed: 16 AI governance control requirements and the AI governance v2 architecture Not valid against any CALM version: #3469

Feature Proposal

Target Project:

calm/ and the tools that read it (CLI, shared, calm-server, calm-hub, calm-lab, calm-studio), plus finos/calm-schema and finos/calm-governance.

Description of Feature:

The schema moved to finos/calm-schema and the governance documents moved to finos/calm-governance. The move is not complete:

  • .github/workflows/s3-sync.yml in this repo still publishes calm/ to the bucket behind calm.finos.org. Every schema $id points there. calm-schema publishes to npm only.
  • No package in this repo uses @finos/calm-schema. All tools read calm/release and calm/draft from this repo.
  • The README, AGENTS.md and calm/AGENTS.md still say that the schema lives here.

Thus a schema change merged in calm-schema does not get to calm.finos.org or to the tools. A change to calm/ here is published and makes the two copies different.

This issue makes calm-schema the only source of the schema. The tools here get the schema from npm, and a new workflow tests all of them against each new schema release. When a release breaks a tool, the workflow opens an issue. The drafts and release candidates are removed, and so are the parts of calm/ that nothing uses.

User Stories:

  • As a schema maintainer, I want a release from calm-schema to be published to calm.finos.org and npm, so that there is one source of truth.
  • As a tool maintainer, I want an issue when a new schema release breaks a tool, so that I know what to fix.
  • As a contributor or an AI agent, I want each repo to say what it owns and how it relates to the other repos, so that I change the correct repo.

Current Limitations:

State of main on 2026-10-04:

Content In calm-schema In this repo Proposal
Releases 1.0, 1.1, 1.2 Tags v1.0, v1.1, v1.2 (finos/calm-schema#15–#18). meta files are identical. All three are on npm. calm/release/<v>/ publish from calm-schema, remove here
Release candidates 1.0-rc1, 1.0-rc2 Tags only. Not on npm. calm/release/1.0-rc*/ delete
Drafts 2025-03, 2026-03 2025-03 as history only calm/draft/ delete
Deployment decorator standard — calm/draft/2026-03/standards/ move to calm-schema and release
Interfaces examples/interfaces/ (finos/calm-schema#28) calm/interfaces/ publish from calm-schema, remove here
Controls — calm/controls/ (a README only) delete
Getting started guide — calm/getting-started/ delete
CALM's own architecture — calm/architecture/ keep here

Tools that read calm/release and calm/draft directly:

Consumer Reads
cli, calm-server all of calm/release/**/meta and calm/draft/**/meta, copied into dist
calm-hub (pom and read-only images) calm/release 1.0, 1.1 and 1.2 on the classpath
calm-lab 1.2 and draft 2025-03
shared browser probe, calm-studio calm-core 1.2

53 files outside calm/ refer to the drafts:

Kind Files Notes
Tool behaviour 8 CLI and calm-server bundle all drafts. calm-lab bundles 2025-03. The CLI workspace templates create new documents with the 2025-03 draft as $schema, not 1.2.
Seed data 19 calm-hub Mongo and Nitrite seeds, k8s config, AI governance controls. Some refer to the 2024-04 draft by a raw.githubusercontent.com URL. That draft was removed, so these links are already broken.
Tests and fixtures 19 calm-hub, calm-hub-ui, shared, calm-lab
Docs and workflows 7 AGENTS.md files, CLI README, a calm-hub ADR, s3-sync.yml, validate-spectral.yml

Proposed Implementation:

Prerequisites

These need setup outside the repos. @rocketstack-matt asked FINOS for P1 and P2 by email to help@finos.org on 2026-10-04, and will confirm on this issue when each one is in place.

ID Prerequisite Owner Blocks
P1 AWS credentials on finos/calm-schema that can write and delete release/* and interfaces/* in the calm.finos.org bucket and invalidate its CloudFront distribution. Same names as in this repo: secrets AWS_S3_ACCESS_KEY, AWS_S3_SECRET_ACCESS_KEY, AWS_CLOUDFRONT_DISTRIBUTION_ID, variable AWS_S3_BUCKET. FINOS steps 1, 5, 6
P2 GitHub App credentials on finos/calm-schema (DISPATCH_APP_ID, DISPATCH_APP_PRIVATE_KEY) for an app that can create repository_dispatch events on this repo (Contents: write). FINOS the dispatch trigger in step 3
P3 Confirmation of the CLI template change @willosborne step 4

This repo keeps its own AWS secrets, because the docs, lab and video deploys also use them.

Ordering rules

  • One publisher per prefix. s3-sync.yml here syncs with --delete. If it still runs after calm-schema starts to publish, a push to calm/ here overwrites what calm-schema published. Step 1 removes it at the same time.
  • The docs deploy deletes unknown prefixes. s3-docs-sync.yml syncs the docs build to the bucket root with --delete, and keeps only advent/, controls/, draft/, getting-started/, interfaces/, release/, samples/, video/ and workshop/. The next docs deploy deletes anything that calm-schema publishes outside these prefixes. Publish new content under release/<v>/, or add the new prefix to the exclude list first.

Steps

  1. Publish the releases and the interfaces from calm-schema, and remove s3-sync.yml here.
    Needs: P1. @rocketstack-matt must confirm that P1 is in place before this step can be completed.

    • Add a calm-schema workflow that builds release/<v>/meta/ from each release tag (1.0, 1.1, 1.2, not the RCs) and interfaces/ from examples/interfaces/, then invalidates CloudFront. Sync each release/<v>/ prefix separately, so that a sync never deletes another version.
    • Remove s3-sync.yml here in the same change window. The drafts, getting-started and controls are then not published any more. They stay in the bucket until steps 6–8.
    • Done when every release/ and interfaces/ URL returns the same content as before.
  2. Get the schema from npm.
    Needs: nothing.
    The root package.json pins @finos/calm-schema exactly as the latest release, and pins every release with an alias (for example "calm-schema-1.1": "npm:@finos/calm-schema@1.1.0"). Each workspace that imports the package declares it with "*". The CLI, calm-server and calm-hub copy the releases with scripts/copy-calm-schemas.mjs. Their build fails if the latest release has no alias, so a release cannot drop out of the bundles. Renovate raises @finos/calm-schema updates in their own PR, without automerge, and never updates the aliases. A schema update PR must add the new alias.

  3. Add a schema compatibility workflow.
    Needs: step 2. The dispatch trigger also needs P2. @rocketstack-matt must confirm that P2 is in place before that part can be completed. The other triggers do not need P2, so the workflow can merge without it.

    • Triggers: a repository_dispatch from the calm-schema publish workflow after npm publish, a daily check of the npm latest tag as a fallback, and a manual run.
    • Runs the build and tests of every tool against the new version, one job per tool, without fail-fast. This includes ./mvnw verify for calm-hub.
    • If a job fails, it opens one issue for that version (or updates it), with a list of the tools that fail and links to their logs.
    • If all jobs pass, the Renovate PR changes the pinned version.

    npm does not send events to GitHub, so the trigger cannot come from npm directly. The calm-schema GITHUB_TOKEN cannot call another repo, so the dispatch needs the P2 app.

  4. Make the CLI workspace templates use 1.2, and then the latest release from npm.
    Needs: P3. @willosborne, can you confirm this?

  5. Move the deployment decorator standard to calm-schema and release it.
    Needs: step 1 (and so P1), because the calm-schema workflow publishes it.
    Move calm/draft/2026-03/standards/ (the deployment and Kubernetes decorator standards and their examples) to calm-schema, and promote it to a release through the calm-schema release process. Publish it under release/<v>/ (see the ordering rules). Then change the calm-hub seed data and the calm-hub-ui tests to the release URL.

  6. Delete the drafts and release candidates.
    Needs: steps 2, 4 and 5, so that no tool, template or standard uses the drafts. The bucket deletion of the RCs also needs P1. Before the bucket deletion, the CLI smoke fixture cli/smoke/fixtures/genval/conference-signup.pattern.json must stop using the live release/1.0-rc* URLs, because cli-hub-smoke.yml validates it against calm.finos.org.

    • Delete calm/draft and calm/release/1.0-rc*, and remove every reference to them in the tools: the CLI, calm-server and calm-lab bundles, the calm-hub seed data, the tests and fixtures, and the docs.
    • Remove the draft/* exclude from s3-docs-sync.yml, so that the next docs deploy deletes draft/ from the bucket. Delete release/1.0-rc1/ and release/1.0-rc2/ with the calm-schema credentials.
    • Documents that use these URLs as $schema will not resolve after this, so the release notes must say so.
  7. Delete calm/controls.
    Needs: step 1 for the bucket part.
    It contains only a README, and nothing uses it. Remove the controls/* exclude from s3-docs-sync.yml, so that the next docs deploy deletes controls/. docs/docs/core-concepts/controls.md and docs/docs/tutorials/_calm-overview/03-governance.mdx show calm.finos.org/controls/... URLs that already return 404. Correct these examples.

  8. Delete calm/getting-started.
    Needs: step 1 for the bucket part. Before the getting-started/* exclude is removed, the CLI smoke fixture cli/smoke/fixtures/genval/conference-signup.pattern.json must stop using the live getting-started/controls/* URLs.
    It is a "Get Started in 5 Minutes" guide that builds the repo from source and uses a 1.0-rc2 pattern. The beginner tutorials on the docs site and CALM Lab now cover the same steps. Move the files that the CLI e2e test reads into cli/test_fixtures/getting-started, and update docs/flow-template.md and the calm-studio controls doc that refer to it. Remove the getting-started/* exclude from s3-docs-sync.yml, so that the next docs deploy deletes getting-started/.

  9. Remove calm/release and calm/interfaces here.
    Needs: steps 1 and 2, so that calm-schema serves them and no tool here reads them.
    Keep calm/architecture. It is the architecture of the CALM tools, the Spectral workflow lints it, and the CLI docs use it in an example.

  10. Add AGENTS.md and CLAUDE.md to calm-schema and calm-governance.
    Needs: nothing.
    Each AGENTS.md says what the repo owns, which repo owns what across the project, the expected layout (the three repos cloned side by side), and how to work across repos: start the agent in architecture-as-code, add the other two repos as additional directories, and target commands at the correct repo (git -C ../<repo>, gh ... --repo finos/<repo>). CLAUDE.md contains only @AGENTS.md, as in this repo.

  11. Update this repo's AGENTS.md and README.
    Needs: nothing. Remove calm/AGENTS.md and calm/README.md with step 9.
    Send schema work to calm-schema and governance work to calm-governance, refer to the new AGENTS.md files, and add the same multi-repo section.

  12. Correct the calm-schema docs.
    Needs: nothing.
    examples/interfaces/README.md calls the folder "the official repository of standardized CALM interface definitions", says that it is "automatically published to the hosted CALM Hub", and shows a calm-hub.finos.org reference that does not exist. examples/interfaces/example/README.md says that only architecture-as-code may refer to these files.

Alternatives Considered:

Alternative Why not
Keep the schema here and make calm-schema a mirror Two copies that can become different. It reverses the move.
Keep the drafts and release candidates here, frozen The tools must then support schema versions that were never released, and this repo keeps schema files.
Use only the Renovate PR to show failures Renovate here runs once a week. A failing PR does not say which tools need work, and nobody is told about it.
Check npm on a schedule only, with no dispatch No secret in calm-schema is needed, but the result comes up to a day late. It stays as the fallback.

Testing Strategy:

Documentation Requirements:

Steps 10–12, the docs examples in step 7, and any docs site page that tells contributors to edit calm/. The calm-schema README must say that a release starts the compatibility workflow here.

Implementation Checklist:

  • Design reviewed and approved
  • Implementation completed
  • Tests written and passing
  • Documentation updated
  • Relevant workflows updated (if needed)
  • Performance impact assessed

Additional Context:

Activity

  1. 20 remaining items

  2. markscott-ms commented on Oct 16, 2026

    @markscott-ms
    Contributor

    Re: #3240 (comment)

    I am against Option C, as the deployment decorator is something CALMHubUI has first-class support for. I feel that needs to go, or the deployment decorator standard needs to be published. The calm-hub seed is of no use to established CalmHub.

    I am for Option B, as the standards can evolve separately to the schema.

    I am against Option A, for reasons similar to Option B.

  3. rocketstack-matt commented on Oct 18, 2026

    @rocketstack-matt
    MemberAuthor

    @jpgough-ms can I get your input on step 5 - I think I agree with @markscott-ms

  4. rocketstack-matt commented on Oct 23, 2026

    @rocketstack-matt
    MemberAuthor

    Going with option B

  5. rocketstack-matt commented on Oct 23, 2026

    @rocketstack-matt
    MemberAuthor

    Step 5 uses Option B, and it needs a 1.3 release of the schema first.

    The deployment standard uses the draft/2026-03 decorator as its base, and it requires target-type. #2183 agreed target-type and the draft has it, but no release has it. The 1.2 decorator has additionalProperties: false, so on a 1.2 base each example of the standard fails because of target-type, and also because of its $schema. finos/calm-schema#40 proposes 1.3 with both properties, and finos/calm-schema#41 makes the change. With the 1.3 decorator as their base, all four examples are valid. The standard can be published only after 1.3, because its $ref must resolve.

    The plan for Option B:

    Item Plan
    Layout standards/<name>/ in calm-schema. For example, standards/deployment/ holds the deployment and Kubernetes standards and their examples.
    Version Each standard has its own version, with one tag for each release, for example standard-deployment-v1.0.
    $id https://calm.finos.org/standards/<name>/<major>.<minor>/<file>
    Publish publish-site.yml builds each standard tag, checks each $id against its URL, syncs each standards/<name>/<version>/ prefix separately, and invalidates /standards/*.
    Bucket The docs deploy in this repo deletes unknown prefixes, so the standards/* exclude must merge first. #3416 adds it.
    CalmHub seed CalmHub keeps its own copy of the standard as seed data, as #3368 did for the interfaces. The npm package does not include the standards.

    #3416 also stops the CLI smoke test from using the getting-started/ and release candidate URLs, and removes the getting-started/* exclude. This completes step 8, and the bucket part of step 6 no longer waits for the smoke fixture.

  6. rocketstack-matt commented on Oct 24, 2026

    @rocketstack-matt
    MemberAuthor

    Schema release 1.3 is published: npm 1.3.0 and release/1.3/meta/ on calm.finos.org, both identical to the v1.3 tag. The release could not publish standards/deployment/1.0/, because the calm-schema credentials can write only release/* and interfaces/*.

    Item Where
    The tools move to 1.3 (closes #3432) #3433
    CALM Hub seeds the released standard (closes #3428) #3435
    How CALM Hub gets standards from now on, and whether calm-schema publishes them #3434
    Two gaps in publish-site.yml that the release showed finos/calm-schema#44
  7. rocketstack-matt commented on Oct 26, 2026

    @rocketstack-matt
    MemberAuthor

    The three decorator standards are on calm.finos.org. FINOS gave the calm-schema publisher access to standards/* on 2026-10-26, and publish-site.yml ran in run 40318698209. The run added the standards and deleted nothing. Every release/ and interfaces/ URL has the same content as before, and each standard is identical to its tag. Step 5 is complete. #3434 stays open, to decide how CALM Hub gets standards from now on.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

No labels
No labels

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions