Repository navigation
Finish moving the CALM schema to finos/calm-schema and test the tools against each new release #3240
Description
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.ymlin this repo still publishescalm/to the bucket behindcalm.finos.org. Every schema$idpoints there. calm-schema publishes to npm only.- No package in this repo uses
@finos/calm-schema. All tools readcalm/releaseandcalm/draftfrom this repo. - The README,
AGENTS.mdandcalm/AGENTS.mdstill 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.organd 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.ymlhere syncs with--delete. If it still runs after calm-schema starts to publish, a push tocalm/here overwrites what calm-schema published. Step 1 removes it at the same time. - The docs deploy deletes unknown prefixes.
s3-docs-sync.ymlsyncs the docs build to the bucket root with--delete, and keeps onlyadvent/,controls/,draft/,getting-started/,interfaces/,release/,samples/,video/andworkshop/. The next docs deploy deletes anything that calm-schema publishes outside these prefixes. Publish new content underrelease/<v>/, or add the new prefix to the exclude list first.
Steps
-
Publish the releases and the interfaces from calm-schema, and remove
s3-sync.ymlhere.
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) andinterfaces/fromexamples/interfaces/, then invalidates CloudFront. Sync eachrelease/<v>/prefix separately, so that a sync never deletes another version. - Remove
s3-sync.ymlhere 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/andinterfaces/URL returns the same content as before.
- Add a calm-schema workflow that builds
-
Get the schema from npm.
Needs: nothing.
The rootpackage.jsonpins@finos/calm-schemaexactly 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 withscripts/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-schemaupdates in their own PR, without automerge, and never updates the aliases. A schema update PR must add the new alias. -
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_dispatchfrom the calm-schema publish workflow afternpm publish, a daily check of the npmlatesttag 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 verifyfor 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_TOKENcannot call another repo, so the dispatch needs the P2 app. - Triggers: a
-
Make the CLI
workspacetemplates use 1.2, and then the latest release from npm.
Needs: P3. @willosborne, can you confirm this? -
Move the deployment decorator standard to calm-schema and release it.
Needs: step 1 (and so P1), because the calm-schema workflow publishes it.
Movecalm/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 underrelease/<v>/(see the ordering rules). Then change the calm-hub seed data and the calm-hub-ui tests to the release URL. -
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 fixturecli/smoke/fixtures/genval/conference-signup.pattern.jsonmust stop using the liverelease/1.0-rc*URLs, becausecli-hub-smoke.ymlvalidates it againstcalm.finos.org.- Delete
calm/draftandcalm/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 froms3-docs-sync.yml, so that the next docs deploy deletesdraft/from the bucket. Deleterelease/1.0-rc1/andrelease/1.0-rc2/with the calm-schema credentials. - Documents that use these URLs as
$schemawill not resolve after this, so the release notes must say so.
- Delete
-
Delete
calm/controls.
Needs: step 1 for the bucket part.
It contains only a README, and nothing uses it. Remove thecontrols/*exclude froms3-docs-sync.yml, so that the next docs deploy deletescontrols/.docs/docs/core-concepts/controls.mdanddocs/docs/tutorials/_calm-overview/03-governance.mdxshowcalm.finos.org/controls/...URLs that already return 404. Correct these examples. -
Delete
calm/getting-started.
Needs: step 1 for the bucket part. Before thegetting-started/*exclude is removed, the CLI smoke fixturecli/smoke/fixtures/genval/conference-signup.pattern.jsonmust stop using the livegetting-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 intocli/test_fixtures/getting-started, and updatedocs/flow-template.mdand the calm-studio controls doc that refer to it. Remove thegetting-started/*exclude froms3-docs-sync.yml, so that the next docs deploy deletesgetting-started/. -
Remove
calm/releaseandcalm/interfaceshere.
Needs: steps 1 and 2, so that calm-schema serves them and no tool here reads them.
Keepcalm/architecture. It is the architecture of the CALM tools, the Spectral workflow lints it, and the CLI docs use it in an example. -
Add
AGENTS.mdandCLAUDE.mdto calm-schema and calm-governance.
Needs: nothing.
EachAGENTS.mdsays 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.mdcontains only@AGENTS.md, as in this repo. -
Update this repo's
AGENTS.mdand README.
Needs: nothing. Removecalm/AGENTS.mdandcalm/README.mdwith step 9.
Send schema work to calm-schema and governance work to calm-governance, refer to the newAGENTS.mdfiles, and add the same multi-repo section. -
Correct the calm-schema docs.
Needs: nothing.
examples/interfaces/README.mdcalls the folder "the official repository of standardized CALM interface definitions", says that it is "automatically published to the hosted CALM Hub", and shows acalm-hub.finos.orgreference that does not exist.examples/interfaces/example/README.mdsays 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:
- In step 1, compare every
release/andinterfaces/URL oncalm.finos.orgwith its content before the change. They must be identical. - After step 2, all test suites and
./mvnw verifyfor calm-hub must pass with the npm packages. - After step 6, a search for
draft/and1.0-rcoutside the CHANGELOGs finds no references, except the items that Remove the 2026-03 draft after early adopters finish their migration #3533, Remove draft/2025-03 from calm.finos.org after OpenRewrite declares a CALM release #3507 and Remove the CALM 1.0 release candidates from calm.finos.org #3514 track. - Run the step 3 workflow manually against 1.2.0 (it must pass and must not open an issue), and against a version that breaks a tool (it must open one issue that names that tool).
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:
- History migration: Migrate 2025-03 draft + 1.0-rc1 schema history [MERGE COMMIT ONLY] calm-schema#12, Refactor nodes and relationships #14, Major refactor - migrating CALM to a specific JSON vocabulary #15, TLS, mTLS and TCP should be added to the Protocol Enum #16, Add Certificate to the Authentication Enum #18 (releases) and Spectral validation PoC #28 (interfaces).
- On 2026-10-04, the
metafiles at each calm-schema tag were compared withcalm/release/<v>/metahere. They are identical.
Activity
docs(vscode): say where the extension's CALM schemas come from
build(calm-hub): bundle the CALM meta-schemas from npm
ci(calm-hub): publish the hub images when the schema packages change
ci: test the tools against each new CALM schema release
ci: update only the lockfile when the compatibility check swaps the s…
chore: remove the unused calm/controls folder (#3242)
chore: remove the calm/getting-started guide
chore: remove the calm/getting-started guide (#3243)
build(cli): bundle the released CALM schemas from npm
ci: test the tools against each new CALM schema release
ci: update only the lockfile when the compatibility check swaps the s…
ci: test the tools against each new CALM schema release
ci: update only the lockfile when the compatibility check swaps the s…
20 remaining items
fix(interfaces): give each example interface the $id of its published…
docs: add AGENTS.md and correct the interfaces README
chore: remove the published calm/ folders and send schema work to cal…
fix(calm-hub): seed the released schemas from the npm copy and own th…
markscott-ms commentedon Oct 16, 2026
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.
rocketstack-matt commentedon Oct 18, 2026
@jpgough-ms can I get your input on step 5 - I think I agree with @markscott-ms
rocketstack-matt commentedon Oct 23, 2026
Going with option B
rocketstack-matt commentedon Oct 23, 2026
Step 5 uses Option B, and it needs a 1.3 release of the schema first.
The deployment standard uses the
draft/2026-03decorator as its base, and it requirestarget-type. #2183 agreedtarget-typeand the draft has it, but no release has it. The 1.2 decorator hasadditionalProperties: false, so on a 1.2 base each example of the standard fails because oftarget-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$refmust resolve.The plan for Option B:
standards/<name>/in calm-schema. For example,standards/deployment/holds the deployment and Kubernetes standards and their examples.standard-deployment-v1.0.$idhttps://calm.finos.org/standards/<name>/<major>.<minor>/<file>publish-site.ymlbuilds each standard tag, checks each$idagainst its URL, syncs eachstandards/<name>/<version>/prefix separately, and invalidates/standards/*.standards/*exclude must merge first. #3416 adds it.#3416 also stops the CLI smoke test from using the
getting-started/and release candidate URLs, and removes thegetting-started/*exclude. This completes step 8, and the bucket part of step 6 no longer waits for the smoke fixture.test(cli): serve the smoke test's cross-host controls locally and use…
ci: delete getting-started/ from calm.finos.org with the next docs de…
ci: keep the standards/ prefix out of the docs deploy
rocketstack-matt commentedon Oct 24, 2026
Schema release 1.3 is published: npm 1.3.0 and
release/1.3/meta/on calm.finos.org, both identical to thev1.3tag. The release could not publishstandards/deployment/1.0/, because the calm-schema credentials can write onlyrelease/*andinterfaces/*.publish-site.ymlthat the release showedrocketstack-matt commentedon Oct 26, 2026
The three decorator standards are on calm.finos.org. FINOS gave the calm-schema publisher access to
standards/*on 2026-10-26, andpublish-site.ymlran in run 40318698209. The run added the standards and deleted nothing. Everyrelease/andinterfaces/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.ci: delete the 2026-03 draft from calm.finos.org
fix(calm-hub): declare CALM 1.3 in the seed patterns