Skip to content

What's New

A hand-curated rollup of capabilities shipped recently. If you learned chant before this lands, this page is the catch-up. Each entry links to the closing issue or PR for the full context.

For the day-to-day reference docs see Lifecycle Models, chant lifecycle, Live Import, Reconciling Lifecycle, Drift Detection, and Implementing Observation.

The follow-on to the observation thread: chant turned its single observational drift workflow into a full family — observe → reconcile → authoritative, chosen per environment. It gained live import (regenerate TypeScript from running cloud/cluster state) and projection + cloud-side ownership (a precise create/update/delete change set computed against live), without hosting an authoritative state file. The snapshot is never load-bearing — the projection reads ownership from the live resource only. Primitives need no executor; only gated/destructive Ops require Temporal.

#Capability
#113exportResources() on the LexiconPlugin contract — full-fidelity import IR from a live API, branded distinct from the scrubbed observation types so a secret-bearing export can never reach the state code paths
#114chant import --from <env> — live import driver with --type / --name / --owned / --verbatim selectors and a secrets warning
#115, #116, #117Live export for AWS (CloudFormation get-template), Kubernetes (kubectl get -o json, stripped to declared shape), and GCP Config Connector
#159Live export for Azure (az group export) — makes Azure a full live-import peer alongside AWS, GCP, and Kubernetes; --owned filtering via the chant-managed-by tag
#118chant lifecycle plan — typed ChangeSet (create / update / delete / adopt / noop) from the live diff; strictly read-only
#119Ownership marker contract + serializer stamping — provider-native marker (AWS/Azure tags, K8s/GCP labels) carrying stack identity, stamped at synthesis. Opt-in via ownership config; walk-away cost stays zero
#120owned filter on describe/export — query the marker live; marker present + undeclared → delete candidate, absent → foreign (adopt only); degrades to detect-only where no marker channel exists
#121Ownership-gated delete in the change set — delete only for owned orphans, read from the live marker, never from the snapshot
#122reconcilePr Op activity — regenerate drifted/orphaned entities and open a reviewable PR (modes: pull-request / issue / report); never commits to the main branch
#123ReconcileOp composite — the cloud → code workflow (snapshot → plan → reconcile); one-shot on the local executor, continuous on a Temporal cron
#124ApplyOp composite — the code → cloud workflow via native apply (kubectl apply / CloudFormation deploy / ARM); deletes ride the marker-scoped native prune, so they only ever touch owned orphans
#125Approval gates + compensation for destructive apply — durable wait-for-signal, saga-style onFailure rollback, crash-resume; where Temporal is load-bearing
#126#131Docs: new Lifecycle Models (three-axis model + dial) and Durable Workflows concept pages; Live Import and Reconciling Lifecycle guides; Implementing Live Export authoring guide; governance/comparison revised to retire the “no plan” concession; cross-page tone audit

The biggest single thread. chant lifecycle diff went from a digest-vs-digest fingerprint check to a real live-vs-declared-vs-snapshot diff that catches out-of-band cloud mutations across nine lexicons.

#Capability
#26chant lifecycle diff <env> --live — three-way diff (declared / observed-now / observed-then), six resource categories (missing / orphan / disappeared / newly observed / drifted / unchanged) with attribute-level deltas
#27Temporal lexicon describeResources() — namespaces, search attributes, schedules
#39describeResources() contract gains entity-prop pass-through — lexicons now receive declared props (e.g. K8s metadata.name/namespace) and can map cloud-side identifiers back to chant entity names
#42Five describeResources() implementations — AWS, Azure, GCP (Config Connector), Kubernetes, Temporal
#51listArtifacts() plugin contract — context-keyed observation for lexicons whose chant entities describe authoring primitives rather than 1:1 cloud resources
#52Helm listArtifacts() — Helm releases via helm list -A -o json
#53Docker listArtifacts() — containers / images / networks via three independent NDJSON queries
#54Flyway listArtifacts() — per-environment migration history
#55Slurm listArtifacts() — partition state via sinfo
#56GitHub / GitLab — runtime observation documented as N/A; both describe git-tracked authoring primitives where drift is git diff
#30chant/lifecycle orphan branch concurrency — pushes use --force-with-lease; concurrent snapshots fail fast instead of silently overwriting
#31WatchOp composite — periodic lifecycle observation by pairing an Op (Snapshot + Diff phases) with a TemporalSchedule

The Op composite gained two ergonomic upgrades that were previously hand-coded boilerplate in every example.

#Capability
#28Op codegen auto-emits upsertSearchAttributes()OpName at workflow start, Phase at each phase boundary, plus any user-declared searchAttributes. No more hand-rolled boilerplate; chant run list and Temporal UI filters work out of the box
#41outcomeAttribute on activity steps — capture an activity’s return value (e.g. stateDiff’s drifted boolean) as a workflow search attribute. Used by WatchOp to surface Drift = "true"/"false" per run
#29, #40Test coverage for cli/handlers/state.ts, run.ts, graph.ts, and runOp — refactor surface is now safe
#161Temporal runtime harness — runs the serializer’s actual generated workflow under a time-skipping TestWorkflowEnvironment: phase ordering, gate waits for the approval signal (not the timeout), onFailure compensation in reverse, and ApplyOp’s gated destructive apply (#125)
#162Compile-smoke for generated Op output — type-checks the emitted workflow.ts/worker.ts/activities.ts against the live activity signatures, so an activity-signature change that the serializer doesn’t track fails at compile time instead of drifting silently
#173Generated workflows are workflow-sandbox-safe — activity profiles import from the import-free config leaf instead of the package root, so the Temporal worker’s bundler no longer drags node:fs/node:path into the deterministic workflow VM (the generated workflow now bundles and runs). Surfaced by the #161 harness

A typed-compiler port of the upstream gitlab-org/ci-cd/github-actions-to-gitlab-ci Agent Skill (MIT). Translates .github/workflows/*.yml into .gitlab-ci.yml (or chant TypeScript) with per-key provenance recorded as SARIF, a curated mapping registry for the top 33 marketplace actions, and optional composite-pattern recognition for Node-shaped pipelines. The gitlab plugin exposes the same translation via a gitlab:migrate MCP tool and a chant-gitlab-migrate skill.

#Capability
#85GitHub → GitLab IR transformer with per-key provenance side channel; Kahn topo-sort stage inference; 30+ rule IDs for translation events
#86chant migrate CLI — top-level command dispatching through a new optional migrationSource(from) hook on LexiconPlugin
#87ActionMapping[] registry — Tier 1 (14 essentials): checkout, setup-, cache, artifacts, docker/
#88ActionMapping Tier 2 (14 common) + Tier 3 (5 niche) — covers all 33 actions from the upstream skill’s reference table
#98Fixtures lifted from the upstream skill’s syntax-mapping + marketplace-actions before/after pairs; 16 fixture-driven tests asserting canonical-YAML and shape-of-report equality
#89--emit ts mode — produces typed chant TypeScript the user owns and rebuilds with chant build
#90SARIF v2.1.0 report (--report <path>) + --strict exit-code escalation on needs-review diagnostics
#91--validate shells out to glci (offline) or glab ci lint (fallback); skips gracefully when neither is on PATH
#92--use-composites IR-level recogniser — collapses 2-job Node pipelines into a single NodePipeline({...}) call
#93lexicons/gitlab/scripts/migrate-samples.sh — local roundtrip harness over real public GitHub workflows; 70% pass-rate threshold
#95chant-gitlab-migrate skill + new chant init --skill <name> filter to install a single skill
#96gitlab:migrate MCP tool registered on the gitlab plugin’s MCP server
#94Migration docs page with inspiration / lineage section crediting the upstream MIT-licensed skill
#97Umbrella — full work landed on PR #99 (draft)
#Capability
#21Lexicon root index.ts re-exports — three composites that examples imported through deep paths now exported from the package root; silent build failures resolved
#23, #25Azure schema parser — upstream renamed NetworkInterfaceIPConfiguration / SubnetPropertiesFormat / SecurityRule to Common*-prefixed names; bare property aliases now apply correctly, CI green
#38chant build writes output paths whose parent directory doesn’t exist (mkdir-p) — previously failed with ENOENT on first build of a project with nested output dirs

After all the runtime work shipped, the docs site got a sweep to surface it:

#Capability
#63Accuracy fixes — stale claims, broken links, rollup misses across index.mdx, comparison, philosophy, installation, quick-start, cli/overview
#64Watching Lifecycle — first-class user-guide page for WatchOp (was previously a subsection of the Ops guide)
#65Implementing Observation — lexicon-author walkthrough of describeResources() and listArtifacts() with patterns from all 9 shipping implementations
#66Drift Detection — concept page for the observational lifecycle model, ten diff categories, and when drift detection earns its keep
#67This page + the lexicon observation coverage matrix

These shipped before the observation thread but underpin everything above. Listed for completeness:

  • #5 Node.js migration + dev toolchain cleanup
  • #6 Temporal lexicon — TemporalNamespace, TemporalSchedule, SearchAttribute, plus the lint rules and composites
  • #7 Op composite + build pipeline integration
  • #8 chant run CLI
  • #9 MCP tools for Op
  • #10 Migrate spells to Ops
  • #11 Op replaces spells with Temporal-backed deployment workflows