|
1 | 1 | --- |
2 | 2 | title: "chant, CDK and Pulumi" |
3 | | -summary: "All three let you write infrastructure in TypeScript. Only one of them refuses to run it." |
| 3 | +summary: "All three take TypeScript. Only one refuses to run it." |
4 | 4 | weight: 20 |
5 | 5 | --- |
6 | 6 |
|
7 | | -CDK and Pulumi are programs. You write TypeScript, the tool executes it, and what comes out depends on what ran: a context lookup, an environment variable, a call into the SDK. CDK synthesizes a CloudFormation template you can read afterwards. Pulumi keeps its own state and shows you a preview. |
8 | | - |
9 | | -[chant](https://intentius.io/chant/) is source. It accepts the subset of TypeScript whose value is fully determined by literals, constants and references, and folds that source to the platform's own spec, CloudFormation or a Kubernetes manifest or a Fly machine config, with no module execution. A call-as-value is not refused by a lint rule; it is unrepresentable. The [specification](https://github.com/INTENTIUS/typescript-as-data) and a conformance suite are public. |
10 | | - |
11 | | -That one difference decides most of the rows below. |
12 | | - |
13 | | -## Row by row |
| 7 | +CDK and Pulumi execute your program, and the output depends on what ran. [chant](https://intentius.io/chant/) accepts only the subset of TypeScript whose value is fixed by literals and references, and folds it to the platform's own spec with no execution. The [subset is a spec](https://github.com/INTENTIUS/typescript-as-data) with a conformance suite. |
14 | 8 |
|
15 | 9 | | Property | chant | CDK | Pulumi | |
16 | 10 | |---|---|---|---| |
17 | | -| The source predicts the platform spec | Folds to native spec, no run | Synthesizes a template, but a lookup can shift it when it runs | Runs the program; no static spec, only an engine preview | |
18 | | -| The same check at the keystroke | Type and fold diagnostics, human and agent alike | TypeScript types check; infra correctness needs synth and a plan | TypeScript types check; infra correctness needs a preview | |
19 | | -| Every change is one diff in one place | One typed change set against live | `cdk deploy` | `pulumi up` | |
20 | | -| Secrets by name, least privilege | By reference, never held, keyless signing | Refs and IAM, but the program can read secrets at runtime | ESC gives references, but core stores secrets in state | |
21 | | -| Bounded blast radius | Owned-only by marker, a per-environment removal cap, a blast-radius graph | Stack and IAM boundaries; refs can widen reach | Stack and IAM boundaries; refs can widen reach | |
22 | | -| Reversible before risky | Reversible runs ungated; destructive gated with saga rollback | CloudFormation auto-rollback; no gate on an irreversible change | No rollback; re-apply a prior state | |
23 | | -| Escalate the judgment | A durable approval gate that survives a crash | Approval in the CI pipeline | Approval via a paid add-on | |
24 | | -| The live system is the truth | No state store | No tool-side copy; CloudFormation's own record | Keeps its own authoritative state | |
25 | | -| Adopt in place | Imports a template or a live estate; the spec stays native | `cdk import`, then rewrite as code | `pulumi import`, then rewrite as code | |
26 | | -| Manage only what you declare | Deletes gated on an ownership marker | Absence in the template deletes | Absence in the program deletes | |
27 | | -| Verify the artifact | SBOM, provenance and a signature at synthesis, verified at the deploy gate | CI add-ons | CI add-ons | |
| 11 | +| Source predicts the spec | Folds, no run | Synthesizes, but a lookup can shift it | Engine preview only | |
| 12 | +| Check at the keystroke | Type and fold diagnostics | Types; correctness needs synth and plan | Types; correctness needs a preview | |
| 13 | +| Secrets by name | By reference, never held | Program can read them at runtime | Core stores them in state | |
| 14 | +| Blast radius | Owned-only by marker, removal cap | Stack and IAM; refs widen reach | Stack and IAM; refs widen reach | |
| 15 | +| Reversible before risky | Destructive gated, saga rollback | Auto-rollback, no gate | No rollback | |
| 16 | +| Escalate the judgment | Durable gate | In the CI pipeline | Paid add-on | |
| 17 | +| Live system is the truth | No state store | CloudFormation's record | Its own state | |
| 18 | +| Adopt in place | Spec stays native | `cdk import`, then rewrite | `pulumi import`, then rewrite | |
| 19 | +| Manage only what you declare | Deletes gated on a marker | Absence deletes | Absence deletes | |
| 20 | +| Verify the artifact | SBOM, provenance, signature | CI add-ons | CI add-ons | |
28 | 21 |
|
29 | | -The [full scorecard](/accessible-ops/) has the reasoning behind each mark and the two rows this table leaves out. |
| 22 | +The [scorecard](/accessible-ops/) has the reasoning behind each mark. |
30 | 23 |
|
31 | | -## What CDK and Pulumi have that chant does not |
| 24 | +## What they have that chant does not |
32 | 25 |
|
33 | | -Reach and years. CDK covers every CloudFormation resource and Pulumi covers every provider Terraform does. chant covers seventeen platforms through its lexicons, and a resource a lexicon does not model is not something you can declare yet. The [lexicon list](https://intentius.io/chant/) is the honest boundary, and a compatibility page in the shape of the one above is filed and not yet written. {{< status kind="open" href="https://github.com/INTENTIUS/chant/issues/2318" >}} |
| 26 | +Reach and years. A resource a lexicon does not model cannot be declared yet. A compatibility page is filed and not written. {{< status kind="open" href="https://github.com/INTENTIUS/chant/issues/2318" >}} |
34 | 27 |
|
35 | | -## Where we are waiting |
| 28 | +## Fixed, and still open |
36 | 29 |
|
37 | | -- Until chant 0.63 the approval gate recorded who approved and when but not which plan. Approve, then edit the root and re-run, and the edited change applied. Since 0.63 a resolution names the plan digest and the re-run is refused by name. That was our own biggest hole, and it is closed rather than never having existed. {{< status kind="shipped" date="2026-09-09" href="https://github.com/INTENTIUS/chant/pull/2338" >}} |
38 | | -- An agent driving chant over MCP or ACP can still answer a gate it raised itself. Until that closes, no claim about approval integrity across both products. {{< status kind="open" href="https://github.com/INTENTIUS/chant/issues/2384" >}} |
39 | | -- The largest synthetic benchmark is 200 resources. There is no measured scale figure for chant comparable to choudoufu's 745, and none is claimed. {{< status kind="open" href="https://github.com/INTENTIUS/chant/issues/2317" >}} |
| 30 | +Until 0.63 an approval did not name the plan it approved. It does now. {{< status kind="shipped" date="2026-09-09" href="https://github.com/INTENTIUS/chant/pull/2338" >}} An agent on MCP can still answer its own gate. {{< status kind="open" href="https://github.com/INTENTIUS/chant/issues/2384" >}} No scale figure beyond a 200-entity bench. {{< status kind="open" href="https://github.com/INTENTIUS/chant/issues/2317" >}} |
0 commit comments