@intentius/chant 0.56.0 → 0.58.0
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/audit/catalog.d.ts +51 -1
- package/dist/audit/catalog.d.ts.map +1 -1
- package/dist/audit/core.d.ts +20 -1
- package/dist/audit/core.d.ts.map +1 -1
- package/dist/audit/discover.d.ts +14 -8
- package/dist/audit/discover.d.ts.map +1 -1
- package/dist/audit/lineage.d.ts +10 -0
- package/dist/audit/lineage.d.ts.map +1 -0
- package/dist/audit/prior-art.d.ts +385 -0
- package/dist/audit/prior-art.d.ts.map +1 -0
- package/dist/audit/proof.d.ts +16 -0
- package/dist/audit/proof.d.ts.map +1 -1
- package/dist/audit/report-html.d.ts.map +1 -1
- package/dist/audit/report-model.d.ts +8 -1
- package/dist/audit/report-model.d.ts.map +1 -1
- package/dist/audit/report.d.ts.map +1 -1
- package/dist/audit/rules-doc.d.ts +3 -0
- package/dist/audit/rules-doc.d.ts.map +1 -1
- package/dist/audit/secrets.d.ts +15 -0
- package/dist/audit/secrets.d.ts.map +1 -1
- package/dist/audit/terraform-state.d.ts +46 -0
- package/dist/audit/terraform-state.d.ts.map +1 -0
- package/dist/build.d.ts +17 -1
- package/dist/build.d.ts.map +1 -1
- package/dist/claimed-fields.d.ts +161 -0
- package/dist/claimed-fields.d.ts.map +1 -0
- package/dist/cli/build-params-cli.d.ts +2 -2
- package/dist/cli/command-group.d.ts +14 -0
- package/dist/cli/command-group.d.ts.map +1 -1
- package/dist/cli/commands/audit.d.ts +17 -1
- package/dist/cli/commands/audit.d.ts.map +1 -1
- package/dist/cli/commands/build.d.ts.map +1 -1
- package/dist/cli/commands/check-lexicon-docs.d.ts +1 -1
- package/dist/cli/commands/check-lexicon-examples.d.ts +16 -6
- package/dist/cli/commands/check-lexicon-examples.d.ts.map +1 -1
- package/dist/cli/commands/import.d.ts.map +1 -1
- package/dist/cli/commands/init-lexicon/templates/codegen.d.ts +1 -0
- package/dist/cli/commands/init-lexicon/templates/codegen.d.ts.map +1 -1
- package/dist/cli/commands/init-lexicon/templates/project.d.ts +7 -0
- package/dist/cli/commands/init-lexicon/templates/project.d.ts.map +1 -1
- package/dist/cli/commands/init-lexicon.d.ts.map +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/lint.d.ts.map +1 -1
- package/dist/cli/commands/onboard.d.ts +2 -0
- package/dist/cli/commands/onboard.d.ts.map +1 -1
- package/dist/cli/handlers/build.d.ts.map +1 -1
- package/dist/cli/handlers/lifecycle.d.ts.map +1 -1
- package/dist/cli/handlers/operator.d.ts +82 -16
- package/dist/cli/handlers/operator.d.ts.map +1 -1
- package/dist/cli/handlers/run.d.ts +49 -42
- package/dist/cli/handlers/run.d.ts.map +1 -1
- package/dist/cli/main.d.ts +28 -1
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/mcp/op-tools.d.ts +16 -1
- package/dist/cli/mcp/op-tools.d.ts.map +1 -1
- package/dist/cli/mcp/resource-handlers.d.ts.map +1 -1
- package/dist/cli/mcp/resources/context.d.ts.map +1 -1
- package/dist/cli/registry.d.ts +26 -9
- package/dist/cli/registry.d.ts.map +1 -1
- package/dist/codegen/generate-post-synth-barrel.d.ts +1 -1
- package/dist/components/auto-release.d.ts +10 -20
- package/dist/components/auto-release.d.ts.map +1 -1
- package/dist/components/capability.d.ts +4 -4
- package/dist/components/cli-support.d.ts +20 -21
- package/dist/components/cli-support.d.ts.map +1 -1
- package/dist/components/component.d.ts +3 -3
- package/dist/components/component.d.ts.map +1 -1
- package/dist/components/driver-output.d.ts.map +1 -1
- package/dist/components/driver.d.ts +66 -36
- package/dist/components/driver.d.ts.map +1 -1
- package/dist/components/index.d.ts +1 -2
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/manifest-persistence.d.ts +1 -9
- package/dist/components/manifest-persistence.d.ts.map +1 -1
- package/dist/components/run-progress.d.ts +6 -6
- package/dist/components/run-progress.d.ts.map +1 -1
- package/dist/components/verbs/run-agent.d.ts +9 -15
- package/dist/components/verbs/run-agent.d.ts.map +1 -1
- package/dist/components/verbs/verify.d.ts +2 -2
- package/dist/deep-observation.d.ts +17 -0
- package/dist/deep-observation.d.ts.map +1 -1
- package/dist/discovery/files.d.ts +4 -4
- package/dist/discovery/fold-import.d.ts.map +1 -1
- package/dist/discovery/param-deps.d.ts +33 -0
- package/dist/discovery/param-deps.d.ts.map +1 -1
- package/dist/discovery/sandbox/bundle.d.ts.map +1 -1
- package/dist/discovery/sandbox/config-wire.d.ts +2 -2
- package/dist/fold/foldable-helpers.d.ts +5 -1
- package/dist/fold/foldable-helpers.d.ts.map +1 -1
- package/dist/fold-provenance.d.ts +236 -0
- package/dist/fold-provenance.d.ts.map +1 -0
- package/dist/graph-ops.d.ts +1 -1
- package/dist/held-elsewhere.d.ts +85 -0
- package/dist/held-elsewhere.d.ts.map +1 -0
- package/dist/import/ir-utils.d.ts +1 -1
- package/dist/import/ir-utils.d.ts.map +1 -1
- package/dist/import/parser.d.ts +33 -0
- package/dist/import/parser.d.ts.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/kubectl-context.d.ts +3 -3
- package/dist/lexicon-config.d.ts +4 -4
- package/dist/lexicon-plugin-helpers.d.ts +1 -1
- package/dist/lexicon.d.ts +104 -14
- package/dist/lexicon.d.ts.map +1 -1
- package/dist/lifecycle/change-set.d.ts +13 -0
- package/dist/lifecycle/change-set.d.ts.map +1 -1
- package/dist/lifecycle/deep-diff.d.ts +133 -6
- package/dist/lifecycle/deep-diff.d.ts.map +1 -1
- package/dist/lifecycle/deep-observe.d.ts.map +1 -1
- package/dist/lifecycle/gate-ledger.d.ts +71 -3
- package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
- package/dist/lifecycle/index.d.ts +1 -0
- package/dist/lifecycle/index.d.ts.map +1 -1
- package/dist/lifecycle/release-ledger.d.ts +2 -2
- package/dist/lifecycle/run-ledger.d.ts +53 -0
- package/dist/lifecycle/run-ledger.d.ts.map +1 -0
- package/dist/lifecycle/symptoms.d.ts +3 -3
- package/dist/lifecycle/symptoms.d.ts.map +1 -1
- package/dist/lint/config.d.ts +81 -2
- package/dist/lint/config.d.ts.map +1 -1
- package/dist/lint/post-synth.d.ts +55 -2
- package/dist/lint/post-synth.d.ts.map +1 -1
- package/dist/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.d.ts +1 -1
- package/dist/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.d.ts.map +1 -1
- package/dist/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.d.ts +1 -1
- package/dist/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.d.ts.map +1 -1
- package/dist/lint/rules/comp/comp004-gate-needs-durable-runtime.d.ts +44 -0
- package/dist/lint/rules/comp/comp004-gate-needs-durable-runtime.d.ts.map +1 -0
- package/dist/lint/rules/comp/index.d.ts +1 -1
- package/dist/lint/rules/comp/index.d.ts.map +1 -1
- package/dist/lint/rules/op/index.d.ts +16 -0
- package/dist/lint/rules/op/index.d.ts.map +1 -0
- package/dist/lint/rules/op/ops012-activity-contract.d.ts +27 -0
- package/dist/lint/rules/op/ops012-activity-contract.d.ts.map +1 -0
- package/dist/lint/rules/op/ops013-step-output-ref.d.ts +61 -0
- package/dist/lint/rules/op/ops013-step-output-ref.d.ts.map +1 -0
- package/dist/lint/rules/op/ops014-converge-rule-refusals.d.ts +55 -0
- package/dist/lint/rules/op/ops014-converge-rule-refusals.d.ts.map +1 -0
- package/dist/lint/rules/op/support.d.ts +12 -0
- package/dist/lint/rules/op/support.d.ts.map +1 -0
- package/dist/lint/suppressions.d.ts +108 -0
- package/dist/lint/suppressions.d.ts.map +1 -0
- package/dist/live-endpoint.d.ts +1 -1
- package/dist/op/activities/activity-contracts.d.ts +54 -0
- package/dist/op/activities/activity-contracts.d.ts.map +1 -0
- package/dist/op/activities/apply.d.ts +262 -0
- package/dist/op/activities/apply.d.ts.map +1 -0
- package/dist/op/activities/build.d.ts +13 -0
- package/dist/op/activities/build.d.ts.map +1 -0
- package/dist/op/activities/converge.d.ts +110 -0
- package/dist/op/activities/converge.d.ts.map +1 -0
- package/dist/op/activities/env-teardown.d.ts +76 -0
- package/dist/op/activities/env-teardown.d.ts.map +1 -0
- package/dist/op/activities/guard-validate.d.ts +64 -0
- package/dist/op/activities/guard-validate.d.ts.map +1 -0
- package/dist/op/activities/http-check.d.ts +34 -0
- package/dist/op/activities/http-check.d.ts.map +1 -0
- package/dist/op/activities/index.d.ts +31 -0
- package/dist/op/activities/index.d.ts.map +1 -0
- package/dist/op/activities/lexicon-upgrade.d.ts +182 -0
- package/dist/op/activities/lexicon-upgrade.d.ts.map +1 -0
- package/dist/op/activities/lifecycle.d.ts +42 -0
- package/dist/op/activities/lifecycle.d.ts.map +1 -0
- package/dist/op/activities/pipeline-audit.d.ts +84 -0
- package/dist/op/activities/pipeline-audit.d.ts.map +1 -0
- package/dist/op/activities/policy.d.ts +17 -0
- package/dist/op/activities/policy.d.ts.map +1 -0
- package/dist/op/activities/reconcile.d.ts +89 -0
- package/dist/op/activities/reconcile.d.ts.map +1 -0
- package/dist/op/activities/shell.d.ts +13 -0
- package/dist/op/activities/shell.d.ts.map +1 -0
- package/dist/op/activities/teardown.d.ts +10 -0
- package/dist/op/activities/teardown.d.ts.map +1 -0
- package/dist/op/activities/util.d.ts +7 -0
- package/dist/op/activities/util.d.ts.map +1 -0
- package/dist/op/activities/wait.d.ts +28 -0
- package/dist/op/activities/wait.d.ts.map +1 -0
- package/dist/op/activities/workflow-audit.d.ts +92 -0
- package/dist/op/activities/workflow-audit.d.ts.map +1 -0
- package/dist/op/activity-contract-registry.d.ts +76 -0
- package/dist/op/activity-contract-registry.d.ts.map +1 -0
- package/dist/op/activity-contract.d.ts +25 -18
- package/dist/op/activity-contract.d.ts.map +1 -1
- package/dist/op/activity-failure.d.ts +28 -0
- package/dist/op/activity-failure.d.ts.map +1 -0
- package/dist/op/activity-profiles.d.ts +118 -0
- package/dist/op/activity-profiles.d.ts.map +1 -0
- package/dist/op/activity-registry.d.ts +22 -38
- package/dist/op/activity-registry.d.ts.map +1 -1
- package/dist/op/activity-runtime.d.ts +3 -14
- package/dist/op/activity-runtime.d.ts.map +1 -1
- package/dist/op/builders.d.ts +84 -29
- package/dist/op/builders.d.ts.map +1 -1
- package/dist/op/composites/apply-op.d.ts +113 -0
- package/dist/op/composites/apply-op.d.ts.map +1 -0
- package/dist/op/composites/converge-op.d.ts +120 -0
- package/dist/op/composites/converge-op.d.ts.map +1 -0
- package/dist/op/composites/index.d.ts +26 -0
- package/dist/op/composites/index.d.ts.map +1 -0
- package/dist/op/composites/lexicon-upgrade-op.d.ts +78 -0
- package/dist/op/composites/lexicon-upgrade-op.d.ts.map +1 -0
- package/dist/op/composites/pipeline-audit-op.d.ts +50 -0
- package/dist/op/composites/pipeline-audit-op.d.ts.map +1 -0
- package/dist/op/composites/reconcile-op.d.ts +57 -0
- package/dist/op/composites/reconcile-op.d.ts.map +1 -0
- package/dist/op/composites/watch-op.d.ts +60 -0
- package/dist/op/composites/watch-op.d.ts.map +1 -0
- package/dist/op/composites/workflow-audit-op.d.ts +57 -0
- package/dist/op/composites/workflow-audit-op.d.ts.map +1 -0
- package/dist/op/converge-rule.d.ts +12 -10
- package/dist/op/converge-rule.d.ts.map +1 -1
- package/dist/op/cron.d.ts +51 -0
- package/dist/op/cron.d.ts.map +1 -0
- package/dist/op/discover.d.ts +9 -0
- package/dist/op/discover.d.ts.map +1 -1
- package/dist/op/duration.d.ts +11 -0
- package/dist/op/duration.d.ts.map +1 -0
- package/dist/op/emulator-lifecycle.d.ts.map +1 -1
- package/dist/op/gate.d.ts +90 -0
- package/dist/op/gate.d.ts.map +1 -0
- package/dist/op/generate-pipeline.d.ts +9 -0
- package/dist/op/generate-pipeline.d.ts.map +1 -1
- package/dist/op/index.d.ts +23 -7
- package/dist/op/index.d.ts.map +1 -1
- package/dist/op/local-executor.d.ts +114 -28
- package/dist/op/local-executor.d.ts.map +1 -1
- package/dist/op/local-output.d.ts +11 -1
- package/dist/op/local-output.d.ts.map +1 -1
- package/dist/op/op-ir.d.ts +184 -0
- package/dist/op/op-ir.d.ts.map +1 -0
- package/dist/op/op-verb-class.d.ts +10 -2
- package/dist/op/op-verb-class.d.ts.map +1 -1
- package/dist/op/operator.d.ts +30 -5
- package/dist/op/operator.d.ts.map +1 -1
- package/dist/op/receipt-store.d.ts +1 -1
- package/dist/op/receipt-store.d.ts.map +1 -1
- package/dist/op/resource.d.ts +15 -1
- package/dist/op/resource.d.ts.map +1 -1
- package/dist/op/runtime.d.ts +200 -0
- package/dist/op/runtime.d.ts.map +1 -0
- package/dist/op/runtimes/local.d.ts +29 -0
- package/dist/op/runtimes/local.d.ts.map +1 -0
- package/dist/op/step-output-ref.d.ts +15 -13
- package/dist/op/step-output-ref.d.ts.map +1 -1
- package/dist/op/types.d.ts +79 -27
- package/dist/op/types.d.ts.map +1 -1
- package/dist/ownership.d.ts +1 -1
- package/dist/provenance.d.ts +21 -0
- package/dist/provenance.d.ts.map +1 -1
- package/dist/serializer-walker.d.ts.map +1 -1
- package/dist/stack-output.d.ts +5 -0
- package/dist/stack-output.d.ts.map +1 -1
- package/package.json +6 -1
- package/src/audit/catalog.test.ts +79 -3
- package/src/audit/catalog.ts +111 -13
- package/src/audit/core.test.ts +26 -0
- package/src/audit/core.ts +61 -17
- package/src/audit/discover.test.ts +39 -0
- package/src/audit/discover.ts +91 -15
- package/src/audit/lineage.ts +100 -0
- package/src/audit/prior-art.ts +153 -0
- package/src/audit/proof.test.ts +67 -0
- package/src/audit/proof.ts +70 -0
- package/src/audit/report-html.ts +9 -4
- package/src/audit/report-model.ts +16 -2
- package/src/audit/report.test.ts +33 -0
- package/src/audit/report.ts +5 -3
- package/src/audit/rules-doc.test.ts +34 -2
- package/src/audit/rules-doc.ts +82 -9
- package/src/audit/secrets.ts +15 -3
- package/src/audit/terraform-state.test.ts +144 -0
- package/src/audit/terraform-state.ts +131 -0
- package/src/build.ts +31 -1
- package/src/claimed-fields.test.ts +145 -0
- package/src/claimed-fields.ts +208 -0
- package/src/cli/build-params-cli.ts +2 -2
- package/src/cli/command-group.ts +14 -0
- package/src/cli/commands/__fixtures__/audit-terraform/infra/.terraform/providers/lock.txt +1 -0
- package/src/cli/commands/__fixtures__/audit-terraform/infra/main.tf +1 -0
- package/src/cli/commands/__fixtures__/audit-terraform/infra/modules/foo/main.tf +1 -0
- package/src/cli/commands/__fixtures__/audit-terraform/infra/variables.tf +3 -0
- package/src/cli/commands/__fixtures__/init-lexicon-output/package.json +13 -4
- package/src/cli/commands/__fixtures__/init-lexicon-output/src/codegen/docs-cli.ts +4 -0
- package/src/cli/commands/__fixtures__/init-lexicon-output/src/codegen/package.ts +1 -0
- package/src/cli/commands/__fixtures__/init-lexicon-output/src/package-cli.ts +21 -0
- package/src/cli/commands/__snapshots__/init-lexicon.test.ts.snap +1 -0
- package/src/cli/commands/audit.test.ts +189 -11
- package/src/cli/commands/audit.ts +73 -27
- package/src/cli/commands/build.test.ts +292 -9
- package/src/cli/commands/build.ts +156 -24
- package/src/cli/commands/check-lexicon-docs.ts +1 -1
- package/src/cli/commands/check-lexicon-examples.test.ts +29 -1
- package/src/cli/commands/check-lexicon-examples.ts +42 -10
- package/src/cli/commands/import.ts +6 -0
- package/src/cli/commands/init-lexicon/templates/codegen.ts +9 -0
- package/src/cli/commands/init-lexicon/templates/project.ts +44 -4
- package/src/cli/commands/init-lexicon.test.ts +97 -2
- package/src/cli/commands/init-lexicon.ts +4 -2
- package/src/cli/commands/init.test.ts +35 -1
- package/src/cli/commands/init.ts +14 -3
- package/src/cli/commands/lint.test.ts +48 -0
- package/src/cli/commands/lint.ts +123 -0
- package/src/cli/commands/onboard.test.ts +75 -0
- package/src/cli/commands/onboard.ts +54 -23
- package/src/cli/handlers/build.test.ts +81 -1
- package/src/cli/handlers/build.ts +15 -1
- package/src/cli/handlers/graph.test.ts +3 -3
- package/src/cli/handlers/lifecycle.test.ts +195 -12
- package/src/cli/handlers/lifecycle.ts +123 -6
- package/src/cli/handlers/misc.ts +1 -1
- package/src/cli/handlers/operator.test.ts +183 -11
- package/src/cli/handlers/operator.ts +260 -55
- package/src/cli/handlers/run.test.ts +431 -1287
- package/src/cli/handlers/run.ts +365 -915
- package/src/cli/main.test.ts +23 -15
- package/src/cli/main.ts +88 -33
- package/src/cli/mcp/op-tools.ts +147 -88
- package/src/cli/mcp/resource-handlers.ts +10 -37
- package/src/cli/mcp/resources/context.ts +11 -12
- package/src/cli/mcp/server.test.ts +25 -27
- package/src/cli/mcp/server.ts +2 -2
- package/src/cli/registry.ts +26 -9
- package/src/codegen/docs.ts +1 -1
- package/src/codegen/generate-post-synth-barrel.test.ts +1 -1
- package/src/codegen/generate-post-synth-barrel.ts +1 -1
- package/src/components/README.md +3 -2
- package/src/components/auto-release.test.ts +4 -20
- package/src/components/auto-release.ts +17 -42
- package/src/components/capability.ts +4 -4
- package/src/components/cli-support.test.ts +10 -5
- package/src/components/cli-support.ts +52 -44
- package/src/components/component.schema.json +2 -2
- package/src/components/component.ts +3 -3
- package/src/components/driver-output.ts +14 -2
- package/src/components/driver.test.ts +92 -22
- package/src/components/driver.ts +193 -83
- package/src/components/index.ts +1 -6
- package/src/components/manifest-persistence.test.ts +2 -20
- package/src/components/manifest-persistence.ts +4 -24
- package/src/components/pilots/pilots-lint-clean.test.ts +11 -10
- package/src/components/run-progress.ts +6 -6
- package/src/components/verbs/run-agent.ts +11 -17
- package/src/components/verbs/verify.ts +2 -2
- package/src/deep-observation.test.ts +75 -0
- package/src/deep-observation.ts +48 -0
- package/src/discovery/collect.test.ts +3 -3
- package/src/discovery/files.ts +4 -4
- package/src/discovery/fold-import.ts +105 -2
- package/src/discovery/param-deps.test.ts +112 -1
- package/src/discovery/param-deps.ts +193 -0
- package/src/discovery/sandbox/bundle.ts +15 -1
- package/src/discovery/sandbox/config-wire.test.ts +2 -2
- package/src/discovery/sandbox/config-wire.ts +2 -2
- package/src/fold/fold.test.ts +56 -0
- package/src/fold/foldable-helpers.ts +81 -1
- package/src/fold-provenance-exclusion.test.ts +186 -0
- package/src/fold-provenance.test.ts +495 -0
- package/src/fold-provenance.ts +441 -0
- package/src/graph-ops.test.ts +2 -2
- package/src/graph-ops.ts +1 -1
- package/src/held-elsewhere.test.ts +102 -0
- package/src/held-elsewhere.ts +114 -0
- package/src/import/ir-utils.ts +11 -1
- package/src/import/parser.ts +35 -0
- package/src/index.ts +3 -0
- package/src/kubectl-context.ts +3 -3
- package/src/lexicon-config.test.ts +5 -5
- package/src/lexicon-config.ts +4 -4
- package/src/lexicon-plugin-helpers.ts +1 -1
- package/src/lexicon.ts +120 -14
- package/src/lifecycle/change-set.test.ts +49 -0
- package/src/lifecycle/change-set.ts +67 -0
- package/src/lifecycle/converge-ledger.ts +1 -1
- package/src/lifecycle/deep-diff.test.ts +267 -14
- package/src/lifecycle/deep-diff.ts +217 -14
- package/src/lifecycle/deep-observe.test.ts +3 -1
- package/src/lifecycle/deep-observe.ts +16 -6
- package/src/lifecycle/gate-ledger.test.ts +74 -2
- package/src/lifecycle/gate-ledger.ts +143 -36
- package/src/lifecycle/index.ts +1 -0
- package/src/lifecycle/release-ledger.ts +2 -2
- package/src/lifecycle/run-ledger.test.ts +268 -0
- package/src/lifecycle/run-ledger.ts +201 -0
- package/src/lifecycle/symptoms.ts +3 -3
- package/src/lint/config.test.ts +82 -1
- package/src/lint/config.ts +112 -3
- package/src/lint/policy.test.ts +1 -1
- package/src/lint/post-synth.test.ts +31 -0
- package/src/lint/post-synth.ts +54 -1
- package/src/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.ts +2 -2
- package/src/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.ts +1 -1
- package/src/lint/rules/comp/comp.test.ts +1 -1
- package/src/lint/rules/comp/comp004-gate-needs-durable-runtime.ts +74 -0
- package/src/lint/rules/comp/index.ts +3 -3
- package/src/lint/rules/op/index.ts +23 -0
- package/src/lint/rules/op/ops012-activity-contract.test.ts +161 -0
- package/src/lint/rules/op/ops012-activity-contract.ts +64 -0
- package/src/lint/rules/op/ops013-step-output-ref.test.ts +237 -0
- package/src/lint/rules/op/ops013-step-output-ref.ts +98 -0
- package/src/lint/rules/op/ops014-converge-rule-refusals.test.ts +263 -0
- package/src/lint/rules/op/ops014-converge-rule-refusals.ts +179 -0
- package/src/lint/rules/op/support.ts +11 -0
- package/src/lint/suppressions.test.ts +163 -0
- package/src/lint/suppressions.ts +204 -0
- package/src/live-endpoint.ts +1 -1
- package/src/op/activities/activity-contracts.ts +66 -0
- package/src/op/activities/apply.test.ts +567 -0
- package/src/op/activities/apply.ts +662 -0
- package/src/op/activities/build.ts +26 -0
- package/src/op/activities/converge.test.ts +330 -0
- package/src/op/activities/converge.ts +449 -0
- package/src/op/activities/env-teardown.test.ts +187 -0
- package/src/op/activities/env-teardown.ts +171 -0
- package/src/op/activities/guard-validate.test.ts +139 -0
- package/src/op/activities/guard-validate.ts +223 -0
- package/src/op/activities/http-check.test.ts +48 -0
- package/src/op/activities/http-check.ts +55 -0
- package/src/op/activities/index.ts +119 -0
- package/src/op/activities/lexicon-upgrade.test.ts +492 -0
- package/src/op/activities/lexicon-upgrade.ts +673 -0
- package/src/op/activities/lifecycle.ts +85 -0
- package/src/op/activities/pipeline-audit.test.ts +67 -0
- package/src/op/activities/pipeline-audit.ts +201 -0
- package/src/op/activities/policy.test.ts +19 -0
- package/src/op/activities/policy.ts +37 -0
- package/src/op/activities/reconcile.test.ts +81 -0
- package/src/op/activities/reconcile.ts +187 -0
- package/src/op/activities/shell.ts +26 -0
- package/src/op/activities/teardown.ts +22 -0
- package/src/op/activities/util.ts +6 -0
- package/src/op/activities/wait.ts +69 -0
- package/src/op/activities/workflow-audit.test.ts +90 -0
- package/src/op/activities/workflow-audit.ts +203 -0
- package/src/op/activity-contract-registry.test.ts +98 -0
- package/src/op/activity-contract-registry.ts +114 -0
- package/src/op/activity-contract.test.ts +1 -1
- package/src/op/activity-contract.ts +37 -33
- package/src/op/activity-failure.ts +34 -0
- package/src/op/activity-profiles.test.ts +56 -0
- package/src/op/activity-profiles.ts +116 -0
- package/src/op/activity-registry.test.ts +37 -28
- package/src/op/activity-registry.ts +27 -56
- package/src/op/activity-runtime.ts +3 -47
- package/src/op/builders-exports.test.ts +0 -49
- package/src/op/builders-typed.test.ts +164 -0
- package/src/op/builders.ts +123 -39
- package/src/op/composites/apply-op.ts +208 -0
- package/src/op/composites/composites.test.ts +366 -0
- package/src/op/composites/converge-op.test.ts +168 -0
- package/src/op/composites/converge-op.ts +214 -0
- package/src/op/composites/index.ts +26 -0
- package/src/op/composites/lexicon-upgrade-op.test.ts +68 -0
- package/src/op/composites/lexicon-upgrade-op.ts +134 -0
- package/src/op/composites/pipeline-audit-op.test.ts +25 -0
- package/src/op/composites/pipeline-audit-op.ts +78 -0
- package/src/op/composites/reconcile-op.test.ts +51 -0
- package/src/op/composites/reconcile-op.ts +107 -0
- package/src/op/composites/watch-op.ts +108 -0
- package/src/op/composites/workflow-audit-op.test.ts +25 -0
- package/src/op/composites/workflow-audit-op.ts +88 -0
- package/src/op/converge-rule.ts +12 -10
- package/src/op/cron.test.ts +128 -0
- package/src/op/cron.ts +149 -0
- package/src/op/discover-root.test.ts +105 -1
- package/src/op/discover.test.ts +6 -2
- package/src/op/discover.ts +84 -16
- package/src/op/duration.ts +21 -0
- package/src/op/effect-step.test.ts +26 -11
- package/src/op/emulator-lifecycle.ts +1 -2
- package/src/op/gate.ts +155 -0
- package/src/op/generate-pipeline.test.ts +65 -3
- package/src/op/generate-pipeline.ts +19 -2
- package/src/op/index.ts +39 -6
- package/src/op/local-executor.test.ts +163 -34
- package/src/op/local-executor.ts +370 -102
- package/src/op/local-output.test.ts +95 -11
- package/src/op/local-output.ts +33 -4
- package/src/op/op-ir.test.ts +281 -0
- package/src/op/op-ir.ts +417 -0
- package/src/op/op-verb-class.ts +19 -5
- package/src/op/op.test.ts +26 -5
- package/src/op/operator.test.ts +175 -6
- package/src/op/operator.ts +63 -16
- package/src/op/receipt-store.ts +1 -1
- package/src/op/resource.ts +20 -2
- package/src/op/runtime.ts +203 -0
- package/src/op/runtimes/local.test.ts +181 -0
- package/src/op/runtimes/local.ts +212 -0
- package/src/op/step-output-ref.ts +15 -13
- package/src/op/types.ts +84 -24
- package/src/ownership.ts +1 -1
- package/src/provenance.test.ts +6 -0
- package/src/provenance.ts +21 -1
- package/src/serializer-walker.test.ts +42 -0
- package/src/serializer-walker.ts +21 -2
- package/src/stack-output.ts +6 -1
- package/dist/cli/handlers/op-progress.d.ts +0 -90
- package/dist/cli/handlers/op-progress.d.ts.map +0 -1
- package/dist/cli/handlers/run-client.d.ts +0 -127
- package/dist/cli/handlers/run-client.d.ts.map +0 -1
- package/dist/cli/handlers/run-report.d.ts +0 -5
- package/dist/cli/handlers/run-report.d.ts.map +0 -1
- package/dist/components/temporal-codegen-loader.d.ts +0 -27
- package/dist/components/temporal-codegen-loader.d.ts.map +0 -1
- package/dist/lint/rules/comp/comp004-gate-needs-temporal.d.ts +0 -37
- package/dist/lint/rules/comp/comp004-gate-needs-temporal.d.ts.map +0 -1
- package/src/cli/handlers/op-progress.test.ts +0 -268
- package/src/cli/handlers/op-progress.ts +0 -248
- package/src/cli/handlers/run-client.test.ts +0 -82
- package/src/cli/handlers/run-client.ts +0 -219
- package/src/cli/handlers/run-report.test.ts +0 -62
- package/src/cli/handlers/run-report.ts +0 -122
- package/src/components/temporal-codegen-loader.ts +0 -41
- package/src/lint/rules/comp/comp004-gate-needs-temporal.ts +0 -66
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
import { describe, test, expect } from "vitest";
|
|
2
|
-
import { countPropertyDrift, diffDeep, type DeclaredDeepEntity } from "./deep-diff";
|
|
2
|
+
import { countHeld, countUnclaimed, countPropertyDrift, diffDeep, suspiciousHeld, type DeclaredDeepEntity } from "./deep-diff";
|
|
3
3
|
import { UNRESOLVED, type NormalizedDeepObservation } from "../deep-observation";
|
|
4
|
+
import { HELD_ELSEWHERE_TAG } from "../held-elsewhere";
|
|
4
5
|
import type { BaselineLexicon } from "./observation-baseline";
|
|
5
6
|
|
|
7
|
+
/** A declared property's normalized held-elsewhere form, as `deep-observation.ts` produces it (#2162). Tests build this directly, same as they build every other already-normalized declared value in this file. */
|
|
8
|
+
const held = (by: string, reason: string) => ({ heldElsewhere: HELD_ELSEWHERE_TAG, by, reason });
|
|
9
|
+
|
|
6
10
|
const live = (
|
|
7
11
|
resources: Record<string, { type: string; properties: Record<string, unknown>; fieldOwners?: Record<string, string> }>,
|
|
8
12
|
unobserved: NormalizedDeepObservation["unobserved"] = {},
|
|
@@ -33,14 +37,25 @@ describe("diffDeep", () => {
|
|
|
33
37
|
expect(countPropertyDrift(result)).toBe(1);
|
|
34
38
|
});
|
|
35
39
|
|
|
36
|
-
test("a property only the cloud has is
|
|
40
|
+
test("a property only the cloud has is unclaimed, not drift", () => {
|
|
37
41
|
const result = diffDeep({
|
|
38
42
|
declared: { b: { type: "T", properties: {} } },
|
|
39
43
|
live: live({ b: { type: "T", properties: { LoggingConfiguration: { TargetBucket: "logs" } } } }),
|
|
40
44
|
});
|
|
41
|
-
expect(result.drifted
|
|
42
|
-
|
|
45
|
+
expect(result.drifted).toEqual([]);
|
|
46
|
+
expect(countPropertyDrift(result)).toBe(0);
|
|
47
|
+
expect(result.unclaimed).toEqual([
|
|
48
|
+
{
|
|
49
|
+
name: "b",
|
|
50
|
+
type: "T",
|
|
51
|
+
fields: [
|
|
52
|
+
{ path: "LoggingConfiguration.TargetBucket", live: "logs", source: "claimed-fields" },
|
|
53
|
+
],
|
|
54
|
+
},
|
|
43
55
|
]);
|
|
56
|
+
// Every property chant declared matches, so the entity is clean: a field
|
|
57
|
+
// somebody else set must not keep an entity reported forever.
|
|
58
|
+
expect(result.unchanged).toEqual(["b"]);
|
|
44
59
|
});
|
|
45
60
|
|
|
46
61
|
test("a declared property the cloud does not carry is absent", () => {
|
|
@@ -107,17 +122,22 @@ describe("diffDeep with an accepted baseline", () => {
|
|
|
107
122
|
accepted: [{ path: "Tags[0].Value", value: "platform", note: "set by the platform team" }],
|
|
108
123
|
},
|
|
109
124
|
};
|
|
125
|
+
// A path source DOES declare — since #2160 the baseline only ever has drift
|
|
126
|
+
// to suppress, because a path source never declared is unclaimed and was
|
|
127
|
+
// never reported in the first place.
|
|
128
|
+
const declared = { b: { type: "AWS::S3::Bucket", properties: { Tags: [{ Value: "ours" }] } } };
|
|
110
129
|
|
|
111
130
|
test("an accepted deviation is not drift", () => {
|
|
112
131
|
const result = diffDeep({
|
|
113
|
-
declared
|
|
132
|
+
declared,
|
|
114
133
|
live: live({ b: { type: "AWS::S3::Bucket", properties: { Tags: [{ Value: "platform" }] } } }),
|
|
115
134
|
baseline,
|
|
116
135
|
});
|
|
117
136
|
expect(result.drifted).toEqual([]);
|
|
118
137
|
expect(result.accepted[0].changes[0]).toEqual({
|
|
119
138
|
path: "Tags[0].Value",
|
|
120
|
-
kind: "
|
|
139
|
+
kind: "changed",
|
|
140
|
+
declared: "ours",
|
|
121
141
|
live: "platform",
|
|
122
142
|
baseline: "platform",
|
|
123
143
|
});
|
|
@@ -125,13 +145,14 @@ describe("diffDeep with an accepted baseline", () => {
|
|
|
125
145
|
|
|
126
146
|
test("a value that moved away from the accepted one is drift again, and shows all three axes", () => {
|
|
127
147
|
const result = diffDeep({
|
|
128
|
-
declared
|
|
148
|
+
declared,
|
|
129
149
|
live: live({ b: { type: "AWS::S3::Bucket", properties: { Tags: [{ Value: "someone-else" }] } } }),
|
|
130
150
|
baseline,
|
|
131
151
|
});
|
|
132
152
|
expect(result.drifted[0].changes[0]).toEqual({
|
|
133
153
|
path: "Tags[0].Value",
|
|
134
|
-
kind: "
|
|
154
|
+
kind: "changed",
|
|
155
|
+
declared: "ours",
|
|
135
156
|
live: "someone-else",
|
|
136
157
|
baseline: "platform",
|
|
137
158
|
});
|
|
@@ -139,7 +160,7 @@ describe("diffDeep with an accepted baseline", () => {
|
|
|
139
160
|
|
|
140
161
|
test("an entity with only accepted deviations is not counted as unchanged", () => {
|
|
141
162
|
const result = diffDeep({
|
|
142
|
-
declared
|
|
163
|
+
declared,
|
|
143
164
|
live: live({ b: { type: "AWS::S3::Bucket", properties: { Tags: [{ Value: "platform" }] } } }),
|
|
144
165
|
baseline,
|
|
145
166
|
});
|
|
@@ -148,12 +169,30 @@ describe("diffDeep with an accepted baseline", () => {
|
|
|
148
169
|
|
|
149
170
|
test("the baseline never suppresses a different path", () => {
|
|
150
171
|
const result = diffDeep({
|
|
151
|
-
declared: { b: { type: "AWS::S3::Bucket", properties: {} } },
|
|
172
|
+
declared: { b: { type: "AWS::S3::Bucket", properties: { Tags: [{ Value: "ours" }], Extra: 0 } } },
|
|
152
173
|
live: live({ b: { type: "AWS::S3::Bucket", properties: { Tags: [{ Value: "platform" }], Extra: 1 } } }),
|
|
153
174
|
baseline,
|
|
154
175
|
});
|
|
155
176
|
expect(result.drifted[0].changes.map((c) => c.path)).toEqual(["Extra"]);
|
|
156
177
|
});
|
|
178
|
+
|
|
179
|
+
test("a held field carries its accepted value but never needed one", () => {
|
|
180
|
+
// A baseline recorded before #2160 still names undeclared paths. The value
|
|
181
|
+
// rides along for continuity; the field is quiet either way.
|
|
182
|
+
const result = diffDeep({
|
|
183
|
+
declared: { b: { type: "AWS::S3::Bucket", properties: {} } },
|
|
184
|
+
live: live({ b: { type: "AWS::S3::Bucket", properties: { Tags: [{ Value: "platform" }] } } }),
|
|
185
|
+
baseline,
|
|
186
|
+
});
|
|
187
|
+
expect(result.drifted).toEqual([]);
|
|
188
|
+
expect(result.accepted).toEqual([]);
|
|
189
|
+
expect(result.unclaimed[0].fields[0]).toEqual({
|
|
190
|
+
path: "Tags[0].Value",
|
|
191
|
+
live: "platform",
|
|
192
|
+
source: "claimed-fields",
|
|
193
|
+
baseline: "platform",
|
|
194
|
+
});
|
|
195
|
+
});
|
|
157
196
|
});
|
|
158
197
|
|
|
159
198
|
// #1189 — `kind` says a path is undeclared or changed; `owner` says who did it.
|
|
@@ -252,7 +291,7 @@ describe("diffDeep — declared-side origin (#1443)", () => {
|
|
|
252
291
|
expect(change.origin).toEqual({ kind: "composite", composite: "WebService", instance: "web" });
|
|
253
292
|
});
|
|
254
293
|
|
|
255
|
-
test("
|
|
294
|
+
test("an undeclared path gets no origin because it is not a drift row at all", () => {
|
|
256
295
|
const result = diffDeep({
|
|
257
296
|
declared,
|
|
258
297
|
live: live({
|
|
@@ -265,9 +304,9 @@ describe("diffDeep — declared-side origin (#1443)", () => {
|
|
|
265
304
|
},
|
|
266
305
|
}),
|
|
267
306
|
});
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
expect(
|
|
307
|
+
expect(result.drifted).toEqual([]);
|
|
308
|
+
const held = result.unclaimed[0].fields.find((f) => f.path === "status.observed")!;
|
|
309
|
+
expect(held).toEqual({ path: "status.observed", live: 1, source: "claimed-fields" });
|
|
271
310
|
});
|
|
272
311
|
|
|
273
312
|
test("is absent when the build recorded no path origins", () => {
|
|
@@ -280,3 +319,217 @@ describe("diffDeep — declared-side origin (#1443)", () => {
|
|
|
280
319
|
expect(result.drifted[0].changes[0]).not.toHaveProperty("origin");
|
|
281
320
|
});
|
|
282
321
|
});
|
|
322
|
+
|
|
323
|
+
|
|
324
|
+
// #2160 - the claimed-field set. A live value on a property this declaration
|
|
325
|
+
// never set belongs to whoever wrote it, and chant reports it as theirs rather
|
|
326
|
+
// than proposing to change it.
|
|
327
|
+
describe("diffDeep - the claimed-field set (#2160)", () => {
|
|
328
|
+
const declared: Record<string, DeclaredDeepEntity> = {
|
|
329
|
+
web: { type: "K8s::Apps::Deployment", properties: { spec: { replicas: 2 } } },
|
|
330
|
+
};
|
|
331
|
+
|
|
332
|
+
test("a declared path that differs is still drift, unchanged", () => {
|
|
333
|
+
const result = diffDeep({
|
|
334
|
+
declared,
|
|
335
|
+
live: live({ web: { type: "K8s::Apps::Deployment", properties: { spec: { replicas: 5 } } } }),
|
|
336
|
+
});
|
|
337
|
+
expect(result.drifted[0].changes).toEqual([
|
|
338
|
+
{ path: "spec.replicas", kind: "changed", declared: 2, live: 5 },
|
|
339
|
+
]);
|
|
340
|
+
expect(result.unclaimed).toEqual([]);
|
|
341
|
+
});
|
|
342
|
+
|
|
343
|
+
test("a declared path that matches is neither drift nor held", () => {
|
|
344
|
+
const result = diffDeep({
|
|
345
|
+
declared,
|
|
346
|
+
live: live({ web: { type: "K8s::Apps::Deployment", properties: { spec: { replicas: 2 } } } }),
|
|
347
|
+
});
|
|
348
|
+
expect(result.unchanged).toEqual(["web"]);
|
|
349
|
+
expect(result.unclaimed).toEqual([]);
|
|
350
|
+
});
|
|
351
|
+
|
|
352
|
+
test("the claim answers where the substrate records no manager", () => {
|
|
353
|
+
const result = diffDeep({
|
|
354
|
+
declared,
|
|
355
|
+
live: live({
|
|
356
|
+
web: {
|
|
357
|
+
type: "K8s::Apps::Deployment",
|
|
358
|
+
properties: { spec: { replicas: 2 }, metadata: { labels: { team: "platform" } } },
|
|
359
|
+
},
|
|
360
|
+
}),
|
|
361
|
+
});
|
|
362
|
+
expect(result.unclaimed[0].fields).toEqual([
|
|
363
|
+
{ path: "metadata.labels.team", live: "platform", source: "claimed-fields" },
|
|
364
|
+
]);
|
|
365
|
+
});
|
|
366
|
+
|
|
367
|
+
test("the manager wins over the claim where the substrate names one", () => {
|
|
368
|
+
const result = diffDeep({
|
|
369
|
+
declared,
|
|
370
|
+
live: live({
|
|
371
|
+
web: {
|
|
372
|
+
type: "K8s::Apps::Deployment",
|
|
373
|
+
properties: { spec: { replicas: 2 }, metadata: { labels: { team: "platform" } } },
|
|
374
|
+
fieldOwners: { "metadata.labels.team": "kubectl-edit" },
|
|
375
|
+
},
|
|
376
|
+
}),
|
|
377
|
+
});
|
|
378
|
+
expect(result.unclaimed[0].fields).toEqual([
|
|
379
|
+
{ path: "metadata.labels.team", live: "platform", heldBy: "kubectl-edit", source: "field-manager" },
|
|
380
|
+
]);
|
|
381
|
+
});
|
|
382
|
+
|
|
383
|
+
test("a field manager on a DECLARED path still reports drift and names the manager", () => {
|
|
384
|
+
// The contested case: chant's source asks for 2, an autoscaler holds 5.
|
|
385
|
+
// The claim covers the path, so the disagreement is real drift.
|
|
386
|
+
const result = diffDeep({
|
|
387
|
+
declared,
|
|
388
|
+
live: live({
|
|
389
|
+
web: {
|
|
390
|
+
type: "K8s::Apps::Deployment",
|
|
391
|
+
properties: { spec: { replicas: 5 } },
|
|
392
|
+
fieldOwners: { "spec.replicas": "hpa-controller" },
|
|
393
|
+
},
|
|
394
|
+
}),
|
|
395
|
+
});
|
|
396
|
+
expect(result.unclaimed).toEqual([]);
|
|
397
|
+
expect(result.drifted[0].changes[0]).toMatchObject({ kind: "changed", owner: "hpa-controller" });
|
|
398
|
+
});
|
|
399
|
+
|
|
400
|
+
test("held fields are never counted as drift", () => {
|
|
401
|
+
const result = diffDeep({
|
|
402
|
+
declared,
|
|
403
|
+
live: live({
|
|
404
|
+
web: {
|
|
405
|
+
type: "K8s::Apps::Deployment",
|
|
406
|
+
properties: { spec: { replicas: 5 }, status: { readyReplicas: 5, observedGeneration: 3 } },
|
|
407
|
+
},
|
|
408
|
+
}),
|
|
409
|
+
});
|
|
410
|
+
expect(countPropertyDrift(result)).toBe(1);
|
|
411
|
+
expect(countUnclaimed(result)).toBe(2);
|
|
412
|
+
});
|
|
413
|
+
|
|
414
|
+
test("an unevaluated intrinsic is claimed, so its live value is not unclaimed", () => {
|
|
415
|
+
// chant DID set the field; it just cannot know what the reference resolves
|
|
416
|
+
// to. Treating it as unclaimed would report an interpolated property as
|
|
417
|
+
// somebody else's on every read.
|
|
418
|
+
const result = diffDeep({
|
|
419
|
+
declared: { b: { type: "T", properties: { BucketName: UNRESOLVED } } },
|
|
420
|
+
live: live({ b: { type: "T", properties: { BucketName: "prod-data" } } }),
|
|
421
|
+
});
|
|
422
|
+
expect(result.drifted).toEqual([]);
|
|
423
|
+
expect(result.unclaimed).toEqual([]);
|
|
424
|
+
});
|
|
425
|
+
});
|
|
426
|
+
|
|
427
|
+
// #2162 — a `heldElsewhere()` marker is never drift: a difference on it is
|
|
428
|
+
// reported as held, with its holder and reason, and never as `changed`,
|
|
429
|
+
// `undeclared`, or `absent`. The honest example from the issue: an HPA owns
|
|
430
|
+
// a Deployment's `spec.replicas` after the first apply.
|
|
431
|
+
describe("diffDeep — heldElsewhere() (#2162)", () => {
|
|
432
|
+
test("a live value on a held path is reported as held, not drift", () => {
|
|
433
|
+
const result = diffDeep({
|
|
434
|
+
declared: {
|
|
435
|
+
web: {
|
|
436
|
+
type: "K8s::Apps::Deployment",
|
|
437
|
+
properties: { spec: { replicas: held("hpa", "the autoscaler owns replicas after the first apply") } },
|
|
438
|
+
},
|
|
439
|
+
},
|
|
440
|
+
live: live({ web: { type: "K8s::Apps::Deployment", properties: { spec: { replicas: 5 } } } }),
|
|
441
|
+
});
|
|
442
|
+
expect(result.drifted).toEqual([]);
|
|
443
|
+
expect(countPropertyDrift(result)).toBe(0);
|
|
444
|
+
expect(result.held).toEqual([
|
|
445
|
+
{
|
|
446
|
+
name: "web",
|
|
447
|
+
type: "K8s::Apps::Deployment",
|
|
448
|
+
held: [
|
|
449
|
+
{
|
|
450
|
+
path: "spec.replicas",
|
|
451
|
+
by: "hpa",
|
|
452
|
+
reason: "the autoscaler owns replicas after the first apply",
|
|
453
|
+
live: 5,
|
|
454
|
+
suspicious: false,
|
|
455
|
+
},
|
|
456
|
+
],
|
|
457
|
+
},
|
|
458
|
+
]);
|
|
459
|
+
expect(countHeld(result)).toBe(1);
|
|
460
|
+
// Metadata otherwise matched, so it is unchanged too — held is a
|
|
461
|
+
// separate axis, not a substitute for the drift/unchanged split.
|
|
462
|
+
expect(result.unchanged).toEqual(["web"]);
|
|
463
|
+
});
|
|
464
|
+
|
|
465
|
+
test("no live value at all on a held path is suspicious — the claimed hand-over never showed up", () => {
|
|
466
|
+
const result = diffDeep({
|
|
467
|
+
declared: {
|
|
468
|
+
web: {
|
|
469
|
+
type: "K8s::Apps::Deployment",
|
|
470
|
+
properties: { spec: { replicas: held("hpa", "x") } },
|
|
471
|
+
},
|
|
472
|
+
},
|
|
473
|
+
live: live({ web: { type: "K8s::Apps::Deployment", properties: {} } }),
|
|
474
|
+
});
|
|
475
|
+
expect(result.drifted).toEqual([]);
|
|
476
|
+
expect(result.held[0].held[0]).toEqual({
|
|
477
|
+
path: "spec.replicas",
|
|
478
|
+
by: "hpa",
|
|
479
|
+
reason: "x",
|
|
480
|
+
suspicious: true,
|
|
481
|
+
});
|
|
482
|
+
expect(result.held[0].held[0]).not.toHaveProperty("live");
|
|
483
|
+
expect(suspiciousHeld(result)).toEqual([
|
|
484
|
+
{ name: "web", type: "K8s::Apps::Deployment", path: "spec.replicas", by: "hpa", reason: "x", suspicious: true },
|
|
485
|
+
]);
|
|
486
|
+
});
|
|
487
|
+
|
|
488
|
+
test("carries the field manager that owns the path live, where the substrate records one (#1189)", () => {
|
|
489
|
+
const result = diffDeep({
|
|
490
|
+
declared: {
|
|
491
|
+
web: { type: "K8s::Apps::Deployment", properties: { spec: { replicas: held("hpa", "x") } } },
|
|
492
|
+
},
|
|
493
|
+
live: live({
|
|
494
|
+
web: {
|
|
495
|
+
type: "K8s::Apps::Deployment",
|
|
496
|
+
properties: { spec: { replicas: 5 } },
|
|
497
|
+
fieldOwners: { "spec.replicas": "hpa-controller" },
|
|
498
|
+
},
|
|
499
|
+
}),
|
|
500
|
+
});
|
|
501
|
+
expect(result.held[0].held[0]).toMatchObject({ owner: "hpa-controller" });
|
|
502
|
+
});
|
|
503
|
+
|
|
504
|
+
test("a held property never counts toward property drift, even alongside a genuine drift on another path", () => {
|
|
505
|
+
const result = diffDeep({
|
|
506
|
+
declared: {
|
|
507
|
+
web: {
|
|
508
|
+
type: "K8s::Apps::Deployment",
|
|
509
|
+
properties: { spec: { replicas: held("hpa", "x"), image: "app:1" } },
|
|
510
|
+
},
|
|
511
|
+
},
|
|
512
|
+
live: live({
|
|
513
|
+
web: { type: "K8s::Apps::Deployment", properties: { spec: { replicas: 7, image: "app:2" } } },
|
|
514
|
+
}),
|
|
515
|
+
});
|
|
516
|
+
expect(result.drifted).toEqual([
|
|
517
|
+
{ name: "web", type: "K8s::Apps::Deployment", changes: [{ path: "spec.image", kind: "changed", declared: "app:1", live: "app:2" }] },
|
|
518
|
+
]);
|
|
519
|
+
expect(countPropertyDrift(result)).toBe(1);
|
|
520
|
+
expect(countHeld(result)).toBe(1);
|
|
521
|
+
// A held+drifted entity is not unchanged — the same rule as accepted.
|
|
522
|
+
expect(result.unchanged).toEqual([]);
|
|
523
|
+
});
|
|
524
|
+
|
|
525
|
+
test("suspiciousHeld() reports nothing when the held property never differs from having no baseline to check", () => {
|
|
526
|
+
// A held property whose live value showed up is not suspicious, whatever
|
|
527
|
+
// that value is — chant has no seed to compare it against, so presence
|
|
528
|
+
// alone is the only evidence it can read in one observation.
|
|
529
|
+
const result = diffDeep({
|
|
530
|
+
declared: { web: { type: "T", properties: { A: held("controller", "x") } } },
|
|
531
|
+
live: live({ web: { type: "T", properties: { A: "anything" } } }),
|
|
532
|
+
});
|
|
533
|
+
expect(suspiciousHeld(result)).toEqual([]);
|
|
534
|
+
});
|
|
535
|
+
});
|