@intentius/chant 0.124.46 → 0.124.48
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__golden__/wave-loop/op-by-apply-after-fails.json +10 -0
- package/dist/__golden__/wave-loop/op-by-apply-hold.json +10 -0
- package/dist/__golden__/wave-loop/op-by-apply-ignored.json +10 -0
- package/dist/__golden__/wave-loop/op-by-apply-pass.json +10 -0
- package/dist/__golden__/wave-loop/op-by-apply-skip.json +10 -0
- package/dist/__golden__/wave-loop/op-cost-member-clash.json +6 -0
- package/dist/__golden__/wave-loop/op-cost-member.json +13 -0
- package/dist/__golden__/wave-loop/op-denied-source.json +16 -0
- package/dist/__golden__/wave-loop/op-denied.json +16 -0
- package/dist/__golden__/wave-loop/op-discover-rest-short.json +6 -0
- package/dist/__golden__/wave-loop/op-discover-rest-stops.json +13 -0
- package/dist/__golden__/wave-loop/op-discover-rest.json +26 -0
- package/dist/__golden__/wave-loop/op-discover-wide.json +26 -0
- package/dist/__golden__/wave-loop/op-held-on-again.json +16 -0
- package/dist/__golden__/wave-loop/op-held-on-before-apply.json +16 -0
- package/dist/__golden__/wave-loop/op-held-on.json +16 -0
- package/dist/__golden__/wave-loop/op-hooks-apply-fails.json +13 -0
- package/dist/__golden__/wave-loop/op-hooks-fail-after-apply.json +13 -0
- package/dist/__golden__/wave-loop/op-hooks-fail-before-apply.json +13 -0
- package/dist/__golden__/wave-loop/op-hooks-fail-before-plan.json +13 -0
- package/dist/__golden__/wave-loop/op-hooks-held.json +13 -0
- package/dist/__golden__/wave-loop/op-hooks-hold-before-apply.json +13 -0
- package/dist/__golden__/wave-loop/op-hooks-pass.json +13 -0
- package/dist/__golden__/wave-loop/op-hooks-refused-at-base.json +13 -0
- package/dist/__golden__/wave-loop/op-hooks-share.json +33 -0
- package/dist/__golden__/wave-loop/op-outcome-held.json +10 -0
- package/dist/__golden__/wave-loop/op-outcome-replan-approved.json +10 -0
- package/dist/__golden__/wave-loop/op-outcome-replan-forever.json +10 -0
- package/dist/__golden__/wave-loop/op-outcome-replan.json +10 -0
- package/dist/__golden__/wave-loop/op-outcome-stood-down.json +10 -0
- package/dist/__golden__/wave-loop/op-outcome-unreadable.json +10 -0
- package/dist/__golden__/wave-loop/op-overridden.json +16 -0
- package/dist/__golden__/wave-loop/op-per-run.json +20 -0
- package/dist/__golden__/wave-loop/op-point.json +13 -0
- package/dist/__golden__/wave-loop/op-pr-review.json +10 -0
- package/dist/__golden__/wave-loop/op-sealed.json +10 -0
- package/dist/__golden__/wave-loop/op-spend-change-only.json +10 -0
- package/dist/__golden__/wave-loop/op-spend.json +10 -0
- package/dist/__golden__/wave-loop/op-wave-commands.json +55 -0
- package/dist/__golden__/wave-loop/op-wide-refused.json +26 -0
- package/dist/__golden__/wave-loop/op-wide-waiting.json +29 -0
- package/dist/__golden__/wave-loop/op-wide.json +39 -0
- package/dist/action-pins.d.ts +61 -0
- package/dist/action-pins.d.ts.map +1 -0
- package/dist/action-pins.js +77 -0
- package/dist/cli/commands/carve.d.ts +3 -0
- package/dist/cli/commands/carve.d.ts.map +1 -1
- package/dist/cli/commands/carve.js +36 -7
- package/dist/cli/commands/import-report.d.ts +26 -0
- package/dist/cli/commands/import-report.d.ts.map +1 -0
- package/dist/cli/commands/import-report.js +65 -0
- package/dist/cli/commands/import.d.ts +11 -1
- package/dist/cli/commands/import.d.ts.map +1 -1
- package/dist/cli/commands/import.js +22 -3
- package/dist/cli/commands/migrate.d.ts +13 -1
- package/dist/cli/commands/migrate.d.ts.map +1 -1
- package/dist/cli/commands/migrate.js +134 -10
- package/dist/cli/handlers/approve.d.ts.map +1 -1
- package/dist/cli/handlers/approve.js +21 -2
- package/dist/cli/handlers/build.d.ts.map +1 -1
- package/dist/cli/handlers/build.js +6 -1
- package/dist/cli/handlers/ledger.d.ts +3 -0
- package/dist/cli/handlers/ledger.d.ts.map +1 -0
- package/dist/cli/handlers/ledger.js +55 -0
- package/dist/cli/handlers/migrate.d.ts.map +1 -1
- package/dist/cli/handlers/migrate.js +18 -11
- package/dist/cli/handlers/misc.d.ts.map +1 -1
- package/dist/cli/handlers/misc.js +12 -1
- package/dist/cli/handlers/pr-env.js +2 -2
- package/dist/cli/handlers/pr.d.ts +15 -1
- package/dist/cli/handlers/pr.d.ts.map +1 -1
- package/dist/cli/handlers/pr.js +143 -39
- package/dist/cli/handlers/query.d.ts +7 -2
- package/dist/cli/handlers/query.d.ts.map +1 -1
- package/dist/cli/handlers/query.js +16 -4
- package/dist/cli/handlers/release.d.ts.map +1 -1
- package/dist/cli/handlers/release.js +6 -3
- package/dist/cli/handlers/search.d.ts +2 -4
- package/dist/cli/handlers/search.d.ts.map +1 -1
- package/dist/cli/handlers/search.js +13 -39
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +65 -14
- package/dist/cli/parse-args.d.ts.map +1 -1
- package/dist/cli/parse-args.js +36 -2
- package/dist/cli/registry.d.ts +14 -4
- package/dist/cli/registry.d.ts.map +1 -1
- package/dist/components/builders.d.ts +5 -1
- package/dist/components/builders.d.ts.map +1 -1
- package/dist/components/builders.js +5 -0
- package/dist/components/capability-plugin-loader.d.ts.map +1 -1
- package/dist/components/capability-plugin-loader.js +16 -1
- package/dist/components/capability-plugin.d.ts +14 -0
- package/dist/components/capability-plugin.d.ts.map +1 -1
- package/dist/components/pr-hooks.d.ts +21 -1
- package/dist/components/pr-hooks.d.ts.map +1 -1
- package/dist/components/pr-hooks.js +72 -4
- package/dist/components/pr-pipeline.d.ts +45 -10
- package/dist/components/pr-pipeline.d.ts.map +1 -1
- package/dist/components/pr-pipeline.js +47 -14
- package/dist/components/pr-policy.d.ts +36 -0
- package/dist/components/pr-policy.d.ts.map +1 -1
- package/dist/components/pr-policy.js +36 -0
- package/dist/components/starter-plugin.d.ts +1 -0
- package/dist/components/starter-plugin.d.ts.map +1 -1
- package/dist/components/starter-plugin.js +5 -1
- package/dist/components/verbs/index.d.ts +2 -0
- package/dist/components/verbs/index.d.ts.map +1 -1
- package/dist/components/verbs/index.js +2 -0
- package/dist/components/verbs/publish-artifact.d.ts +65 -0
- package/dist/components/verbs/publish-artifact.d.ts.map +1 -0
- package/dist/components/verbs/publish-artifact.js +74 -0
- package/dist/components/verbs/publish-image.d.ts +129 -0
- package/dist/components/verbs/publish-image.d.ts.map +1 -0
- package/dist/components/verbs/publish-image.js +145 -0
- package/dist/config-environments.d.ts +20 -0
- package/dist/config-environments.d.ts.map +1 -1
- package/dist/config-environments.js +12 -0
- package/dist/config.d.ts +9 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +6 -2
- package/dist/gate-decision.d.ts +11 -2
- package/dist/gate-decision.d.ts.map +1 -1
- package/dist/gate-decision.js +15 -3
- package/dist/graph-ir.d.ts +25 -0
- package/dist/graph-ir.d.ts.map +1 -1
- package/dist/graph-walk.d.ts +66 -0
- package/dist/graph-walk.d.ts.map +1 -0
- package/dist/graph-walk.js +70 -0
- package/dist/import/parser.d.ts +19 -0
- package/dist/import/parser.d.ts.map +1 -1
- package/dist/lexicon.d.ts +71 -6
- package/dist/lexicon.d.ts.map +1 -1
- package/dist/lifecycle/gate-ledger.d.ts +11 -0
- package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
- package/dist/lifecycle/git.d.ts +2 -5
- package/dist/lifecycle/git.d.ts.map +1 -1
- package/dist/lifecycle/ledger-read.d.ts +65 -0
- package/dist/lifecycle/ledger-read.d.ts.map +1 -0
- package/dist/lifecycle/ledger-read.js +160 -0
- package/dist/lifecycle/release-workstation.d.ts +7 -0
- package/dist/lifecycle/release-workstation.d.ts.map +1 -1
- package/dist/lifecycle/release-workstation.js +25 -0
- package/dist/lifecycle/run-ledger.d.ts +4 -3
- package/dist/lifecycle/run-ledger.d.ts.map +1 -1
- package/dist/lifecycle/run-ledger.js +1 -0
- package/dist/lint/discover.js +3 -1
- package/dist/lint/post-synth.d.ts +127 -1
- package/dist/lint/post-synth.d.ts.map +1 -1
- package/dist/lint/post-synth.js +84 -2
- package/dist/lint/rules/op/index.d.ts +1 -0
- package/dist/lint/rules/op/index.d.ts.map +1 -1
- package/dist/lint/rules/op/index.js +2 -0
- package/dist/lint/rules/op/ops019-workspace-op-target.d.ts +32 -0
- package/dist/lint/rules/op/ops019-workspace-op-target.d.ts.map +1 -0
- package/dist/lint/rules/op/ops019-workspace-op-target.js +63 -0
- package/dist/op/activities/activity-contracts.d.ts +5 -2
- package/dist/op/activities/activity-contracts.d.ts.map +1 -1
- package/dist/op/activities/activity-contracts.js +5 -2
- package/dist/op/activities/index.d.ts +2 -2
- package/dist/op/activities/index.d.ts.map +1 -1
- package/dist/op/activities/index.js +1 -1
- package/dist/op/activities/review-agent.d.ts +90 -4
- package/dist/op/activities/review-agent.d.ts.map +1 -1
- package/dist/op/activities/review-agent.js +217 -19
- package/dist/op/activities/work-evidence.d.ts +8 -1
- package/dist/op/activities/work-evidence.d.ts.map +1 -1
- package/dist/op/activities/work-evidence.js +1 -0
- package/dist/op/builders.d.ts +9 -5
- package/dist/op/builders.d.ts.map +1 -1
- package/dist/op/builders.js +9 -5
- package/dist/op/composites/apply-op.d.ts +29 -2
- package/dist/op/composites/apply-op.d.ts.map +1 -1
- package/dist/op/composites/apply-op.js +20 -1
- package/dist/op/gate-approval.d.ts +11 -5
- package/dist/op/gate-approval.d.ts.map +1 -1
- package/dist/op/gate-approval.js +11 -6
- package/dist/op/gate-quorum.d.ts +100 -3
- package/dist/op/gate-quorum.d.ts.map +1 -1
- package/dist/op/gate-quorum.js +108 -6
- package/dist/op/gate-review.d.ts +9 -0
- package/dist/op/gate-review.d.ts.map +1 -1
- package/dist/op/gate-review.js +13 -0
- package/dist/op/gate.d.ts +44 -3
- package/dist/op/gate.d.ts.map +1 -1
- package/dist/op/gate.js +25 -4
- package/dist/op/index.d.ts +3 -3
- package/dist/op/index.d.ts.map +1 -1
- package/dist/op/index.js +1 -1
- package/dist/op/local-executor.d.ts +38 -3
- package/dist/op/local-executor.d.ts.map +1 -1
- package/dist/op/local-executor.js +48 -6
- package/dist/op/op-waves-run.d.ts +26 -1
- package/dist/op/op-waves-run.d.ts.map +1 -1
- package/dist/op/op-waves-run.js +259 -13
- package/dist/op/op-waves.d.ts +72 -5
- package/dist/op/op-waves.d.ts.map +1 -1
- package/dist/op/op-waves.js +110 -15
- package/dist/op/runtime.d.ts +11 -0
- package/dist/op/runtime.d.ts.map +1 -1
- package/dist/op/schedule-overdue.d.ts +16 -0
- package/dist/op/schedule-overdue.d.ts.map +1 -1
- package/dist/op/schedule-overdue.js +36 -0
- package/dist/op/stage-hooks.d.ts +9 -2
- package/dist/op/stage-hooks.d.ts.map +1 -1
- package/dist/op/stage-hooks.js +7 -5
- package/dist/op/workspace-run-env.d.ts +22 -0
- package/dist/op/workspace-run-env.d.ts.map +1 -0
- package/dist/op/workspace-run-env.js +21 -0
- package/dist/pr-forge.d.ts +24 -0
- package/dist/pr-forge.d.ts.map +1 -1
- package/dist/pr-forge.js +47 -0
- package/dist/pr-post.d.ts +42 -0
- package/dist/pr-post.d.ts.map +1 -1
- package/dist/pr-post.js +67 -1
- package/dist/read-filter.d.ts +65 -0
- package/dist/read-filter.d.ts.map +1 -0
- package/dist/read-filter.js +179 -0
- package/dist/run-event.d.ts +1 -1
- package/dist/run-event.d.ts.map +1 -1
- package/dist/terraform/carve.d.ts +24 -3
- package/dist/terraform/carve.d.ts.map +1 -1
- package/dist/terraform/carve.js +32 -14
- package/dist/terraform/cuts.d.ts +97 -0
- package/dist/terraform/cuts.d.ts.map +1 -0
- package/dist/terraform/cuts.js +138 -0
- package/dist/terraform/folds.d.ts +26 -0
- package/dist/terraform/folds.d.ts.map +1 -0
- package/dist/terraform/folds.js +38 -0
- package/dist/terraform/graph.d.ts.map +1 -1
- package/dist/terraform/graph.js +10 -0
- package/dist/terraform/reach.d.ts +140 -0
- package/dist/terraform/reach.d.ts.map +1 -0
- package/dist/terraform/reach.js +170 -0
- package/dist/terraform/score.d.ts +14 -0
- package/dist/terraform/score.d.ts.map +1 -1
- package/dist/terraform/score.js +14 -31
- package/dist/terraform/state.d.ts.map +1 -1
- package/dist/terraform/state.js +4 -2
- package/dist/terraform/types.d.ts +8 -0
- package/dist/terraform/types.d.ts.map +1 -1
- package/dist/wave-blocked.d.ts +10 -1
- package/dist/wave-blocked.d.ts.map +1 -1
- package/dist/wave-blocked.js +31 -3
- package/dist/wave-runtime.mjs +263 -254
- package/dist/workspace/check.schema.json +11 -2
- package/dist/workspace/checks/ci-branch.d.ts +44 -0
- package/dist/workspace/checks/ci-branch.d.ts.map +1 -0
- package/dist/workspace/checks/ci-branch.js +133 -0
- package/dist/workspace/checks/links.d.ts +3 -0
- package/dist/workspace/checks/links.d.ts.map +1 -1
- package/dist/workspace/checks/links.js +12 -1
- package/dist/workspace/checks/org.d.ts +48 -0
- package/dist/workspace/checks/org.d.ts.map +1 -0
- package/dist/workspace/checks/org.js +156 -0
- package/dist/workspace/checks.d.ts +11 -1
- package/dist/workspace/checks.d.ts.map +1 -1
- package/dist/workspace/checks.js +59 -7
- package/dist/workspace/ci-branches.d.ts +16 -0
- package/dist/workspace/ci-branches.d.ts.map +1 -1
- package/dist/workspace/ci-branches.js +27 -0
- package/dist/workspace/ci-green-cli.js +7 -7
- package/dist/workspace/ci-green-workflow.d.ts +1 -1
- package/dist/workspace/ci-green-workflow.d.ts.map +1 -1
- package/dist/workspace/ci-green-workflow.js +13 -8
- package/dist/workspace/ci-green.d.ts +14 -0
- package/dist/workspace/ci-green.d.ts.map +1 -1
- package/dist/workspace/ci-green.js +44 -11
- package/dist/workspace/ci-run.d.ts +9 -1
- package/dist/workspace/ci-run.d.ts.map +1 -1
- package/dist/workspace/ci-run.js +67 -6
- package/dist/workspace/ci-serve.d.ts +9 -0
- package/dist/workspace/ci-serve.d.ts.map +1 -1
- package/dist/workspace/ci-serve.js +114 -76
- package/dist/workspace/compose-graph.d.ts +14 -0
- package/dist/workspace/compose-graph.d.ts.map +1 -1
- package/dist/workspace/composites.d.ts +4 -1
- package/dist/workspace/composites.d.ts.map +1 -1
- package/dist/workspace/composites.js +5 -2
- package/dist/workspace/composites.schema.json +22 -0
- package/dist/workspace/conformance/__writer_fixture__/work/work.schema.json +105 -1
- package/dist/workspace/cross-root-lint.d.ts +56 -0
- package/dist/workspace/cross-root-lint.d.ts.map +1 -0
- package/dist/workspace/cross-root-lint.js +111 -0
- package/dist/workspace/dbt-models-reader.d.ts +44 -0
- package/dist/workspace/dbt-models-reader.d.ts.map +1 -0
- package/dist/workspace/dbt-models-reader.js +356 -0
- package/dist/workspace/dbt-project-common.d.ts +40 -0
- package/dist/workspace/dbt-project-common.d.ts.map +1 -0
- package/dist/workspace/dbt-project-common.js +106 -0
- package/dist/workspace/dbt-project-reader.d.ts +4 -3
- package/dist/workspace/dbt-project-reader.d.ts.map +1 -1
- package/dist/workspace/dbt-project-reader.js +14 -108
- package/dist/workspace/decision-rank.d.ts +26 -0
- package/dist/workspace/decision-rank.d.ts.map +1 -0
- package/dist/workspace/decision-rank.js +16 -0
- package/dist/workspace/declaration.d.ts +43 -2
- package/dist/workspace/declaration.d.ts.map +1 -1
- package/dist/workspace/declaration.js +45 -11
- package/dist/workspace/declaration.schema.json +133 -24
- package/dist/workspace/environments.d.ts +26 -2
- package/dist/workspace/environments.d.ts.map +1 -1
- package/dist/workspace/environments.js +26 -2
- package/dist/workspace/flyway-dir.d.ts +39 -0
- package/dist/workspace/flyway-dir.d.ts.map +1 -0
- package/dist/workspace/flyway-dir.js +104 -0
- package/dist/workspace/flyway-layout.d.ts +96 -0
- package/dist/workspace/flyway-layout.d.ts.map +1 -0
- package/dist/workspace/flyway-layout.js +308 -0
- package/dist/workspace/graph-cli.d.ts.map +1 -1
- package/dist/workspace/graph-cli.js +26 -8
- package/dist/workspace/graph.schema.json +34 -0
- package/dist/workspace/intent.d.ts +2 -3
- package/dist/workspace/intent.d.ts.map +1 -1
- package/dist/workspace/intent.js +5 -9
- package/dist/workspace/kind-link-readers.d.ts +59 -2
- package/dist/workspace/kind-link-readers.d.ts.map +1 -1
- package/dist/workspace/kind-link-readers.js +17 -1
- package/dist/workspace/kinds.d.ts +66 -2
- package/dist/workspace/kinds.d.ts.map +1 -1
- package/dist/workspace/kinds.js +98 -4
- package/dist/workspace/ledger.schema.json +158 -0
- package/dist/workspace/lexicon-outputs.d.ts +20 -1
- package/dist/workspace/lexicon-outputs.d.ts.map +1 -1
- package/dist/workspace/lexicon-outputs.js +102 -10
- package/dist/workspace/lineage-check.d.ts +3 -0
- package/dist/workspace/lineage-check.d.ts.map +1 -1
- package/dist/workspace/lineage-check.js +23 -4
- package/dist/workspace/links.d.ts +8 -1
- package/dist/workspace/links.d.ts.map +1 -1
- package/dist/workspace/links.js +25 -1
- package/dist/workspace/ls.d.ts +8 -0
- package/dist/workspace/ls.d.ts.map +1 -1
- package/dist/workspace/ls.js +7 -1
- package/dist/workspace/ls.schema.json +7 -0
- package/dist/workspace/member-commands.d.ts.map +1 -1
- package/dist/workspace/member-commands.js +54 -5
- package/dist/workspace/migrate-links.d.ts +45 -0
- package/dist/workspace/migrate-links.d.ts.map +1 -0
- package/dist/workspace/migrate-links.js +100 -0
- package/dist/workspace/migration-dirs.d.ts +74 -0
- package/dist/workspace/migration-dirs.d.ts.map +1 -0
- package/dist/workspace/migration-dirs.js +254 -0
- package/dist/workspace/reason-codes.d.ts +8 -0
- package/dist/workspace/reason-codes.d.ts.map +1 -1
- package/dist/workspace/reason-codes.js +11 -0
- package/dist/workspace/records-cli.d.ts +11 -0
- package/dist/workspace/records-cli.d.ts.map +1 -1
- package/dist/workspace/records-cli.js +57 -5
- package/dist/workspace/records.schema.json +5 -0
- package/dist/workspace/release-candidates.d.ts +2 -0
- package/dist/workspace/release-candidates.d.ts.map +1 -1
- package/dist/workspace/release-candidates.js +5 -2
- package/dist/workspace/release-train.d.ts +53 -0
- package/dist/workspace/release-train.d.ts.map +1 -0
- package/dist/workspace/release-train.js +134 -0
- package/dist/workspace/release-workflow.d.ts.map +1 -1
- package/dist/workspace/release-workflow.js +4 -3
- package/dist/workspace/repo-ref.d.ts +45 -0
- package/dist/workspace/repo-ref.d.ts.map +1 -0
- package/dist/workspace/repo-ref.js +114 -0
- package/dist/workspace/run-event.schema.json +2 -2
- package/dist/workspace/runs-cli.d.ts +9 -0
- package/dist/workspace/runs-cli.d.ts.map +1 -1
- package/dist/workspace/runs-cli.js +48 -3
- package/dist/workspace/runs.schema.json +7 -0
- package/dist/workspace/search-contract.d.ts +1 -1
- package/dist/workspace/search-contract.d.ts.map +1 -1
- package/dist/workspace/status-decisions.d.ts +37 -0
- package/dist/workspace/status-decisions.d.ts.map +1 -0
- package/dist/workspace/status-decisions.js +147 -0
- package/dist/workspace/status-gates.d.ts +9 -0
- package/dist/workspace/status-gates.d.ts.map +1 -1
- package/dist/workspace/status.d.ts +4 -0
- package/dist/workspace/status.d.ts.map +1 -1
- package/dist/workspace/status.js +14 -2
- package/dist/workspace/status.schema.json +6 -0
- package/dist/workspace/work-cli.d.ts.map +1 -1
- package/dist/workspace/work-cli.js +5 -3
- package/dist/workspace/work-evidence-ops.d.ts +83 -0
- package/dist/workspace/work-evidence-ops.d.ts.map +1 -0
- package/dist/workspace/work-evidence-ops.js +169 -0
- package/dist/workspace/work-evidence.d.ts +12 -2
- package/dist/workspace/work-evidence.d.ts.map +1 -1
- package/dist/workspace/work-evidence.js +21 -3
- package/dist/workspace/work-evidence.schema.json +49 -2
- package/dist/workspace/workspace-gates.d.ts +110 -0
- package/dist/workspace/workspace-gates.d.ts.map +1 -0
- package/dist/workspace/workspace-gates.js +140 -0
- package/dist/workspace/workspace-kinds.schema.json +58 -3
- package/dist/workspace/workspace-ledger.d.ts +76 -0
- package/dist/workspace/workspace-ledger.d.ts.map +1 -0
- package/dist/workspace/workspace-ledger.js +91 -0
- package/dist/workspace/workspace-run.d.ts +112 -0
- package/dist/workspace/workspace-run.d.ts.map +1 -0
- package/dist/workspace/workspace-run.js +432 -0
- package/package.json +1 -1
- package/src/__golden__/wave-loop/op-by-apply-after-fails.json +10 -0
- package/src/__golden__/wave-loop/op-by-apply-hold.json +10 -0
- package/src/__golden__/wave-loop/op-by-apply-ignored.json +10 -0
- package/src/__golden__/wave-loop/op-by-apply-pass.json +10 -0
- package/src/__golden__/wave-loop/op-by-apply-skip.json +10 -0
- package/src/__golden__/wave-loop/op-cost-member-clash.json +6 -0
- package/src/__golden__/wave-loop/op-cost-member.json +13 -0
- package/src/__golden__/wave-loop/op-denied-source.json +16 -0
- package/src/__golden__/wave-loop/op-denied.json +16 -0
- package/src/__golden__/wave-loop/op-discover-rest-short.json +6 -0
- package/src/__golden__/wave-loop/op-discover-rest-stops.json +13 -0
- package/src/__golden__/wave-loop/op-discover-rest.json +26 -0
- package/src/__golden__/wave-loop/op-discover-wide.json +26 -0
- package/src/__golden__/wave-loop/op-held-on-again.json +16 -0
- package/src/__golden__/wave-loop/op-held-on-before-apply.json +16 -0
- package/src/__golden__/wave-loop/op-held-on.json +16 -0
- package/src/__golden__/wave-loop/op-hooks-apply-fails.json +13 -0
- package/src/__golden__/wave-loop/op-hooks-fail-after-apply.json +13 -0
- package/src/__golden__/wave-loop/op-hooks-fail-before-apply.json +13 -0
- package/src/__golden__/wave-loop/op-hooks-fail-before-plan.json +13 -0
- package/src/__golden__/wave-loop/op-hooks-held.json +13 -0
- package/src/__golden__/wave-loop/op-hooks-hold-before-apply.json +13 -0
- package/src/__golden__/wave-loop/op-hooks-pass.json +13 -0
- package/src/__golden__/wave-loop/op-hooks-refused-at-base.json +13 -0
- package/src/__golden__/wave-loop/op-hooks-share.json +33 -0
- package/src/__golden__/wave-loop/op-outcome-held.json +10 -0
- package/src/__golden__/wave-loop/op-outcome-replan-approved.json +10 -0
- package/src/__golden__/wave-loop/op-outcome-replan-forever.json +10 -0
- package/src/__golden__/wave-loop/op-outcome-replan.json +10 -0
- package/src/__golden__/wave-loop/op-outcome-stood-down.json +10 -0
- package/src/__golden__/wave-loop/op-outcome-unreadable.json +10 -0
- package/src/__golden__/wave-loop/op-overridden.json +16 -0
- package/src/__golden__/wave-loop/op-per-run.json +20 -0
- package/src/__golden__/wave-loop/op-point.json +13 -0
- package/src/__golden__/wave-loop/op-pr-review.json +10 -0
- package/src/__golden__/wave-loop/op-sealed.json +10 -0
- package/src/__golden__/wave-loop/op-spend-change-only.json +10 -0
- package/src/__golden__/wave-loop/op-spend.json +10 -0
- package/src/__golden__/wave-loop/op-wave-commands.json +55 -0
- package/src/__golden__/wave-loop/op-wide-refused.json +26 -0
- package/src/__golden__/wave-loop/op-wide-waiting.json +29 -0
- package/src/__golden__/wave-loop/op-wide.json +39 -0
- package/src/action-pins.test.ts +78 -0
- package/src/action-pins.ts +92 -0
- package/src/cli/commands/carve-score-once.test.ts +99 -0
- package/src/cli/commands/carve.ts +37 -6
- package/src/cli/commands/check-lexicon.test.ts +2 -2
- package/src/cli/commands/import-report.ts +71 -0
- package/src/cli/commands/import.ts +33 -3
- package/src/cli/commands/migrate-dialect.test.ts +145 -0
- package/src/cli/commands/migrate.ts +132 -11
- package/src/cli/handlers/__snapshots__/build-member.test.ts.snap +4 -4
- package/src/cli/handlers/approve.ts +23 -2
- package/src/cli/handlers/build.ts +7 -1
- package/src/cli/handlers/ledger.ts +54 -0
- package/src/cli/handlers/migrate.ts +21 -12
- package/src/cli/handlers/misc.ts +10 -1
- package/src/cli/handlers/pr-env.ts +2 -2
- package/src/cli/handlers/pr.ts +138 -36
- package/src/cli/handlers/query.ts +16 -4
- package/src/cli/handlers/release.ts +6 -3
- package/src/cli/handlers/search.ts +13 -34
- package/src/cli/main.test.ts +15 -0
- package/src/cli/main.ts +65 -14
- package/src/cli/parse-args.ts +27 -2
- package/src/cli/registry.ts +14 -4
- package/src/components/builders.ts +8 -0
- package/src/components/capability-plugin-loader.ts +13 -1
- package/src/components/capability-plugin.ts +16 -0
- package/src/components/pr-hooks.test.ts +73 -5
- package/src/components/pr-hooks.ts +95 -5
- package/src/components/pr-pipeline.ts +64 -16
- package/src/components/pr-policy.test.ts +64 -1
- package/src/components/pr-policy.ts +53 -0
- package/src/components/registry.test.ts +1 -1
- package/src/components/starter-plugin.ts +6 -0
- package/src/components/verbs/index.ts +2 -0
- package/src/components/verbs/publish-artifact.test.ts +60 -0
- package/src/components/verbs/publish-artifact.ts +122 -0
- package/src/components/verbs/publish-image.test.ts +101 -0
- package/src/components/verbs/publish-image.ts +265 -0
- package/src/config-environments.ts +28 -1
- package/src/config.ts +8 -1
- package/src/gate-decision-bundle.test.ts +1 -0
- package/src/gate-decision-identity.test.ts +9 -0
- package/src/gate-decision.ts +26 -3
- package/src/graph-ir.ts +27 -0
- package/src/graph-walk.test.ts +44 -0
- package/src/graph-walk.ts +102 -0
- package/src/import/parser.ts +20 -0
- package/src/lexicon.ts +74 -6
- package/src/lifecycle/gate-ledger.ts +8 -0
- package/src/lifecycle/git.ts +2 -2
- package/src/lifecycle/ledger-read.test.ts +107 -0
- package/src/lifecycle/ledger-read.ts +195 -0
- package/src/lifecycle/release-workstation.ts +24 -0
- package/src/lifecycle/run-ledger.ts +5 -2
- package/src/lint/cross-root.test.ts +122 -0
- package/src/lint/discover.ts +3 -1
- package/src/lint/post-synth.ts +212 -2
- package/src/lint/rules/op/index.ts +2 -0
- package/src/lint/rules/op/ops019-workspace-op-target.ts +89 -0
- package/src/op/activities/activity-contracts.ts +5 -2
- package/src/op/activities/index.ts +2 -2
- package/src/op/activities/review-agent.test.ts +221 -4
- package/src/op/activities/review-agent.ts +265 -22
- package/src/op/activities/work-evidence.ts +9 -1
- package/src/op/builders.ts +9 -5
- package/src/op/composites/apply-op.test.ts +108 -0
- package/src/op/composites/apply-op.ts +37 -2
- package/src/op/gate-approval.test.ts +6 -1
- package/src/op/gate-approval.ts +12 -6
- package/src/op/gate-quorum-at-base.test.ts +211 -0
- package/src/op/gate-quorum.ts +156 -8
- package/src/op/gate-review.ts +14 -0
- package/src/op/gate.ts +67 -8
- package/src/op/index.ts +3 -2
- package/src/op/local-executor.ts +69 -9
- package/src/op/op-waves-depends-on.test.ts +81 -0
- package/src/op/op-waves-hook-targets.test.ts +4 -2
- package/src/op/op-waves-quorum-product.test.ts +158 -0
- package/src/op/op-waves-run.ts +288 -14
- package/src/op/op-waves.ts +143 -14
- package/src/op/runtime.ts +8 -0
- package/src/op/schedule-overdue.ts +33 -0
- package/src/op/stage-hooks.ts +13 -5
- package/src/op/workspace-run-env.ts +29 -0
- package/src/pr-forge-bundle.test.ts +2 -2
- package/src/pr-forge.test.ts +47 -0
- package/src/pr-forge.ts +68 -0
- package/src/pr-post-open.e2e.test.ts +36 -0
- package/src/pr-post.test.ts +102 -3
- package/src/pr-post.ts +89 -1
- package/src/read-filter.test.ts +54 -0
- package/src/read-filter.ts +193 -0
- package/src/run-event.ts +1 -1
- package/src/stage-hooks-bundle.test.ts +1 -0
- package/src/terraform/carve.ts +52 -15
- package/src/terraform/cuts.test.ts +173 -0
- package/src/terraform/cuts.ts +188 -0
- package/src/terraform/folds.ts +44 -0
- package/src/terraform/graph.ts +9 -0
- package/src/terraform/radius.test.ts +90 -0
- package/src/terraform/reach.test.ts +146 -0
- package/src/terraform/reach.ts +247 -0
- package/src/terraform/score.ts +27 -29
- package/src/terraform/state.ts +3 -1
- package/src/terraform/types.ts +8 -0
- package/src/wave-blocked.ts +28 -3
- package/src/wave-loop-golden.test.ts +4 -3
- package/src/workspace/behold-kinds.test.ts +1 -1
- package/src/workspace/check-contract.test.ts +7 -6
- package/src/workspace/check.schema.json +11 -2
- package/src/workspace/checks/ci-branch.test.ts +128 -0
- package/src/workspace/checks/ci-branch.ts +141 -0
- package/src/workspace/checks/links.ts +12 -1
- package/src/workspace/checks/org.ts +169 -0
- package/src/workspace/checks.ts +64 -7
- package/src/workspace/ci-branches.ts +31 -0
- package/src/workspace/ci-green-branches.test.ts +153 -0
- package/src/workspace/ci-green-cli.ts +7 -7
- package/src/workspace/ci-green-workflow.test.ts +4 -3
- package/src/workspace/ci-green-workflow.ts +13 -9
- package/src/workspace/ci-green.ts +49 -12
- package/src/workspace/ci-run.test.ts +72 -1
- package/src/workspace/ci-run.ts +68 -8
- package/src/workspace/ci-serve.test.ts +95 -0
- package/src/workspace/ci-serve.ts +106 -65
- package/src/workspace/component-environments.test.ts +25 -2
- package/src/workspace/compose-graph.ts +9 -2
- package/src/workspace/composites.schema.json +22 -0
- package/src/workspace/composites.test.ts +39 -8
- package/src/workspace/composites.ts +6 -2
- package/src/workspace/conformance/__writer_fixture__/work/work.schema.json +105 -1
- package/src/workspace/cross-root-lint.test.ts +90 -0
- package/src/workspace/cross-root-lint.ts +126 -0
- package/src/workspace/dbt-kind.test.ts +3 -2
- package/src/workspace/dbt-models-reader.ts +362 -0
- package/src/workspace/dbt-models.test.ts +248 -0
- package/src/workspace/dbt-project-common.ts +113 -0
- package/src/workspace/dbt-project-reader.ts +29 -112
- package/src/workspace/decision-rank.ts +40 -0
- package/src/workspace/declaration.schema.json +133 -24
- package/src/workspace/declaration.ts +84 -15
- package/src/workspace/environments.ts +40 -4
- package/src/workspace/flyway-dir.ts +113 -0
- package/src/workspace/flyway-layout.ts +337 -0
- package/src/workspace/graph-cli.ts +25 -10
- package/src/workspace/graph-contract.test.ts +4 -2
- package/src/workspace/graph.schema.json +34 -0
- package/src/workspace/identity.test.ts +14 -2
- package/src/workspace/intent.ts +6 -14
- package/src/workspace/kind-link-readers.ts +68 -3
- package/src/workspace/kinds.test.ts +12 -7
- package/src/workspace/kinds.ts +132 -7
- package/src/workspace/ledger.schema.json +158 -0
- package/src/workspace/lexicon-outputs.ts +132 -13
- package/src/workspace/lineage-check.ts +30 -7
- package/src/workspace/links.ts +24 -1
- package/src/workspace/ls-contract.test.ts +1 -1
- package/src/workspace/ls.schema.json +7 -0
- package/src/workspace/ls.ts +10 -1
- package/src/workspace/member-commands.ts +60 -2
- package/src/workspace/member-file-schema.test.ts +124 -0
- package/src/workspace/migrate-links.test.ts +99 -0
- package/src/workspace/migrate-links.ts +108 -0
- package/src/workspace/migration-dirs.test.ts +272 -0
- package/src/workspace/migration-dirs.ts +267 -0
- package/src/workspace/org-scope.test.ts +238 -0
- package/src/workspace/reason-codes.test.ts +6 -1
- package/src/workspace/reason-codes.ts +11 -0
- package/src/workspace/records-cli.ts +58 -5
- package/src/workspace/records.schema.json +5 -0
- package/src/workspace/release-candidates.ts +7 -2
- package/src/workspace/release-train.ts +157 -0
- package/src/workspace/release-workflow.ts +4 -3
- package/src/workspace/repo-ref.ts +113 -0
- package/src/workspace/run-event.schema.json +2 -2
- package/src/workspace/runs-cli.ts +48 -4
- package/src/workspace/runs.schema.json +7 -0
- package/src/workspace/status-contract.test.ts +46 -1
- package/src/workspace/status-decisions.test.ts +100 -0
- package/src/workspace/status-decisions.ts +151 -0
- package/src/workspace/status-gates.ts +9 -0
- package/src/workspace/status.schema.json +6 -0
- package/src/workspace/status.ts +17 -3
- package/src/workspace/where-filters.test.ts +39 -0
- package/src/workspace/work-cli.ts +5 -3
- package/src/workspace/work-evidence-ops.test.ts +176 -0
- package/src/workspace/work-evidence-ops.ts +189 -0
- package/src/workspace/work-evidence.schema.json +49 -2
- package/src/workspace/work-evidence.ts +22 -3
- package/src/workspace/workspace-gates.ts +200 -0
- package/src/workspace/workspace-kinds.schema.json +58 -3
- package/src/workspace/workspace-ledger.ts +130 -0
- package/src/workspace/workspace-run.test.ts +322 -0
- package/src/workspace/workspace-run.ts +461 -0
|
@@ -0,0 +1,432 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `chant workspace run` (#2554, #2524 D17, ws-030): Ops that span members.
|
|
3
|
+
*
|
|
4
|
+
* A workspace run names `<member>/<op>` targets, or asks for the dependents
|
|
5
|
+
* of one member with `--dependents-of <member> --op <op>`. It:
|
|
6
|
+
*
|
|
7
|
+
* 1. reads every member's graph under the member's own toolchain, as
|
|
8
|
+
* `chant workspace graph` does (`readMembers` in `./graph-cli.ts`), and
|
|
9
|
+
* turns each composed member into a build root for the cross-root mode of
|
|
10
|
+
* post-synth checks (#1939): its graph nodes, Ops among them, become the
|
|
11
|
+
* root's entities;
|
|
12
|
+
* 2. runs OPS019 over those roots, so every target names a composed member
|
|
13
|
+
* and an Op it declares, and runs nothing when one doesn't;
|
|
14
|
+
* 3. orders the targets so a producer runs before the members that link to
|
|
15
|
+
* it (the declared and inferred member links of the composed graph), and
|
|
16
|
+
* otherwise keeps the order given;
|
|
17
|
+
* 4. runs each target's `chant run <op>` in the member's directory under the
|
|
18
|
+
* member's toolchain, one at a time, stopping at the first that does not
|
|
19
|
+
* pass. Each member run gets the workspace run's id in its environment
|
|
20
|
+
* (`CHANT_WORKSPACE_RUN`), and its run record cites it;
|
|
21
|
+
* 5. writes the workspace run's record under `_members/_workspace/<env>/`.
|
|
22
|
+
*
|
|
23
|
+
* With `--gate <name>`, member runs that stop at their own gates are
|
|
24
|
+
* gathered into one pending fact of the workspace gate `<name>`; see
|
|
25
|
+
* `./workspace-gates.ts` for when its approval stands in for theirs.
|
|
26
|
+
*
|
|
27
|
+
* `chant run` at a declared root is untouched: it runs the root's own Ops,
|
|
28
|
+
* and Op discovery leaves member directories out (#2527).
|
|
29
|
+
*/
|
|
30
|
+
import { randomUUID } from "node:crypto";
|
|
31
|
+
import { resolve } from "node:path";
|
|
32
|
+
import { formatError } from "../cli/format.js";
|
|
33
|
+
import { runCrossRootChecks } from "../lint/post-synth.js";
|
|
34
|
+
import { formatWorkspaceOpTarget, ops019Check, parseWorkspaceOpTarget } from "../lint/rules/op/ops019-workspace-op-target.js";
|
|
35
|
+
import { readBlobFromPath } from "../lifecycle/git.js";
|
|
36
|
+
import { GATES_DIR, latestPendingGate, parseGateLedger } from "../lifecycle/gate-ledger.js";
|
|
37
|
+
import { readRunLedger, DEFAULT_RUN_ENV } from "../lifecycle/run-ledger.js";
|
|
38
|
+
import { WORKSPACE_GATE_ENV, WORKSPACE_RUN_ENV } from "../op/workspace-run-env.js";
|
|
39
|
+
import { readDeclaration, WorkspaceReadError } from "./declaration.js";
|
|
40
|
+
import { loadKindRegistry } from "./kinds.js";
|
|
41
|
+
import { executePlan, planMembers } from "./member-commands.js";
|
|
42
|
+
import { locateWorkspace } from "./which-chant.js";
|
|
43
|
+
import { appendWorkspaceRun } from "./workspace-ledger.js";
|
|
44
|
+
import { appendWorkspaceGatePending } from "./workspace-gates.js";
|
|
45
|
+
/** `chant run`'s exit code for a run that stopped at an unapproved gate (`GATED_EXIT_CODE`). */
|
|
46
|
+
const GATED_EXIT = 3;
|
|
47
|
+
const USAGE = "chant workspace run <member>/<op>... [--env <env>] [--gate <name>] [--dry-run] [--json] | chant workspace run --dependents-of <member> --op <op> [--env <env>] [--gate <name>] [--dry-run] [--json] | chant workspace run approve <gate> [--plan <digest>] [--approver <principal>]";
|
|
48
|
+
// ── Roots from the composed graph ────────────────────────────────────────────
|
|
49
|
+
/**
|
|
50
|
+
* One build root per composed member (#1939's `CrossRootInput`): the member's
|
|
51
|
+
* graph nodes become its entities, keyed by the member's own ids, with their
|
|
52
|
+
* attributes as `props`. The member was read under its own toolchain, so
|
|
53
|
+
* this process builds nothing. Members that were skipped or failed have no root.
|
|
54
|
+
*/
|
|
55
|
+
export function crossRootInputs(graph, env) {
|
|
56
|
+
const byMember = new Map();
|
|
57
|
+
for (const n of graph.nodes) {
|
|
58
|
+
if (n.nested !== undefined)
|
|
59
|
+
continue;
|
|
60
|
+
const list = byMember.get(n.member) ?? [];
|
|
61
|
+
list.push(n);
|
|
62
|
+
byMember.set(n.member, list);
|
|
63
|
+
}
|
|
64
|
+
return graph.members
|
|
65
|
+
.filter((m) => m.status === "composed" && m.kind !== "workspace")
|
|
66
|
+
.map((m) => {
|
|
67
|
+
const entities = new Map();
|
|
68
|
+
for (const n of byMember.get(m.name) ?? []) {
|
|
69
|
+
const id = n.id.startsWith(`${m.name}/`) ? n.id.slice(m.name.length + 1) : n.id;
|
|
70
|
+
entities.set(id, { lexicon: n.lexicon, entityType: n.kind, props: n.attrs });
|
|
71
|
+
}
|
|
72
|
+
return {
|
|
73
|
+
root: m.name,
|
|
74
|
+
dir: m.dir,
|
|
75
|
+
...(env ? { env } : {}),
|
|
76
|
+
buildResult: { outputs: new Map(), entities, warnings: [], errors: [], sourceFileCount: 0 },
|
|
77
|
+
};
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
// ── Order ────────────────────────────────────────────────────────────────────
|
|
81
|
+
/** Producer to consumers, from the composed graph's member links (declared and inferred, any status but invalid). */
|
|
82
|
+
export function memberDependents(links) {
|
|
83
|
+
const out = new Map();
|
|
84
|
+
for (const row of links) {
|
|
85
|
+
const r = row;
|
|
86
|
+
if (typeof r.producer !== "string" || typeof r.consumer !== "string")
|
|
87
|
+
continue;
|
|
88
|
+
if (r.status === "invalid" || r.producer === r.consumer)
|
|
89
|
+
continue;
|
|
90
|
+
const set = out.get(r.producer) ?? new Set();
|
|
91
|
+
set.add(r.consumer);
|
|
92
|
+
out.set(r.producer, set);
|
|
93
|
+
}
|
|
94
|
+
return out;
|
|
95
|
+
}
|
|
96
|
+
/** Every member that links to `member`, directly or through others, nearest first. */
|
|
97
|
+
export function dependentsOf(member, links) {
|
|
98
|
+
const edges = memberDependents(links);
|
|
99
|
+
const seen = new Set([member]);
|
|
100
|
+
const order = [];
|
|
101
|
+
let frontier = [member];
|
|
102
|
+
while (frontier.length > 0) {
|
|
103
|
+
const next = [];
|
|
104
|
+
for (const m of frontier) {
|
|
105
|
+
for (const c of [...(edges.get(m) ?? [])].sort()) {
|
|
106
|
+
if (seen.has(c))
|
|
107
|
+
continue;
|
|
108
|
+
seen.add(c);
|
|
109
|
+
order.push(c);
|
|
110
|
+
next.push(c);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
frontier = next;
|
|
114
|
+
}
|
|
115
|
+
return order;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Order targets so a producer's targets run before its consumers', keeping
|
|
119
|
+
* the given order otherwise. A cycle among the targets' members keeps the
|
|
120
|
+
* given order for the members in it.
|
|
121
|
+
*/
|
|
122
|
+
export function orderTargets(targets, links) {
|
|
123
|
+
const edges = memberDependents(links);
|
|
124
|
+
const members = [...new Set(targets.map((t) => t.member))];
|
|
125
|
+
const reach = (from, to) => {
|
|
126
|
+
const seen = new Set();
|
|
127
|
+
const stack = [from];
|
|
128
|
+
while (stack.length > 0) {
|
|
129
|
+
const m = stack.pop();
|
|
130
|
+
for (const c of edges.get(m) ?? []) {
|
|
131
|
+
if (c === to)
|
|
132
|
+
return true;
|
|
133
|
+
if (!seen.has(c)) {
|
|
134
|
+
seen.add(c);
|
|
135
|
+
stack.push(c);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return false;
|
|
140
|
+
};
|
|
141
|
+
// Kahn's algorithm over the targets' members, choosing the earliest given member each time.
|
|
142
|
+
const before = new Map(members.map((m) => [m, members.filter((o) => o !== m && reach(o, m) && !reach(m, o))]));
|
|
143
|
+
const placed = [];
|
|
144
|
+
const left = [...members];
|
|
145
|
+
while (left.length > 0) {
|
|
146
|
+
const i = left.findIndex((m) => before.get(m).every((o) => placed.includes(o)));
|
|
147
|
+
const pick = left.splice(i < 0 ? 0 : i, 1)[0];
|
|
148
|
+
placed.push(pick);
|
|
149
|
+
}
|
|
150
|
+
return placed.flatMap((m) => targets.filter((t) => t.member === m));
|
|
151
|
+
}
|
|
152
|
+
async function defaultReadGraph(cwd) {
|
|
153
|
+
const { workspaceGraph } = await import("./graph-cli.js");
|
|
154
|
+
const { doc, failed } = await workspaceGraph({ cwd, onStderr: (t) => process.stderr.write(t) });
|
|
155
|
+
if ("error" in doc)
|
|
156
|
+
return { error: `${doc.error.code}: ${doc.error.message}` };
|
|
157
|
+
return { graph: doc, failed };
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Run one member's `chant run`, under the member's own toolchain (the one
|
|
161
|
+
* `chant workspace graph` reads it with), from inside its directory.
|
|
162
|
+
*/
|
|
163
|
+
async function defaultRunMember(cwd, member, argv, env) {
|
|
164
|
+
const located = locateWorkspace(cwd);
|
|
165
|
+
const declaration = readDeclaration(located.tree, "", { rootChant: true });
|
|
166
|
+
const { registry: kinds } = loadKindRegistry(declaration.pins, located.rootOnDisk);
|
|
167
|
+
const plan = planMembers("graph", located.rootOnDisk, { only: [member.name], tree: located.tree, kinds });
|
|
168
|
+
if (plan.groups.length === 0)
|
|
169
|
+
return { exitCode: 1, stdout: "", stderr: `member ${member.name} has no chant to run it\n` };
|
|
170
|
+
const saved = Object.fromEntries(Object.keys(env).map((k) => [k, process.env[k]]));
|
|
171
|
+
Object.assign(process.env, env);
|
|
172
|
+
try {
|
|
173
|
+
const [r] = await executePlan(plan, {}, () => argv);
|
|
174
|
+
return r ? { exitCode: r.exitCode, stdout: r.stdout, stderr: r.stderr } : { exitCode: 1, stdout: "", stderr: `member ${member.name} did not run\n` };
|
|
175
|
+
}
|
|
176
|
+
finally {
|
|
177
|
+
for (const [k, v] of Object.entries(saved)) {
|
|
178
|
+
if (v === undefined)
|
|
179
|
+
delete process.env[k];
|
|
180
|
+
else
|
|
181
|
+
process.env[k] = v;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
/** The environment directory a member Op run records under: its `labels.Env`, else `local` (`runEnvOf`). */
|
|
186
|
+
function opEnv(graph, t) {
|
|
187
|
+
for (const n of graph.nodes) {
|
|
188
|
+
if (n.member !== t.member || n.kind !== "Chant::Op")
|
|
189
|
+
continue;
|
|
190
|
+
const attrs = n.attrs;
|
|
191
|
+
if (attrs.name === t.op)
|
|
192
|
+
return typeof attrs.labels?.Env === "string" ? attrs.labels.Env : DEFAULT_RUN_ENV;
|
|
193
|
+
}
|
|
194
|
+
return DEFAULT_RUN_ENV;
|
|
195
|
+
}
|
|
196
|
+
/** The member run that cites workspace run `id`, and the gate it stopped at, read from the member's ledgers. */
|
|
197
|
+
async function memberRunOf(cwd, member, op, env, id) {
|
|
198
|
+
const { records } = await readRunLedger(env, op, { cwd, member });
|
|
199
|
+
const record = records.filter((r) => r.workspaceRun?.id === id).at(-1);
|
|
200
|
+
if (!record)
|
|
201
|
+
return { run: null };
|
|
202
|
+
if (record.status !== "gated" || !record.gate)
|
|
203
|
+
return { run: record.id };
|
|
204
|
+
const gateOp = record.gate.op ?? op;
|
|
205
|
+
const content = await readBlobFromPath(GATES_DIR, `${gateOp}.jsonl`, { cwd, member });
|
|
206
|
+
const pending = content ? parseGateLedger(content).pending.filter((p) => p.runId === record.id) : [];
|
|
207
|
+
const fact = latestPendingGate(pending, record.gate.name);
|
|
208
|
+
return {
|
|
209
|
+
run: record.id,
|
|
210
|
+
gate: { op: gateOp, name: record.gate.name, planDigest: fact?.planDigest ?? null, environment: fact?.environment ?? null },
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
/** Plan and, unless `dryRun`, run a workspace run. Throws a {@link WorkspaceReadError} when the declaration can't be read. */
|
|
214
|
+
export async function workspaceRun(query) {
|
|
215
|
+
const now = query.now ?? (() => new Date().toISOString());
|
|
216
|
+
const id = `ws-${randomUUID()}`;
|
|
217
|
+
// Targets, before anything is read.
|
|
218
|
+
let targets = [];
|
|
219
|
+
for (const text of query.targets) {
|
|
220
|
+
const t = parseWorkspaceOpTarget(text);
|
|
221
|
+
if (!t)
|
|
222
|
+
return { kind: "refused", message: `"${text}" is not a <member>/<op> target`, findings: [] };
|
|
223
|
+
targets.push(t);
|
|
224
|
+
}
|
|
225
|
+
if (query.dependentsOf !== undefined && !query.op)
|
|
226
|
+
return { kind: "refused", message: "--dependents-of needs the Op to run: --op <op>", findings: [] };
|
|
227
|
+
if (query.dependentsOf === undefined && targets.length === 0)
|
|
228
|
+
return { kind: "refused", message: "name at least one <member>/<op> target, or --dependents-of <member> --op <op>", findings: [] };
|
|
229
|
+
const read = await (query.readGraph ?? defaultReadGraph)(query.cwd);
|
|
230
|
+
if ("error" in read)
|
|
231
|
+
return { kind: "refused", message: `the workspace graph could not be read: ${read.error}`, findings: [] };
|
|
232
|
+
const { graph } = read;
|
|
233
|
+
const roots = crossRootInputs(graph, query.env);
|
|
234
|
+
const skipped = [];
|
|
235
|
+
if (query.dependentsOf !== undefined) {
|
|
236
|
+
const op = query.op;
|
|
237
|
+
if (!graph.members.some((m) => m.name === query.dependentsOf)) {
|
|
238
|
+
return { kind: "refused", message: `--dependents-of ${query.dependentsOf}: the workspace declares no such member`, findings: [] };
|
|
239
|
+
}
|
|
240
|
+
for (const member of dependentsOf(query.dependentsOf, graph.links)) {
|
|
241
|
+
const root = roots.find((r) => r.root === member);
|
|
242
|
+
const hasOp = root && [...root.buildResult.entities.values()].some((e) => e.entityType === "Chant::Op" && e.props?.name === op);
|
|
243
|
+
if (hasOp)
|
|
244
|
+
targets.push({ member, op });
|
|
245
|
+
else
|
|
246
|
+
skipped.push({ member, reason: root ? `declares no Op named "${op}"` : "is not a composed chant member" });
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
// OPS019 over the composed roots: the targets must exist before anything runs.
|
|
250
|
+
const findings = runCrossRootChecks([ops019Check(targets)], roots, query.env ? { env: query.env } : undefined);
|
|
251
|
+
if (findings.some((f) => f.severity === "error")) {
|
|
252
|
+
return { kind: "refused", message: "a target does not name an Op of a composed member", findings };
|
|
253
|
+
}
|
|
254
|
+
targets = orderTargets(targets, graph.links);
|
|
255
|
+
if (query.dryRun)
|
|
256
|
+
return { kind: "planned", id, targets: targets.map(formatWorkspaceOpTarget), skipped };
|
|
257
|
+
const started = now();
|
|
258
|
+
const steps = targets.map((t) => ({ target: formatWorkspaceOpTarget(t), member: t.member, op: t.op, status: "not-run", exitCode: null, memberRun: null }));
|
|
259
|
+
const env = { [WORKSPACE_RUN_ENV]: id, ...(query.gate ? { [WORKSPACE_GATE_ENV]: query.gate } : {}) };
|
|
260
|
+
const runMember = query.runMember ?? ((m, argv, e) => defaultRunMember(query.cwd, m, argv, e));
|
|
261
|
+
let status = "ok";
|
|
262
|
+
for (let i = 0; i < targets.length; i++) {
|
|
263
|
+
const t = targets[i];
|
|
264
|
+
const step = steps[i];
|
|
265
|
+
const member = graph.members.find((m) => m.name === t.member);
|
|
266
|
+
const argv = ["run", t.op, ...(query.env ? ["--env", query.env] : []), ...(query.runArgs ?? [])];
|
|
267
|
+
const result = await runMember({ name: member.name, dir: member.dir }, argv, env);
|
|
268
|
+
query.onOutput?.(step.target, result);
|
|
269
|
+
step.exitCode = result.exitCode;
|
|
270
|
+
step.status = result.exitCode === 0 ? "ok" : result.exitCode === GATED_EXIT ? "gated" : "fail";
|
|
271
|
+
try {
|
|
272
|
+
const found = await memberRunOf(query.cwd, t.member, t.op, opEnv(graph, t), id);
|
|
273
|
+
step.memberRun = found.run;
|
|
274
|
+
if (found.gate)
|
|
275
|
+
step.gate = found.gate;
|
|
276
|
+
}
|
|
277
|
+
catch {
|
|
278
|
+
// A member whose ledger can't be read still ran; the step keeps no member run id.
|
|
279
|
+
}
|
|
280
|
+
if (step.status === "fail") {
|
|
281
|
+
status = "fail";
|
|
282
|
+
break;
|
|
283
|
+
}
|
|
284
|
+
if (step.status === "gated") {
|
|
285
|
+
status = "gated";
|
|
286
|
+
// With a workspace gate, the other targets still run to their gates, so one approval covers them all.
|
|
287
|
+
if (!query.gate)
|
|
288
|
+
break;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
const record = {
|
|
292
|
+
version: 1,
|
|
293
|
+
id,
|
|
294
|
+
started,
|
|
295
|
+
ended: now(),
|
|
296
|
+
status,
|
|
297
|
+
env: query.env ?? null,
|
|
298
|
+
gate: query.gate ?? null,
|
|
299
|
+
dependentsOf: query.dependentsOf ?? null,
|
|
300
|
+
steps,
|
|
301
|
+
};
|
|
302
|
+
let pending = null;
|
|
303
|
+
let ledgerError = null;
|
|
304
|
+
try {
|
|
305
|
+
const covers = steps
|
|
306
|
+
.filter((s) => s.status === "gated" && s.gate?.planDigest)
|
|
307
|
+
.map((s) => ({ member: s.member, op: s.gate.op, gate: s.gate.name, planDigest: s.gate.planDigest, ...(s.gate.environment ? { environment: s.gate.environment } : {}) }));
|
|
308
|
+
if (query.gate && covers.length > 0)
|
|
309
|
+
pending = await appendWorkspaceGatePending(query.cwd, { gate: query.gate, run: id, timestamp: record.ended, covers });
|
|
310
|
+
await appendWorkspaceRun(query.cwd, record);
|
|
311
|
+
}
|
|
312
|
+
catch (err) {
|
|
313
|
+
ledgerError = err instanceof Error ? err.message : String(err);
|
|
314
|
+
}
|
|
315
|
+
return { kind: "ran", record, skipped, pending, ledgerError };
|
|
316
|
+
}
|
|
317
|
+
// ── The command ──────────────────────────────────────────────────────────────
|
|
318
|
+
function describeFinding(f) {
|
|
319
|
+
return `${f.checkId}: ${f.message}`;
|
|
320
|
+
}
|
|
321
|
+
export async function runWorkspaceRun(ctx) {
|
|
322
|
+
const { args } = ctx;
|
|
323
|
+
const words = args.positionals ?? [];
|
|
324
|
+
// positionals[0] is "run".
|
|
325
|
+
const rest = words[0] === "run" ? words.slice(1) : words;
|
|
326
|
+
if (rest[0] === "approve")
|
|
327
|
+
return runWorkspaceRunApprove(ctx, rest.slice(1));
|
|
328
|
+
const cwd = resolve(".");
|
|
329
|
+
// The root's chant runs the workspace run (ws-021).
|
|
330
|
+
const { handToRootChant } = await import("./which-chant.js");
|
|
331
|
+
const handed = await handToRootChant(cwd, undefined);
|
|
332
|
+
if (handed !== undefined)
|
|
333
|
+
return handed;
|
|
334
|
+
let outcome;
|
|
335
|
+
try {
|
|
336
|
+
outcome = await workspaceRun({
|
|
337
|
+
cwd,
|
|
338
|
+
targets: rest,
|
|
339
|
+
...(args.dependentsOf !== undefined ? { dependentsOf: args.dependentsOf } : {}),
|
|
340
|
+
...(args.op !== undefined ? { op: args.op } : {}),
|
|
341
|
+
...(args.env !== undefined ? { env: args.env } : {}),
|
|
342
|
+
...(args.gate !== undefined ? { gate: args.gate } : {}),
|
|
343
|
+
...(args.dryRun ? { dryRun: true } : {}),
|
|
344
|
+
...(args.on !== undefined ? { runArgs: ["--on", args.on] } : {}),
|
|
345
|
+
onOutput: args.json
|
|
346
|
+
? undefined
|
|
347
|
+
: (target, r) => {
|
|
348
|
+
process.stderr.write(`── ${target} (exit ${r.exitCode})\n`);
|
|
349
|
+
if (r.stdout)
|
|
350
|
+
process.stderr.write(r.stdout.endsWith("\n") ? r.stdout : `${r.stdout}\n`);
|
|
351
|
+
if (r.stderr)
|
|
352
|
+
process.stderr.write(r.stderr.endsWith("\n") ? r.stderr : `${r.stderr}\n`);
|
|
353
|
+
},
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
catch (err) {
|
|
357
|
+
if (!(err instanceof WorkspaceReadError))
|
|
358
|
+
throw err;
|
|
359
|
+
console.error(formatError({ message: `${err.code}: ${err.describe()}`, hint: USAGE }));
|
|
360
|
+
return 1;
|
|
361
|
+
}
|
|
362
|
+
if (outcome.kind === "refused") {
|
|
363
|
+
if (args.json)
|
|
364
|
+
console.log(JSON.stringify({ status: "refused", message: outcome.message, findings: outcome.findings }, null, 2));
|
|
365
|
+
console.error(formatError({ message: outcome.message, hint: USAGE }));
|
|
366
|
+
for (const f of outcome.findings)
|
|
367
|
+
console.error(` ${describeFinding(f)}`);
|
|
368
|
+
return 1;
|
|
369
|
+
}
|
|
370
|
+
if (outcome.kind === "planned") {
|
|
371
|
+
if (args.json) {
|
|
372
|
+
console.log(JSON.stringify({ status: "planned", targets: outcome.targets, skipped: outcome.skipped }, null, 2));
|
|
373
|
+
}
|
|
374
|
+
else {
|
|
375
|
+
console.log(`chant workspace run would run, in order:`);
|
|
376
|
+
for (const t of outcome.targets)
|
|
377
|
+
console.log(` ${t}`);
|
|
378
|
+
for (const s of outcome.skipped)
|
|
379
|
+
console.log(` (skipped ${s.member}: ${s.reason})`);
|
|
380
|
+
}
|
|
381
|
+
return 0;
|
|
382
|
+
}
|
|
383
|
+
const { record, pending, ledgerError, skipped } = outcome;
|
|
384
|
+
if (args.json) {
|
|
385
|
+
console.log(JSON.stringify({ ...record, skipped, pending, ledgerError }, null, 2));
|
|
386
|
+
}
|
|
387
|
+
else {
|
|
388
|
+
console.log(`workspace run ${record.id}: ${record.status}`);
|
|
389
|
+
for (const s of record.steps)
|
|
390
|
+
console.log(` ${s.target.padEnd(32)} ${s.status}${s.memberRun ? ` (run ${s.memberRun})` : ""}${s.gate ? ` gate ${s.gate.name}` : ""}`);
|
|
391
|
+
for (const s of skipped)
|
|
392
|
+
console.log(` (skipped ${s.member}: ${s.reason})`);
|
|
393
|
+
if (pending) {
|
|
394
|
+
console.log(`Workspace gate "${pending.gate}" is pending over ${pending.covers.length} member gate(s), digest ${pending.digest}.`);
|
|
395
|
+
console.log(` Approve: chant workspace run approve ${pending.gate} --plan ${pending.digest}`);
|
|
396
|
+
console.log(` It stands in only for members that set acceptWorkspaceGates: true at base; the others need their own approval.`);
|
|
397
|
+
}
|
|
398
|
+
if (ledgerError)
|
|
399
|
+
console.error(formatError({ message: `the workspace run record was not written: ${ledgerError}` }));
|
|
400
|
+
}
|
|
401
|
+
if (record.status === "fail")
|
|
402
|
+
return 1;
|
|
403
|
+
if (record.status === "gated")
|
|
404
|
+
return GATED_EXIT;
|
|
405
|
+
return 0;
|
|
406
|
+
}
|
|
407
|
+
async function runWorkspaceRunApprove(ctx, words) {
|
|
408
|
+
const gate = words[0];
|
|
409
|
+
if (!gate) {
|
|
410
|
+
console.error(formatError({ message: "chant workspace run approve needs the workspace gate's name", hint: USAGE }));
|
|
411
|
+
return 1;
|
|
412
|
+
}
|
|
413
|
+
const { approveWorkspaceGate } = await import("./workspace-gates.js");
|
|
414
|
+
const approvedBy = ctx.args.approver ?? ctx.args.actor ?? process.env.GITHUB_ACTOR ?? process.env.GITLAB_USER_LOGIN ?? process.env.USER ?? "unknown";
|
|
415
|
+
try {
|
|
416
|
+
const record = await approveWorkspaceGate(resolve("."), {
|
|
417
|
+
gate,
|
|
418
|
+
...(ctx.args.plan !== undefined ? { digest: ctx.args.plan } : {}),
|
|
419
|
+
approvedBy,
|
|
420
|
+
timestamp: new Date().toISOString(),
|
|
421
|
+
});
|
|
422
|
+
if (ctx.args.json)
|
|
423
|
+
console.log(JSON.stringify(record, null, 2));
|
|
424
|
+
else
|
|
425
|
+
console.log(`Approved workspace gate "${gate}" (${record.digest}) as ${approvedBy}, covering ${record.covers.map((c) => `${c.member}/${c.op}:${c.gate}`).join(", ")}.`);
|
|
426
|
+
return 0;
|
|
427
|
+
}
|
|
428
|
+
catch (err) {
|
|
429
|
+
console.error(formatError({ message: err instanceof Error ? err.message : String(err), hint: USAGE }));
|
|
430
|
+
return 1;
|
|
431
|
+
}
|
|
432
|
+
}
|
package/package.json
CHANGED
|
@@ -224,6 +224,16 @@
|
|
|
224
224
|
"t1 applied, and then the after-apply hook smoke failed"
|
|
225
225
|
],
|
|
226
226
|
"files": {
|
|
227
|
+
".chant/op-waves/migrations/outcomes/outcome-wave-1.json": {
|
|
228
|
+
"version": 1,
|
|
229
|
+
"wave": 1,
|
|
230
|
+
"at": "2026-10-11T00:00:00.000Z",
|
|
231
|
+
"members": {
|
|
232
|
+
"t1": {
|
|
233
|
+
"status": "applied"
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
},
|
|
227
237
|
".chant/op-waves/migrations/wave-1/runs.json": {
|
|
228
238
|
"wave": "prod",
|
|
229
239
|
"number": 1,
|
|
@@ -558,6 +558,16 @@
|
|
|
558
558
|
"wave 1 (prod) is held by before-apply hook lag (t1), and alice approved its digest"
|
|
559
559
|
],
|
|
560
560
|
"files": {
|
|
561
|
+
".chant/op-waves/migrations/outcomes/outcome-wave-1.json": {
|
|
562
|
+
"version": 1,
|
|
563
|
+
"wave": 1,
|
|
564
|
+
"at": "2026-10-11T00:00:00.000Z",
|
|
565
|
+
"members": {
|
|
566
|
+
"t1": {
|
|
567
|
+
"status": "applied"
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
},
|
|
561
571
|
".chant/op-waves/migrations/wave-1/runs.json": {
|
|
562
572
|
"wave": "prod",
|
|
563
573
|
"number": 1,
|
|
@@ -198,6 +198,16 @@
|
|
|
198
198
|
"t1: the apply exited 0 without running its before-apply and after-apply hooks (runOpWaveApplyHooks with CHANT_HOOKS), which the spec at base hands it"
|
|
199
199
|
],
|
|
200
200
|
"files": {
|
|
201
|
+
".chant/op-waves/migrations/outcomes/outcome-wave-1.json": {
|
|
202
|
+
"version": 1,
|
|
203
|
+
"wave": 1,
|
|
204
|
+
"at": "2026-10-11T00:00:00.000Z",
|
|
205
|
+
"members": {
|
|
206
|
+
"t1": {
|
|
207
|
+
"status": "applied"
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
},
|
|
201
211
|
".chant/op-waves/migrations/wave-1/runs.json": {
|
|
202
212
|
"wave": "prod",
|
|
203
213
|
"number": 1,
|
|
@@ -223,6 +223,16 @@
|
|
|
223
223
|
"wave 1 (prod): gate never (read at bbbbbbbbbbbb), digest jcs1-sha256:bd002be383b5e5991600692d985c09fb3ff0bc3370a8264d1ea8f118518dcc1e: not-required"
|
|
224
224
|
],
|
|
225
225
|
"files": {
|
|
226
|
+
".chant/op-waves/migrations/outcomes/outcome-wave-1.json": {
|
|
227
|
+
"version": 1,
|
|
228
|
+
"wave": 1,
|
|
229
|
+
"at": "2026-10-11T00:00:00.000Z",
|
|
230
|
+
"members": {
|
|
231
|
+
"t1": {
|
|
232
|
+
"status": "applied"
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
},
|
|
226
236
|
".chant/op-waves/migrations/wave-1/runs.json": {
|
|
227
237
|
"wave": "prod",
|
|
228
238
|
"number": 1,
|
|
@@ -225,6 +225,16 @@
|
|
|
225
225
|
"wave 1 (prod): gate never (read at bbbbbbbbbbbb), digest jcs1-sha256:bd002be383b5e5991600692d985c09fb3ff0bc3370a8264d1ea8f118518dcc1e: not-required"
|
|
226
226
|
],
|
|
227
227
|
"files": {
|
|
228
|
+
".chant/op-waves/migrations/outcomes/outcome-wave-1.json": {
|
|
229
|
+
"version": 1,
|
|
230
|
+
"wave": 1,
|
|
231
|
+
"at": "2026-10-11T00:00:00.000Z",
|
|
232
|
+
"members": {
|
|
233
|
+
"t1": {
|
|
234
|
+
"status": "applied"
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
},
|
|
228
238
|
".chant/op-waves/migrations/wave-1/runs.json": {
|
|
229
239
|
"wave": "prod",
|
|
230
240
|
"number": 1,
|
|
@@ -37,6 +37,12 @@
|
|
|
37
37
|
],
|
|
38
38
|
"logs": [],
|
|
39
39
|
"files": {
|
|
40
|
+
".chant/op-waves/tf-apply/outcomes/outcome-wave-1.json": {
|
|
41
|
+
"version": 1,
|
|
42
|
+
"wave": 1,
|
|
43
|
+
"at": "2026-10-11T00:00:00.000Z",
|
|
44
|
+
"members": {}
|
|
45
|
+
},
|
|
40
46
|
".chant/op-waves/tf-apply/wave-1/plans.json": {
|
|
41
47
|
"runs": [
|
|
42
48
|
{
|
|
@@ -107,6 +107,19 @@
|
|
|
107
107
|
"Nothing in wave 1 or after it ran. Read the plans, then approve: chant approve tf-apply wave-1 --plan jcs1-sha256:138f28c4ef2e87abe7454a8f47db147636932e106e166a399866b5bf470a21af (with --resume, the approval also starts this job again)"
|
|
108
108
|
],
|
|
109
109
|
"files": {
|
|
110
|
+
".chant/op-waves/tf-apply/outcomes/outcome-wave-1.json": {
|
|
111
|
+
"version": 1,
|
|
112
|
+
"wave": 1,
|
|
113
|
+
"at": "2026-10-11T00:00:00.000Z",
|
|
114
|
+
"members": {
|
|
115
|
+
"a/idle": {
|
|
116
|
+
"status": "waiting"
|
|
117
|
+
},
|
|
118
|
+
"a/vpc": {
|
|
119
|
+
"status": "waiting"
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
},
|
|
110
123
|
".chant/op-waves/tf-apply/wave-1/a_idle.plan.json": {
|
|
111
124
|
"planDigest": "sha256:2222222222222222222222222222222222222222222222222222222222222222",
|
|
112
125
|
"empty": true
|
|
@@ -276,6 +276,22 @@
|
|
|
276
276
|
"Nothing in wave 1 (net) or after it ran: the policy denied vpc, and no override counts for it."
|
|
277
277
|
],
|
|
278
278
|
"files": {
|
|
279
|
+
".chant/op-waves/tf-apply/outcomes/outcome-wave-1.json": {
|
|
280
|
+
"version": 1,
|
|
281
|
+
"wave": 1,
|
|
282
|
+
"at": "2026-10-11T00:00:00.000Z",
|
|
283
|
+
"members": {
|
|
284
|
+
"dns": {
|
|
285
|
+
"status": "refused"
|
|
286
|
+
},
|
|
287
|
+
"nat": {
|
|
288
|
+
"status": "refused"
|
|
289
|
+
},
|
|
290
|
+
"vpc": {
|
|
291
|
+
"status": "refused"
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
},
|
|
279
295
|
".chant/op-waves/tf-apply/wave-1/dns.plan.json": {
|
|
280
296
|
"planDigest": "sha256:2222222222222222222222222222222222222222222222222222222222222222"
|
|
281
297
|
},
|
|
@@ -273,6 +273,22 @@
|
|
|
273
273
|
"Nothing in wave 1 (net) or after it ran: the policy denied vpc, and no override counts for it."
|
|
274
274
|
],
|
|
275
275
|
"files": {
|
|
276
|
+
".chant/op-waves/tf-apply/outcomes/outcome-wave-1.json": {
|
|
277
|
+
"version": 1,
|
|
278
|
+
"wave": 1,
|
|
279
|
+
"at": "2026-10-11T00:00:00.000Z",
|
|
280
|
+
"members": {
|
|
281
|
+
"dns": {
|
|
282
|
+
"status": "refused"
|
|
283
|
+
},
|
|
284
|
+
"nat": {
|
|
285
|
+
"status": "refused"
|
|
286
|
+
},
|
|
287
|
+
"vpc": {
|
|
288
|
+
"status": "refused"
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
},
|
|
276
292
|
".chant/op-waves/tf-apply/wave-1/dns.plan.json": {
|
|
277
293
|
"planDigest": "sha256:2222222222222222222222222222222222222222222222222222222222222222"
|
|
278
294
|
},
|
|
@@ -61,6 +61,12 @@
|
|
|
61
61
|
"wave 2 (rest): gate never (read at bbbbbbbbbbbb), digest jcs1-sha256:1fa77cc2ae4f64b25382f00ebcf74210c66068d22785dbd5192eac122050ab1e: not-required"
|
|
62
62
|
],
|
|
63
63
|
"files": {
|
|
64
|
+
".chant/op-waves/tf-apply/outcomes/outcome-wave-2.json": {
|
|
65
|
+
"version": 1,
|
|
66
|
+
"wave": 2,
|
|
67
|
+
"at": "2026-10-11T00:00:00.000Z",
|
|
68
|
+
"members": {}
|
|
69
|
+
},
|
|
64
70
|
".chant/op-waves/tf-apply/wave-2/plans.json": {
|
|
65
71
|
"runs": [],
|
|
66
72
|
"waves": 1
|
|
@@ -200,6 +200,19 @@
|
|
|
200
200
|
"wave 3 (rest): apply failed, so none of c/app counts as applied"
|
|
201
201
|
],
|
|
202
202
|
"files": {
|
|
203
|
+
".chant/op-waves/tf-apply/outcomes/outcome-wave-2.json": {
|
|
204
|
+
"version": 1,
|
|
205
|
+
"wave": 2,
|
|
206
|
+
"at": "2026-10-11T00:00:00.000Z",
|
|
207
|
+
"members": {
|
|
208
|
+
"b/db": {
|
|
209
|
+
"status": "applied"
|
|
210
|
+
},
|
|
211
|
+
"c/app": {
|
|
212
|
+
"status": "failed"
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
},
|
|
203
216
|
".chant/op-waves/tf-apply/wave-2/b_db.plan.json": {
|
|
204
217
|
"planDigest": "sha256:2222222222222222222222222222222222222222222222222222222222222222"
|
|
205
218
|
},
|