rawctx package work is easier to reason about if you separate the local directory from the uploaded archive. Both pack and publish take the package directory as input; publish rebuilds the archive internally after validation. Package directories can now be either converted OSI or native MetricFlow snapshots.
pack creates a deterministic .rawctx.tar.gz locally. publish does not take that tarball as input; it validates the directory again, builds a temporary archive, calculates the checksum, requests an upload URL, uploads bytes, and completes the version.
README.md is optional, but if it exists it is included in the archive and sent with publish metadata. Legacy install snippets are rewritten from rawctx install to rawctx snapshot-download during publish. Native MetricFlow packages can also carry extra snapshot files such as dbt_project.yml through include.
Required checksname: @scope/packageversion: X.Y.Zformat: osi|metricflowmodels: relative filesinclude: optional extras
Model paths cannot be absolute, cannot contain .., and must resolve to real files inside the package directory. The same rule applies to include.
Archive contentsThe builder includes the manifest, the optional README, every file named in models, any include files, and checksums.sha256.
package/rawctx.yaml
package/README.md
package/dbt_project.yml
package/models/customers.yml
package/models/orders.yml
package/checksums.sha256
Pack vs publishrawctx pack: local archive only, no auth, no control-plane call.rawctx publish: auth required, control-plane upload, version completion.rawctx publish --from-dbt: convert plus package plus publish by default, or native MetricFlow publish when you add --native.