Skip to content

The stack export

llms.txt lists every page for an agent

A Pulumi member’s graph is read from its pulumi stack export. chant never runs the program or pulumi to build the graph, so the export is everything the graph knows about the member, and an export that is stale or damaged gives a graph that is wrong in the same way.

A stack applied through the pulumi-up capability needs no file. After each up, chant runs pulumi stack export --stack <stack> (plunge stack export on plunge), replaces every secret with [secret], drops the secrets provider’s state, and writes the export to its index store as <env>/<stack>__pulumi-export.json, on refs/chant/snapshots unless snapshots in chant.config.ts names another store. The graph, the preview’s prior state, the drift read and CHANT_PULUMI_APPLIED_OUTPUTS=export read that export first, and read a checked-in stack-export.json only when the store holds none.

For a stack applied outside chant, in the member’s directory, with the stack selected:

Terminal window
pulumi stack export --file stack-export.json

Take it again after each pulumi up and commit it. A member on plunge uses plunge stack export the same way. Never pass --show-secrets: the file is committed, and the default export keeps each secret encrypted with the stack’s secrets provider.

FieldUsed for
deployment.resources[].urnthe node id, <member>/<type>::<name>, and the drift read’s targets
deployment.resources[].typethe node’s type; providers and the root stack get no node
deployment.resources[].parent, dependenciesthe node’s edges
deployment.pending_operationsPUL002
the root stack’s outputsapplied outputs, with CHANT_PULUMI_APPLIED_OUTPUTS=export

Inputs and outputs are never copied into the graph.

A build that reads a member, through pulumi.member in chant.config.ts or the reader project chant workspace graph writes, runs these post-synth checks over the export. Each is silent in a build that reads no member. chant audit shows the same titles and remediations from the lexicon’s audit catalog.

IdSeverityReportsFix
PUL001warningno stack-export.json, or one that is not JSON; the member has no nodestake the export
PUL002warningpending_operations left by an interrupted updatepulumi refresh, then export again
PUL003errorsecret values in plaintext, from --show-secretsexport again without it, and rotate the secrets the commit exposed
PUL004warningdelete: true, the old object of a replacement whose delete failedpulumi up retries the delete; export again
PUL005warningpendingReplacement: true, deleted for a replacement that was never createdpulumi up finishes it; export again
PUL006infotaint: true; the next update replaces the resourceexpect the replace, or pulumi state untaint
PUL007warningpulumi.member.stack is not the stack the export’s URNs nameexport that stack, or fix the config
PUL008warningURNs from more than one stack or projectreplace the file with one export
PUL009warningthe URNs’ project is not Pulumi.yaml’s nameexport this member’s own stack
PUL010warninga parent or dependency the export does not holdreplace the file with a fresh export
PUL011warningtwo entries for one URN, neither pending deletionreplace the file with a fresh export
PUL012infoexternal: true, resources the program reads and does not managenone; their drift is another owner’s
PUL013warninga version other than 3, or noneexport with the Pulumi CLI
PUL014infono resources besides the stack and its providersexport again once the stack is deployed
PUL015warningengine: "pulumi" while plywood.yml, PULUMI_BACKEND_URL or Pulumi.yaml names a plunge backend (the reverse is not reported)drop engine, or set it to "plunge"

PUL003 is the only error, so it is the only one that fails chant build. It is also the only one chant audit lists as merge-worthy and security; the others are report-only. PUL101, a lint rule over source rather than the export, warns when pulumi.member.dir is written as an absolute path.

The chant-pulumi-stack-export skill carries this table for an agent, with the commands the stack’s owner runs for each fix.

chant