@intentius/chant 0.124.13 → 0.124.15
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/bin/chant +11 -0
- package/dist/agents/checks.js +326 -0
- package/dist/agents/discover.js +885 -0
- package/dist/agents/importer.js +17 -0
- package/dist/agents/index.js +12 -0
- package/dist/agents/types.js +19 -0
- package/dist/apply.js +151 -0
- package/dist/attrref.js +70 -0
- package/dist/audit/catalog.js +350 -0
- package/dist/audit/core.js +252 -0
- package/dist/audit/discover.js +633 -0
- package/dist/audit/fetch.js +666 -0
- package/dist/audit/lineage.js +91 -0
- package/dist/audit/nginx.js +366 -0
- package/dist/audit/prior-art.js +132 -0
- package/dist/audit/proof.js +321 -0
- package/dist/audit/report-html.js +194 -0
- package/dist/audit/report-model.js +198 -0
- package/dist/audit/report.js +102 -0
- package/dist/audit/rules-doc.js +144 -0
- package/dist/audit/secrets.js +405 -0
- package/dist/audit/terraform-state.js +140 -0
- package/dist/audit/wrangler.js +262 -0
- package/dist/behaviour-delta.js +401 -0
- package/dist/behaviour-engine.js +357 -0
- package/dist/behaviour-graph.js +83 -0
- package/dist/behaviour-http.js +188 -0
- package/dist/behaviour-kinds.js +172 -0
- package/dist/behaviour-overlay.js +50 -0
- package/dist/behaviour-predict.js +188 -0
- package/dist/behaviour-request.js +194 -0
- package/dist/behaviour.js +1325 -0
- package/dist/build-params.js +108 -0
- package/dist/build.d.ts +6 -0
- package/dist/build.d.ts.map +1 -1
- package/dist/build.js +669 -0
- package/dist/builder.js +44 -0
- package/dist/cdk/advise.js +30 -0
- package/dist/cdk/assembly.js +122 -0
- package/dist/cdk/graph.js +444 -0
- package/dist/cdk/tier-map.js +64 -0
- package/dist/cdk/types.js +24 -0
- package/dist/change-set.d.ts +24 -2
- package/dist/change-set.d.ts.map +1 -1
- package/dist/change-set.js +361 -0
- package/dist/child-project.js +21 -0
- package/dist/ci-jobs.d.ts +227 -0
- package/dist/ci-jobs.d.ts.map +1 -0
- package/dist/ci-jobs.js +448 -0
- package/dist/claimed-fields.js +135 -0
- package/dist/cli/build-options.js +70 -0
- package/dist/cli/build-params-cli.js +139 -0
- package/dist/cli/command-group.js +123 -0
- package/dist/cli/commands/audit-agents.js +326 -0
- package/dist/cli/commands/audit.js +571 -0
- package/dist/cli/commands/build.js +920 -0
- package/dist/cli/commands/carve-apply.js +153 -0
- package/dist/cli/commands/carve-bridge.js +201 -0
- package/dist/cli/commands/carve-emit.js +332 -0
- package/dist/cli/commands/carve-status.js +119 -0
- package/dist/cli/commands/carve.js +204 -0
- package/dist/cli/commands/check-lexicon-docs.js +79 -0
- package/dist/cli/commands/check-lexicon-examples.js +177 -0
- package/dist/cli/commands/check-lexicon-intrinsics.js +291 -0
- package/dist/cli/commands/check-lexicon-mcp.js +82 -0
- package/dist/cli/commands/check-lexicon-plugin.d.ts.map +1 -1
- package/dist/cli/commands/check-lexicon-plugin.js +104 -0
- package/dist/cli/commands/check-lexicon.js +766 -0
- package/dist/cli/commands/describe.js +85 -0
- package/dist/cli/commands/diff.js +175 -0
- package/dist/cli/commands/doctor.js +350 -0
- package/dist/cli/commands/import-agents.js +155 -0
- package/dist/cli/commands/import.js +670 -0
- package/dist/cli/commands/init-lexicon/templates/codegen.js +194 -0
- package/dist/cli/commands/init-lexicon/templates/docs.js +100 -0
- package/dist/cli/commands/init-lexicon/templates/examples.js +29 -0
- package/dist/cli/commands/init-lexicon/templates/lint.js +34 -0
- package/dist/cli/commands/init-lexicon/templates/lsp.js +37 -0
- package/dist/cli/commands/init-lexicon/templates/plugin.js +108 -0
- package/dist/cli/commands/init-lexicon/templates/project.js +240 -0
- package/dist/cli/commands/init-lexicon/templates/spec.js +56 -0
- package/dist/cli/commands/init-lexicon/templates/tests.js +66 -0
- package/dist/cli/commands/init-lexicon.js +172 -0
- package/dist/cli/commands/init.js +381 -0
- package/dist/cli/commands/lexicon-rolling-upgrade.js +145 -0
- package/dist/cli/commands/lexicon-surface-diff.js +145 -0
- package/dist/cli/commands/licenses.js +125 -0
- package/dist/cli/commands/lint.d.ts.map +1 -1
- package/dist/cli/commands/lint.js +948 -0
- package/dist/cli/commands/list.js +63 -0
- package/dist/cli/commands/migrate.d.ts.map +1 -1
- package/dist/cli/commands/migrate.js +423 -0
- package/dist/cli/commands/onboard.js +403 -0
- package/dist/cli/commands/pinned-upgrade.js +191 -0
- package/dist/cli/commands/update.js +194 -0
- package/dist/cli/commands/vendor.js +217 -0
- package/dist/cli/conflict-check.js +104 -0
- package/dist/cli/debug.js +8 -0
- package/dist/cli/format.js +104 -0
- package/dist/cli/handlers/build.js +267 -0
- package/dist/cli/handlers/carve-apply.js +30 -0
- package/dist/cli/handlers/carve-bridge.js +28 -0
- package/dist/cli/handlers/carve-emit.js +50 -0
- package/dist/cli/handlers/carve-status.js +26 -0
- package/dist/cli/handlers/carve.js +40 -0
- package/dist/cli/handlers/change-set.js +46 -0
- package/dist/cli/handlers/components.js +730 -0
- package/dist/cli/handlers/dev.js +113 -0
- package/dist/cli/handlers/emulator.js +233 -0
- package/dist/cli/handlers/explain.js +54 -0
- package/dist/cli/handlers/fan-out.js +422 -0
- package/dist/cli/handlers/gate-resume.js +275 -0
- package/dist/cli/handlers/generate.js +84 -0
- package/dist/cli/handlers/graph.js +969 -0
- package/dist/cli/handlers/init.js +102 -0
- package/dist/cli/handlers/lifecycle.js +1727 -0
- package/dist/cli/handlers/lint.js +62 -0
- package/dist/cli/handlers/migrate.js +48 -0
- package/dist/cli/handlers/misc.js +391 -0
- package/dist/cli/handlers/operator.js +1162 -0
- package/dist/cli/handlers/override-approve.js +102 -0
- package/dist/cli/handlers/pr.js +503 -0
- package/dist/cli/handlers/promote.js +342 -0
- package/dist/cli/handlers/run-generate.js +206 -0
- package/dist/cli/handlers/run-wave.js +66 -0
- package/dist/cli/handlers/run.js +1191 -0
- package/dist/cli/handlers/scenario.js +325 -0
- package/dist/cli/handlers/search.js +924 -0
- package/dist/cli/handlers/serve.js +32 -0
- package/dist/cli/handlers/vendor.js +154 -0
- package/dist/cli/index.js +3 -0
- package/dist/cli/is-entry-point.js +23 -0
- package/dist/cli/lsp/capabilities.js +28 -0
- package/dist/cli/lsp/diagnostics.js +34 -0
- package/dist/cli/lsp/server.js +329 -0
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +2540 -0
- package/dist/cli/mcp/lifecycle-tools.js +80 -0
- package/dist/cli/mcp/op-tools.js +306 -0
- package/dist/cli/mcp/resource-handlers.js +258 -0
- package/dist/cli/mcp/resources/context.js +85 -0
- package/dist/cli/mcp/server.js +353 -0
- package/dist/cli/mcp/tools/build.js +111 -0
- package/dist/cli/mcp/tools/composites.js +95 -0
- package/dist/cli/mcp/tools/explain.js +166 -0
- package/dist/cli/mcp/tools/import.js +49 -0
- package/dist/cli/mcp/tools/lint.js +41 -0
- package/dist/cli/mcp/tools/scaffold.js +111 -0
- package/dist/cli/mcp/tools/search.js +112 -0
- package/dist/cli/mcp/types.js +1 -0
- package/dist/cli/mcp/workspace-plugins.js +91 -0
- package/dist/cli/mcp/workspace-tools.d.ts +1 -1
- package/dist/cli/mcp/workspace-tools.js +564 -0
- package/dist/cli/mcp-config.js +70 -0
- package/dist/cli/plugins.js +313 -0
- package/dist/cli/registry.js +23 -0
- package/dist/cli/reporters/stylish.js +329 -0
- package/dist/cli/version.js +15 -0
- package/dist/cli/watch.js +79 -0
- package/dist/codegen/bound-property-types.js +82 -0
- package/dist/codegen/coverage.js +119 -0
- package/dist/codegen/docs-file-markers.js +60 -0
- package/dist/codegen/docs-pages.js +115 -0
- package/dist/codegen/docs-rule-scanning.js +164 -0
- package/dist/codegen/docs-rules.js +76 -0
- package/dist/codegen/docs-sections.js +117 -0
- package/dist/codegen/docs-sidebar.js +65 -0
- package/dist/codegen/docs-types.js +4 -0
- package/dist/codegen/docs.js +356 -0
- package/dist/codegen/fetch.js +340 -0
- package/dist/codegen/generate-post-synth-barrel.js +63 -0
- package/dist/codegen/generate-registry.js +71 -0
- package/dist/codegen/generate-runtime-index.js +56 -0
- package/dist/codegen/generate-typescript.js +119 -0
- package/dist/codegen/generate.js +115 -0
- package/dist/codegen/json-patch.js +141 -0
- package/dist/codegen/json-schema-to-ts.js +344 -0
- package/dist/codegen/json-schema.js +246 -0
- package/dist/codegen/lexicon-regen.js +412 -0
- package/dist/codegen/naming.js +217 -0
- package/dist/codegen/okf-lexicon.js +245 -0
- package/dist/codegen/package.js +150 -0
- package/dist/codegen/pinned-upgrade.d.ts.map +1 -1
- package/dist/codegen/pinned-upgrade.js +494 -0
- package/dist/codegen/registry.js +60 -0
- package/dist/codegen/rehype-base-url.mjs +68 -0
- package/dist/codegen/rolling-upgrade.js +217 -0
- package/dist/codegen/surface-snapshot.js +537 -0
- package/dist/codegen/testdata/postgres-tags.json +242 -0
- package/dist/codegen/topo-sort.js +36 -0
- package/dist/codegen/typecheck.js +115 -0
- package/dist/codegen/validate.js +200 -0
- package/dist/codegen/version-bump.js +35 -0
- package/dist/components/auto-release.js +143 -0
- package/dist/components/builders.js +47 -0
- package/dist/components/capability-plugin-loader.js +175 -0
- package/dist/components/capability-plugin-schema.js +46 -0
- package/dist/components/capability-plugin.js +99 -0
- package/dist/components/capability.js +60 -0
- package/dist/components/changed-files.js +72 -0
- package/dist/components/cli-support.js +427 -0
- package/dist/components/component.js +120 -0
- package/dist/components/component.schema.json +271 -0
- package/dist/components/config-defaults.js +130 -0
- package/dist/components/deploy-units.js +60 -0
- package/dist/components/discover.d.ts.map +1 -1
- package/dist/components/discover.js +189 -0
- package/dist/components/driver-output.js +86 -0
- package/dist/components/driver.js +728 -0
- package/dist/components/fan-out-output.js +165 -0
- package/dist/components/fan-out-record.js +94 -0
- package/dist/components/fan-out-run.js +373 -0
- package/dist/components/fan-out-support.js +60 -0
- package/dist/components/fan-out.js +273 -0
- package/dist/components/gate-plan.js +41 -0
- package/dist/components/gated-wave-pipeline.js +46 -0
- package/dist/components/index.js +24 -0
- package/dist/components/layers.js +28 -0
- package/dist/components/manifest-persistence.js +108 -0
- package/dist/components/pilots/alb-ecs.pilot.js +59 -0
- package/dist/components/pilots/dynamodb.pilot.js +51 -0
- package/dist/components/pilots/jar-emr.pilot.js +65 -0
- package/dist/components/pilots/lambda.pilot.js +52 -0
- package/dist/components/pilots/neo4j-fanout.pilot.js +68 -0
- package/dist/components/pilots/project.js +12 -0
- package/dist/components/pr-pipeline.d.ts.map +1 -1
- package/dist/components/pr-pipeline.js +135 -0
- package/dist/components/pr-run.js +363 -0
- package/dist/components/presets/ecs-fargate.js +72 -0
- package/dist/components/presets/index.js +28 -0
- package/dist/components/presets/lambda.js +34 -0
- package/dist/components/presets/single-host-compose.js +41 -0
- package/dist/components/promote.js +549 -0
- package/dist/components/registry.js +34 -0
- package/dist/components/run-progress.js +33 -0
- package/dist/components/sandbox/driver.d.ts.map +1 -1
- package/dist/components/sandbox/driver.js +93 -0
- package/dist/components/sandbox/run.js +115 -0
- package/dist/components/starter-plugin.js +104 -0
- package/dist/components/verbs/__tests__/mock-cloud-executor.js +68 -0
- package/dist/components/verbs/__tests__/mock-process-runner.js +45 -0
- package/dist/components/verbs/__tests__/mock-sbom-generator.js +56 -0
- package/dist/components/verbs/bom-writer.js +287 -0
- package/dist/components/verbs/build-archive.js +188 -0
- package/dist/components/verbs/build.js +142 -0
- package/dist/components/verbs/cloud-executor.js +110 -0
- package/dist/components/verbs/component-bom.js +125 -0
- package/dist/components/verbs/ensure-secret.js +50 -0
- package/dist/components/verbs/index.js +61 -0
- package/dist/components/verbs/license-policy.js +75 -0
- package/dist/components/verbs/lockfile-sbom-generator.js +191 -0
- package/dist/components/verbs/process-runner.js +78 -0
- package/dist/components/verbs/r2-sync.js +93 -0
- package/dist/components/verbs/reproducibility.js +62 -0
- package/dist/components/verbs/run-agent.js +577 -0
- package/dist/components/verbs/sbom-generator.js +119 -0
- package/dist/components/verbs/sbom.js +97 -0
- package/dist/components/verbs/shell.js +32 -0
- package/dist/components/verbs/sign.js +221 -0
- package/dist/components/verbs/stub.js +28 -0
- package/dist/components/verbs/tool-sbom-generator.js +154 -0
- package/dist/components/verbs/verify.js +112 -0
- package/dist/components/verbs/vex.js +131 -0
- package/dist/components/verbs/vuln-gate.js +152 -0
- package/dist/components/verbs/vuln-scan.js +288 -0
- package/dist/components/verbs/wait-verify.js +106 -0
- package/dist/components/verbs/wrangler.js +179 -0
- package/dist/components/wave-plan.js +102 -0
- package/dist/composite.d.ts +10 -2
- package/dist/composite.d.ts.map +1 -1
- package/dist/composite.js +313 -0
- package/dist/config-import.d.ts.map +1 -1
- package/dist/config-import.js +22 -0
- package/dist/config-sandbox.js +122 -0
- package/dist/config-static.js +206 -0
- package/dist/config.js +605 -0
- package/dist/content-digest.js +23 -0
- package/dist/declarable.js +114 -0
- package/dist/deep-observation.js +437 -0
- package/dist/detectLexicon.js +54 -0
- package/dist/discovery/cache.js +70 -0
- package/dist/discovery/collect.d.ts +2 -1
- package/dist/discovery/collect.d.ts.map +1 -1
- package/dist/discovery/collect.js +223 -0
- package/dist/discovery/cycles.js +95 -0
- package/dist/discovery/entity-wire-codec.js +391 -0
- package/dist/discovery/entity-wire.js +42 -0
- package/dist/discovery/files.js +121 -0
- package/dist/discovery/fold-import.d.ts.map +1 -1
- package/dist/discovery/fold-import.js +4073 -0
- package/dist/discovery/fold-rank.js +292 -0
- package/dist/discovery/graph.js +115 -0
- package/dist/discovery/host-composite.d.ts +35 -0
- package/dist/discovery/host-composite.d.ts.map +1 -0
- package/dist/discovery/host-composite.js +93 -0
- package/dist/discovery/import.d.ts.map +1 -1
- package/dist/discovery/import.js +65 -0
- package/dist/discovery/index.d.ts +9 -0
- package/dist/discovery/index.d.ts.map +1 -1
- package/dist/discovery/index.js +333 -0
- package/dist/discovery/param-deps.js +487 -0
- package/dist/discovery/resolve.js +39 -0
- package/dist/discovery/sandbox/bundle.js +214 -0
- package/dist/discovery/sandbox/child-errors.js +26 -0
- package/dist/discovery/sandbox/config-run.js +100 -0
- package/dist/discovery/sandbox/config-wire.js +183 -0
- package/dist/discovery/sandbox/driver.d.ts.map +1 -1
- package/dist/discovery/sandbox/driver.js +333 -0
- package/dist/discovery/sandbox/fork.js +229 -0
- package/dist/discovery/sandbox/policy-run.js +142 -0
- package/dist/discovery/sandbox/policy-wire.js +152 -0
- package/dist/discovery/sandbox/run.js +77 -0
- package/dist/discovery/specifier-resolve.js +320 -0
- package/dist/discovery/walk.js +284 -0
- package/dist/effect-receipt.js +340 -0
- package/dist/env.js +55 -0
- package/dist/errors.js +62 -0
- package/dist/fold/fold.js +1434 -0
- package/dist/fold/foldable-helpers.js +229 -0
- package/dist/fold/subset.js +696 -0
- package/dist/fold-provenance.js +414 -0
- package/dist/gate-decision.d.ts +20 -9
- package/dist/gate-decision.d.ts.map +1 -1
- package/dist/gate-decision.js +313 -0
- package/dist/gate-resume-run.js +154 -0
- package/dist/gated-waves.js +165 -0
- package/dist/governance.js +43 -0
- package/dist/graph-declared.js +45 -0
- package/dist/graph-detail.js +207 -0
- package/dist/graph-dot.js +54 -0
- package/dist/graph-effective.js +107 -0
- package/dist/graph-ir.js +623 -0
- package/dist/graph-layout.js +184 -0
- package/dist/graph-lens.js +105 -0
- package/dist/graph-mermaid.js +83 -0
- package/dist/graph-ops.js +39 -0
- package/dist/graph-refs.js +156 -0
- package/dist/held-elsewhere.js +87 -0
- package/dist/identity.js +251 -0
- package/dist/import/base-parser.js +34 -0
- package/dist/import/embedded.js +255 -0
- package/dist/import/generator.js +1 -0
- package/dist/import/ir-utils.js +85 -0
- package/dist/import/parser-options.js +45 -0
- package/dist/import/parser.js +1 -0
- package/dist/index.js +118 -0
- package/dist/intrinsic-interpolation.js +73 -0
- package/dist/intrinsic.js +31 -0
- package/dist/join-key.js +35 -0
- package/dist/kubectl-context.js +150 -0
- package/dist/lexicon-config.js +58 -0
- package/dist/lexicon-integrity.js +47 -0
- package/dist/lexicon-manifest.js +70 -0
- package/dist/lexicon-module.d.ts.map +1 -1
- package/dist/lexicon-module.js +241 -0
- package/dist/lexicon-output.js +218 -0
- package/dist/lexicon-plugin-helpers.js +104 -0
- package/dist/lexicon-schema.js +136 -0
- package/dist/lexicon.js +130 -0
- package/dist/lifecycle/affected.js +224 -0
- package/dist/lifecycle/assert-live.js +110 -0
- package/dist/lifecycle/build-ledger-store.js +160 -0
- package/dist/lifecycle/build-ledger.js +155 -0
- package/dist/lifecycle/change-set.js +356 -0
- package/dist/lifecycle/converge-ledger.js +161 -0
- package/dist/lifecycle/deep-diff.js +233 -0
- package/dist/lifecycle/deep-observe.js +147 -0
- package/dist/lifecycle/digest.js +143 -0
- package/dist/lifecycle/disruption.js +135 -0
- package/dist/lifecycle/gate-applied.js +113 -0
- package/dist/lifecycle/gate-audit.d.ts +69 -2
- package/dist/lifecycle/gate-audit.d.ts.map +1 -1
- package/dist/lifecycle/gate-audit.js +415 -0
- package/dist/lifecycle/gate-ledger-select.js +89 -0
- package/dist/lifecycle/gate-ledger.d.ts +24 -0
- package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
- package/dist/lifecycle/gate-ledger.js +201 -0
- package/dist/lifecycle/gate-origin.js +117 -0
- package/dist/lifecycle/gate-pending.js +58 -0
- package/dist/lifecycle/git.js +1182 -0
- package/dist/lifecycle/identity.js +58 -0
- package/dist/lifecycle/index.js +26 -0
- package/dist/lifecycle/lease.js +283 -0
- package/dist/lifecycle/ledger-port.js +1 -0
- package/dist/lifecycle/legacy-digest.js +91 -0
- package/dist/lifecycle/live-diff.js +274 -0
- package/dist/lifecycle/local-note.js +15 -0
- package/dist/lifecycle/member-ledger.js +122 -0
- package/dist/lifecycle/observation-baseline.js +155 -0
- package/dist/lifecycle/observe.js +375 -0
- package/dist/lifecycle/oras-referrer-lookup.js +82 -0
- package/dist/lifecycle/override-ledger.js +54 -0
- package/dist/lifecycle/plan-digest.js +110 -0
- package/dist/lifecycle/plan-ledger.js +129 -0
- package/dist/lifecycle/receipt-plan.js +192 -0
- package/dist/lifecycle/release-ledger.js +155 -0
- package/dist/lifecycle/release-read.js +64 -0
- package/dist/lifecycle/replay.js +193 -0
- package/dist/lifecycle/rollback.js +102 -0
- package/dist/lifecycle/run-ledger.js +183 -0
- package/dist/lifecycle/scenario-eval.js +204 -0
- package/dist/lifecycle/scenario.js +214 -0
- package/dist/lifecycle/snapshot.js +239 -0
- package/dist/lifecycle/status.js +447 -0
- package/dist/lifecycle/symptoms.js +117 -0
- package/dist/lifecycle/teardown.js +255 -0
- package/dist/lifecycle/types.js +1 -0
- package/dist/lifecycle/unobserved-gate.js +33 -0
- package/dist/lifecycle/wave-plans.js +68 -0
- package/dist/lifecycle/work-item-id.js +36 -0
- package/dist/lifecycle/work-lease.js +393 -0
- package/dist/lint/component-checks.js +87 -0
- package/dist/lint/config.js +483 -0
- package/dist/lint/declarative.js +122 -0
- package/dist/lint/discover.d.ts.map +1 -1
- package/dist/lint/discover.js +138 -0
- package/dist/lint/engine.js +246 -0
- package/dist/lint/knowledge-checks.js +64 -0
- package/dist/lint/named-checks.js +22 -0
- package/dist/lint/output-checks.js +87 -0
- package/dist/lint/output-docs.js +163 -0
- package/dist/lint/parser.js +33 -0
- package/dist/lint/pipeline-change-gate.js +70 -0
- package/dist/lint/policy-import.d.ts +1 -1
- package/dist/lint/policy-import.d.ts.map +1 -1
- package/dist/lint/policy-import.js +62 -0
- package/dist/lint/policy-sandbox.js +86 -0
- package/dist/lint/policy.js +122 -0
- package/dist/lint/post-synth.js +87 -0
- package/dist/lint/presets/relaxed.json +26 -0
- package/dist/lint/presets/strict.json +24 -24
- package/dist/lint/receipt-checks.js +83 -0
- package/dist/lint/rule-loader.d.ts.map +1 -1
- package/dist/lint/rule-loader.js +89 -0
- package/dist/lint/rule-registry.js +86 -0
- package/dist/lint/rule.js +1 -0
- package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-a.component.js +7 -0
- package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-b.component.js +7 -0
- package/dist/lint/rules/__fixtures__/comp/comp001/fail/orphan-lib.component.js +9 -0
- package/dist/lint/rules/__fixtures__/comp/comp001/pass/emr-job.component.js +11 -0
- package/dist/lint/rules/__fixtures__/comp/comp001/pass/jar-lib.component.js +9 -0
- package/dist/lint/rules/__fixtures__/comp/comp002/fail/search-service.component.js +25 -0
- package/dist/lint/rules/__fixtures__/comp/comp002/pass/jar-lib.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp002/pass/search-service.component.js +21 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/fail/migrator.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/pass/agent-turn.component.js +24 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/pass/migrator.component.js +17 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/pass/orders-table.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp004/fail/neo4j-cluster.component.js +18 -0
- package/dist/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.js +20 -0
- package/dist/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp005/fail/search-service.component.js +12 -0
- package/dist/lint/rules/__fixtures__/comp/comp005/pass/search-service.component.js +16 -0
- package/dist/lint/rules/__fixtures__/comp/comp006/fail/legacy-tool.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp006/pass/legacy-tool.component.js +12 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/fail/inventory-table.component.js +11 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/fail/orders-table.component.js +11 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/pass/orders-table.component.js +10 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/pass/search-service.component.js +16 -0
- package/dist/lint/rules/comp/comp001-publishes-never-applies.js +69 -0
- package/dist/lint/rules/comp/comp002-dangling-wiring-ref.js +84 -0
- package/dist/lint/rules/comp/comp003-mutating-no-rollback.js +103 -0
- package/dist/lint/rules/comp/comp004-gate-needs-durable-runtime.js +70 -0
- package/dist/lint/rules/comp/comp005-capability-kind-is-noun.js +109 -0
- package/dist/lint/rules/comp/comp006-shell-needs-reason.js +49 -0
- package/dist/lint/rules/comp/comp007-composition-sprawl.js +64 -0
- package/dist/lint/rules/comp/index.js +33 -0
- package/dist/lint/rules/comp/support.js +129 -0
- package/dist/lint/rules/composite-scope.js +51 -0
- package/dist/lint/rules/cor017-composite-name-match.js +93 -0
- package/dist/lint/rules/cor018-composite-prefer-lexicon-type.js +136 -0
- package/dist/lint/rules/cor021-env-literal-name.js +100 -0
- package/dist/lint/rules/cor022-receipt-leaf.js +118 -0
- package/dist/lint/rules/cor024-receipt-secret-pointer.js +199 -0
- package/dist/lint/rules/declarable-naming-convention.js +62 -0
- package/dist/lint/rules/evl001-non-literal-expression.js +66 -0
- package/dist/lint/rules/evl002-control-flow-resource.js +69 -0
- package/dist/lint/rules/evl003-dynamic-property-access.js +44 -0
- package/dist/lint/rules/evl004-spread-non-const.js +94 -0
- package/dist/lint/rules/evl005-resource-block-body.js +41 -0
- package/dist/lint/rules/evl007-invalid-siblings.js +105 -0
- package/dist/lint/rules/evl009-composite-no-constant.js +158 -0
- package/dist/lint/rules/evl010-composite-no-transform.js +59 -0
- package/dist/lint/rules/evl011-symbolic-in-template.js +106 -0
- package/dist/lint/rules/export-required.js +115 -0
- package/dist/lint/rules/file-declarable-limit.js +88 -0
- package/dist/lint/rules/flat-declarations.js +62 -0
- package/dist/lint/rules/index.js +90 -0
- package/dist/lint/rules/no-cyclic-declarable-ref.js +138 -0
- package/dist/lint/rules/no-redundant-type-import.js +76 -0
- package/dist/lint/rules/no-redundant-value-cast.js +41 -0
- package/dist/lint/rules/no-string-ref.js +59 -0
- package/dist/lint/rules/no-unused-declarable-import.js +75 -0
- package/dist/lint/rules/no-unused-declarable.js +142 -0
- package/dist/lint/rules/op/index.js +28 -0
- package/dist/lint/rules/op/ops012-activity-contract.js +54 -0
- package/dist/lint/rules/op/ops013-step-output-ref.js +88 -0
- package/dist/lint/rules/op/ops014-converge-rule-refusals.js +114 -0
- package/dist/lint/rules/op/ops015-gate-approval.js +45 -0
- package/dist/lint/rules/op/support.js +11 -0
- package/dist/lint/rules/op/sys010-key-over-plain-http.js +100 -0
- package/dist/lint/rules/property-kind.js +56 -0
- package/dist/lint/rules/single-concern-file.js +71 -0
- package/dist/lint/rules/sys001-no-literal-key.js +60 -0
- package/dist/lint/selectors.js +168 -0
- package/dist/lint/suppressions.js +129 -0
- package/dist/lint/typescript.js +17 -0
- package/dist/live-endpoint.js +113 -0
- package/dist/live-read-session.js +76 -0
- package/dist/lsp/lexicon-providers.js +163 -0
- package/dist/lsp/types.js +5 -0
- package/dist/managed-fields.js +293 -0
- package/dist/mcp/types.js +4 -0
- package/dist/notify-verify.js +0 -1
- package/dist/notify.js +0 -1
- package/dist/notify.schema.json +72 -0
- package/dist/observation.js +266 -0
- package/dist/okf-read.js +134 -0
- package/dist/okf.js +275 -0
- package/dist/op/__fixtures__/decide-stub-backend.js +125 -0
- package/dist/op/activities/activity-contracts.d.ts +1 -1
- package/dist/op/activities/activity-contracts.js +313 -0
- package/dist/op/activities/apply.js +582 -0
- package/dist/op/activities/build.js +18 -0
- package/dist/op/activities/change-coverage.js +40 -0
- package/dist/op/activities/change-set.d.ts +8 -3
- package/dist/op/activities/change-set.d.ts.map +1 -1
- package/dist/op/activities/change-set.js +67 -0
- package/dist/op/activities/converge.js +492 -0
- package/dist/op/activities/decide.js +211 -0
- package/dist/op/activities/env-teardown.js +110 -0
- package/dist/op/activities/factory.js +591 -0
- package/dist/op/activities/forge-pull-request.js +82 -0
- package/dist/op/activities/gh-host.js +78 -0
- package/dist/op/activities/guard-validate.js +165 -0
- package/dist/op/activities/http-check.js +40 -0
- package/dist/op/activities/index.js +59 -0
- package/dist/op/activities/lexicon-upgrade.js +629 -0
- package/dist/op/activities/lifecycle.js +109 -0
- package/dist/op/activities/pipeline-audit.js +147 -0
- package/dist/op/activities/policy.js +26 -0
- package/dist/op/activities/predict-behaviour.js +341 -0
- package/dist/op/activities/propose-upgrade.js +165 -0
- package/dist/op/activities/reconcile.d.ts +28 -16
- package/dist/op/activities/reconcile.d.ts.map +1 -1
- package/dist/op/activities/reconcile.js +1011 -0
- package/dist/op/activities/shell.js +118 -0
- package/dist/op/activities/source-release.js +97 -0
- package/dist/op/activities/source-rollback.js +165 -0
- package/dist/op/activities/teardown.js +17 -0
- package/dist/op/activities/util.js +6 -0
- package/dist/op/activities/wait.js +51 -0
- package/dist/op/activities/work-evidence.js +35 -0
- package/dist/op/activities/workflow-audit.js +133 -0
- package/dist/op/activity-contract-registry.js +106 -0
- package/dist/op/activity-contract.js +232 -0
- package/dist/op/activity-failure.js +31 -0
- package/dist/op/activity-profiles.js +129 -0
- package/dist/op/activity-registry.js +105 -0
- package/dist/op/activity-runtime.js +28 -0
- package/dist/op/builders.d.ts +1 -1
- package/dist/op/builders.d.ts.map +1 -1
- package/dist/op/builders.js +801 -0
- package/dist/op/change-signal.js +118 -0
- package/dist/op/composites/apply-op.js +151 -0
- package/dist/op/composites/behaviour-op.js +65 -0
- package/dist/op/composites/converge-op.js +141 -0
- package/dist/op/composites/index.js +19 -0
- package/dist/op/composites/lexicon-upgrade-op.js +107 -0
- package/dist/op/composites/pipeline-audit-op.js +50 -0
- package/dist/op/composites/reconcile-op.js +84 -0
- package/dist/op/composites/watch-op.js +69 -0
- package/dist/op/composites/workflow-audit-op.js +57 -0
- package/dist/op/converge-rule.js +205 -0
- package/dist/op/cron.js +146 -0
- package/dist/op/decide-backend.js +181 -0
- package/dist/op/decide-config.js +68 -0
- package/dist/op/decide-read-inputs.js +141 -0
- package/dist/op/discover.d.ts.map +1 -1
- package/dist/op/discover.js +213 -0
- package/dist/op/duration.js +21 -0
- package/dist/op/emulator-freshness.js +80 -0
- package/dist/op/emulator-lifecycle.js +269 -0
- package/dist/op/factory.js +83 -0
- package/dist/op/gate-approval.js +172 -0
- package/dist/op/gate-name.js +86 -0
- package/dist/op/gate-plan-context.js +167 -0
- package/dist/op/gate-point-run.js +67 -0
- package/dist/op/gate-point.js +111 -0
- package/dist/op/gate-resume-plan.js +155 -0
- package/dist/op/gate-resume.js +31 -0
- package/dist/op/gate-review.js +290 -0
- package/dist/op/gate-run-locator.js +85 -0
- package/dist/op/gate-summary.js +100 -0
- package/dist/op/gate-wait.js +56 -0
- package/dist/op/gate.js +449 -0
- package/dist/op/generate-pipeline.js +124 -0
- package/dist/op/index.js +51 -0
- package/dist/op/lifecycle-receipt-store.js +45 -0
- package/dist/op/local-executor.js +1164 -0
- package/dist/op/local-output.js +140 -0
- package/dist/op/op-ir.js +317 -0
- package/dist/op/op-verb-class.js +131 -0
- package/dist/op/op-waves-notify.js +136 -0
- package/dist/op/op-waves-run.d.ts +1 -1
- package/dist/op/op-waves-run.d.ts.map +1 -1
- package/dist/op/op-waves-run.js +1657 -0
- package/dist/op/op-waves.js +409 -0
- package/dist/op/operator.js +743 -0
- package/dist/op/receipt-store.js +94 -0
- package/dist/op/resource.js +23 -0
- package/dist/op/run-context.js +28 -0
- package/dist/op/run-live.js +256 -0
- package/dist/op/runtime.js +21 -0
- package/dist/op/runtimes/local.js +195 -0
- package/dist/op/source-archive.js +131 -0
- package/dist/op/step-output-ref.js +397 -0
- package/dist/op/steward-beside.js +169 -0
- package/dist/op/steward-points.js +138 -0
- package/dist/op/steward-turn.js +59 -0
- package/dist/op/steward.js +317 -0
- package/dist/op/types.js +25 -0
- package/dist/op/work-lease-decl.js +81 -0
- package/dist/op/work-lease-run.js +393 -0
- package/dist/override-gate.js +284 -0
- package/dist/owner-chain.js +74 -0
- package/dist/ownership.js +92 -0
- package/dist/params.js +61 -0
- package/dist/plan-summary.js +711 -0
- package/dist/point-decision.js +211 -0
- package/dist/pr-forge.js +810 -0
- package/dist/pr-loop.js +203 -0
- package/dist/project-codegen.js +191 -0
- package/dist/project-root.js +74 -0
- package/dist/project-validation.js +50 -0
- package/dist/provenance.js +157 -0
- package/dist/pseudo-parameter.js +40 -0
- package/dist/reconcile.js +450 -0
- package/dist/resource-attributes.js +33 -0
- package/dist/runtime-adapter.js +77 -0
- package/dist/runtime.js +66 -0
- package/dist/secret-materialization.js +153 -0
- package/dist/secret-provenance.js +250 -0
- package/dist/serializer-walker.js +112 -0
- package/dist/serializer.js +1 -0
- package/dist/sort.js +45 -0
- package/dist/stack-output.js +115 -0
- package/dist/telemetry-attribution.js +149 -0
- package/dist/terraform/__fixtures__/build-graph.js +63 -0
- package/dist/terraform/adopt-state.js +40 -0
- package/dist/terraform/aws-resources.js +384 -0
- package/dist/terraform/bridge.js +204 -0
- package/dist/terraform/carve-provider.js +155 -0
- package/dist/terraform/carve.js +138 -0
- package/dist/terraform/data-source-shape.js +57 -0
- package/dist/terraform/emit-source.js +36 -0
- package/dist/terraform/excise.js +123 -0
- package/dist/terraform/graduate.js +128 -0
- package/dist/terraform/graph.js +435 -0
- package/dist/terraform/hcl2json.js +60 -0
- package/dist/terraform/manifest.js +149 -0
- package/dist/terraform/parse.js +81 -0
- package/dist/terraform/providers/aws.js +146 -0
- package/dist/terraform/providers/gcp.js +294 -0
- package/dist/terraform/providers/index.js +17 -0
- package/dist/terraform/providers/kubernetes.js +253 -0
- package/dist/terraform/score.js +151 -0
- package/dist/terraform/state.js +67 -0
- package/dist/terraform/tier-map.js +74 -0
- package/dist/terraform/types.js +13 -0
- package/dist/terraform/unified-diff.js +132 -0
- package/dist/testing.js +295 -0
- package/dist/toml-emit.js +153 -0
- package/dist/toml-parse.js +355 -0
- package/dist/toml-utils.js +60 -0
- package/dist/toml.js +428 -0
- package/dist/ts-loader.d.ts +46 -0
- package/dist/ts-loader.d.ts.map +1 -0
- package/dist/ts-loader.js +103 -0
- package/dist/types.js +1 -0
- package/dist/utils.js +61 -0
- package/dist/validation.js +20 -0
- package/dist/vendor/js-yaml-load.js +1662 -0
- package/dist/workspace/__fixtures__/contract-repo.d.ts +7 -0
- package/dist/workspace/__fixtures__/contract-repo.d.ts.map +1 -1
- package/dist/workspace/__fixtures__/contract-repo.js +119 -0
- package/dist/workspace/__fixtures__/decide-workspace.js +112 -0
- package/dist/workspace/__fixtures__/sessions.d.ts +1 -1
- package/dist/workspace/__fixtures__/sessions.d.ts.map +1 -1
- package/dist/workspace/__fixtures__/sessions.js +91 -0
- package/dist/workspace/__fixtures__/two-member-workspace.js +34 -0
- package/dist/workspace/agent-cli.js +99 -0
- package/dist/workspace/agent.schema.json +390 -0
- package/dist/workspace/answers-ledger.js +89 -0
- package/dist/workspace/box-cli.js +142 -0
- package/dist/workspace/box-factory-write.js +196 -0
- package/dist/workspace/box-factory-write.schema.json +342 -0
- package/dist/workspace/box-factory.js +88 -0
- package/dist/workspace/box-intent.js +126 -0
- package/dist/workspace/box-isolation.js +169 -0
- package/dist/workspace/box-listing-write.schema.json +204 -0
- package/dist/workspace/box-listing.js +298 -0
- package/dist/workspace/box-publish.js +352 -0
- package/dist/workspace/box-publish.schema.json +498 -0
- package/dist/workspace/box-services.js +39 -0
- package/dist/workspace/broker-protocol.js +359 -0
- package/dist/workspace/broker-protocol.schema.json +228 -0
- package/dist/workspace/change-set.schema.json +462 -0
- package/dist/workspace/changes-cli.js +56 -0
- package/dist/workspace/changes.js +446 -0
- package/dist/workspace/changes.schema.json +642 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-fly-site.js +198 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-live-names.js +155 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-rollback.js +214 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-ship-inputs.js +180 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-ship-policy.js +99 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit.js +847 -0
- package/dist/workspace/chant-migrations.js +113 -0
- package/dist/workspace/check.schema.json +433 -0
- package/dist/workspace/checks/box-isolation.js +62 -0
- package/dist/workspace/checks/boxes.js +491 -0
- package/dist/workspace/checks/diagrams.js +104 -0
- package/dist/workspace/checks/generated.js +419 -0
- package/dist/workspace/checks/ledgers.js +212 -0
- package/dist/workspace/checks/links.js +191 -0
- package/dist/workspace/checks/live.js +100 -0
- package/dist/workspace/checks/pipelines.js +188 -0
- package/dist/workspace/checks/records.js +169 -0
- package/dist/workspace/checks.js +426 -0
- package/dist/workspace/ci-green-cli.js +125 -0
- package/dist/workspace/ci-green-forge.js +83 -0
- package/dist/workspace/ci-green-workflow.d.ts +3 -1
- package/dist/workspace/ci-green-workflow.d.ts.map +1 -1
- package/dist/workspace/ci-green-workflow.js +202 -0
- package/dist/workspace/ci-green.js +325 -0
- package/dist/workspace/ci-last-green.schema.json +158 -0
- package/dist/workspace/class-data.d.ts +84 -0
- package/dist/workspace/class-data.d.ts.map +1 -0
- package/dist/workspace/class-data.js +238 -0
- package/dist/workspace/compose-graph.js +235 -0
- package/dist/workspace/compose-reports.js +146 -0
- package/dist/workspace/composites.js +264 -0
- package/dist/workspace/composites.schema.json +617 -0
- package/dist/workspace/conformance/__fixture__/app/package.json +7 -0
- package/dist/workspace/conformance/__fixture__/app/src/server.mjs +29 -0
- package/dist/workspace/conformance/__fixture__/decisions/decision.kind.mjs +54 -0
- package/dist/workspace/conformance/__fixture__/decisions/decision.schema.json +512 -0
- package/dist/workspace/conformance/__fixture__/decisions/fix-001-how-the-app-is-deployed.md +40 -0
- package/dist/workspace/conformance/__fixture__/delivery/chant.config.ts +7 -0
- package/dist/workspace/conformance/__fixture__/delivery/lexicon/index.ts +26 -0
- package/dist/workspace/conformance/__fixture__/delivery/package.json +7 -0
- package/dist/workspace/conformance/__fixture__/delivery/src/app.component.ts +14 -0
- package/dist/workspace/conformance/__fixture__/delivery/src/app.ts +4 -0
- package/dist/workspace/conformance/__fixtures__/reference-broker.js +205 -0
- package/dist/workspace/conformance/__writer_fixture__/answers/answer.kind.mjs +32 -0
- package/dist/workspace/conformance/__writer_fixture__/answers/answer.schema.json +135 -0
- package/dist/workspace/conformance/__writer_fixture__/contracts/contract.kind.mjs +37 -0
- package/dist/workspace/conformance/__writer_fixture__/contracts/contract.schema.json +213 -0
- package/dist/workspace/conformance/__writer_fixture__/decisions/points.json +228 -0
- package/dist/workspace/conformance/__writer_fixture__/drivers/driver.kind.mjs +15 -0
- package/dist/workspace/conformance/__writer_fixture__/drivers/driver.schema.json +38 -0
- package/dist/workspace/conformance/__writer_fixture__/sessions/session.kind.mjs +54 -0
- package/dist/workspace/conformance/__writer_fixture__/sessions/session.schema.json +289 -0
- package/dist/workspace/conformance/__writer_fixture__/work/W-001-the-writer-suite-works-this-item.md +25 -0
- package/dist/workspace/conformance/__writer_fixture__/work/work.kind.mjs +60 -0
- package/dist/workspace/conformance/__writer_fixture__/work/work.schema.json +603 -0
- package/dist/workspace/conformance/broker.js +736 -0
- package/dist/workspace/conformance/index.js +673 -0
- package/dist/workspace/conformance/vitest.js +108 -0
- package/dist/workspace/conformance/writer.js +1080 -0
- package/dist/workspace/decide.js +879 -0
- package/dist/workspace/decision-points.schema.json +135 -135
- package/dist/workspace/declaration-write-cli.js +74 -0
- package/dist/workspace/declaration-write.js +238 -0
- package/dist/workspace/declaration.js +938 -0
- package/dist/workspace/declaration.schema.json +1413 -1413
- package/dist/workspace/declared-kinds.js +106 -0
- package/dist/workspace/environments.js +164 -0
- package/dist/workspace/evidence.schema.json +279 -0
- package/dist/workspace/export-cli.js +185 -0
- package/dist/workspace/export.js +499 -0
- package/dist/workspace/factory-rules.js +175 -0
- package/dist/workspace/generated-files.js +92 -0
- package/dist/workspace/glob.js +45 -0
- package/dist/workspace/graph-cache.js +352 -0
- package/dist/workspace/graph-cli.js +348 -0
- package/dist/workspace/graph.schema.json +1338 -0
- package/dist/workspace/identity-gate-rule.js +75 -0
- package/dist/workspace/identity.js +126 -0
- package/dist/workspace/import.js +283 -0
- package/dist/workspace/init.js +620 -0
- package/dist/workspace/intent-cli.js +263 -0
- package/dist/workspace/intent-joins.js +201 -0
- package/dist/workspace/intent-record.js +352 -0
- package/dist/workspace/intent-record.schema.json +864 -0
- package/dist/workspace/intent.js +1582 -0
- package/dist/workspace/intent.schema.json +2420 -0
- package/dist/workspace/json-edit.js +221 -0
- package/dist/workspace/jsonc.js +235 -0
- package/dist/workspace/kind-readers.js +103 -0
- package/dist/workspace/kinds.d.ts +3 -7
- package/dist/workspace/kinds.d.ts.map +1 -1
- package/dist/workspace/kinds.js +553 -0
- package/dist/workspace/lexicon-symbols.js +112 -0
- package/dist/workspace/lineage-adopt-cli.js +102 -0
- package/dist/workspace/lineage-adopt.js +360 -0
- package/dist/workspace/lineage-check.js +282 -0
- package/dist/workspace/lineage-cli.js +121 -0
- package/dist/workspace/lineage-hash-index.js +284 -0
- package/dist/workspace/lineage-init.js +507 -0
- package/dist/workspace/lineage-lock.js +387 -0
- package/dist/workspace/lineage-merge.js +45 -0
- package/dist/workspace/lineage-migrations.d.ts.map +1 -1
- package/dist/workspace/lineage-migrations.js +329 -0
- package/dist/workspace/lineage-provenance.js +36 -0
- package/dist/workspace/lineage-update.js +138 -0
- package/dist/workspace/lineage-upgrade-cli.js +131 -0
- package/dist/workspace/lineage-upgrade.js +889 -0
- package/dist/workspace/lineage-vendor.js +171 -0
- package/dist/workspace/lineage-version.js +128 -0
- package/dist/workspace/lineage-versions.js +275 -0
- package/dist/workspace/links.js +330 -0
- package/dist/workspace/ls-generated.js +95 -0
- package/dist/workspace/ls.js +277 -0
- package/dist/workspace/ls.schema.json +333 -0
- package/dist/workspace/member-commands.js +508 -0
- package/dist/workspace/member-handles.js +216 -0
- package/dist/workspace/member-pipeline.js +258 -0
- package/dist/workspace/member-run.js +117 -0
- package/dist/workspace/member-write.schema.json +193 -0
- package/dist/workspace/nested-graph.js +156 -0
- package/dist/workspace/nesting.js +38 -0
- package/dist/workspace/patch.js +301 -0
- package/dist/workspace/patch.schema.json +321 -0
- package/dist/workspace/pin-cli.js +55 -0
- package/dist/workspace/pin-integrity.js +100 -0
- package/dist/workspace/plan-summary.schema.json +155 -0
- package/dist/workspace/point-answer.schema.json +129 -129
- package/dist/workspace/points-cli.js +291 -0
- package/dist/workspace/points-write.schema.json +660 -0
- package/dist/workspace/points.js +521 -0
- package/dist/workspace/points.schema.json +916 -0
- package/dist/workspace/pr-report.schema.json +108 -0
- package/dist/workspace/principal-classes.d.ts +4 -11
- package/dist/workspace/principal-classes.d.ts.map +1 -1
- package/dist/workspace/principal-classes.js +162 -0
- package/dist/workspace/reason-codes.js +326 -0
- package/dist/workspace/record-assets.js +151 -0
- package/dist/workspace/record-decided.js +105 -0
- package/dist/workspace/record-sessions.js +96 -0
- package/dist/workspace/record-source.js +114 -0
- package/dist/workspace/records-amend.schema.json +284 -0
- package/dist/workspace/records-checkout.js +76 -0
- package/dist/workspace/records-cli.js +707 -0
- package/dist/workspace/records-close.js +116 -0
- package/dist/workspace/records-close.schema.json +278 -0
- package/dist/workspace/records-new.schema.json +202 -0
- package/dist/workspace/records-review.schema.json +367 -0
- package/dist/workspace/records-since.js +317 -0
- package/dist/workspace/records-since.schema.json +218 -0
- package/dist/workspace/records-write.js +1229 -0
- package/dist/workspace/records.js +1345 -0
- package/dist/workspace/records.schema.json +604 -0
- package/dist/workspace/reference-kinds/app/package.json +10 -0
- package/dist/workspace/reference-kinds/app/workspace-kinds.json +45 -0
- package/dist/workspace/returns.js +303 -0
- package/dist/workspace/root-refusal.js +75 -0
- package/dist/workspace/run-statement.schema.json +622 -0
- package/dist/workspace/runs-cli.js +584 -0
- package/dist/workspace/runs-write.schema.json +994 -0
- package/dist/workspace/runs.js +708 -0
- package/dist/workspace/runs.schema.json +1257 -0
- package/dist/workspace/runtimes.js +76 -0
- package/dist/workspace/session-kinds.js +83 -0
- package/dist/workspace/signers.schema.json +206 -0
- package/dist/workspace/source-block.js +125 -0
- package/dist/workspace/squash.js +177 -0
- package/dist/workspace/status-gates.js +162 -0
- package/dist/workspace/status-stewards.js +330 -0
- package/dist/workspace/status.js +514 -0
- package/dist/workspace/status.schema.json +998 -0
- package/dist/workspace/steward-index.js +191 -0
- package/dist/workspace/symbols.js +188 -0
- package/dist/workspace/template-manifest.js +227 -0
- package/dist/workspace/template-pins.js +115 -0
- package/dist/workspace/trailer-joins.js +65 -0
- package/dist/workspace/trailers.js +111 -0
- package/dist/workspace/tree.js +136 -0
- package/dist/workspace/trust/attestor.js +63 -0
- package/dist/workspace/trust/dsse.js +108 -0
- package/dist/workspace/trust/evidence-cli.js +175 -0
- package/dist/workspace/trust/evidence.js +161 -0
- package/dist/workspace/trust/gate-seal.js +226 -0
- package/dist/workspace/trust/policy.js +190 -0
- package/dist/workspace/trust/provenance.js +180 -0
- package/dist/workspace/trust/rotation.js +298 -0
- package/dist/workspace/trust/run-commits.js +101 -0
- package/dist/workspace/trust/run-statement.js +182 -0
- package/dist/workspace/trust/seal.js +272 -0
- package/dist/workspace/trust/signers-cli.js +152 -0
- package/dist/workspace/trust/ssh-commit.js +178 -0
- package/dist/workspace/trust/test-repo.js +118 -0
- package/dist/workspace/trust/trust-files.js +193 -0
- package/dist/workspace/trust/verify-cli.js +63 -0
- package/dist/workspace/trust/verify.js +192 -0
- package/dist/workspace/which-chant.js +141 -0
- package/dist/workspace/wip-cli.js +95 -0
- package/dist/workspace/wip-write.schema.json +504 -0
- package/dist/workspace/wip.js +631 -0
- package/dist/workspace/wip.schema.json +334 -0
- package/dist/workspace/work-cli.js +448 -0
- package/dist/workspace/work-evidence.js +122 -0
- package/dist/workspace/work-evidence.schema.json +222 -0
- package/dist/workspace/work-history.schema.json +421 -0
- package/dist/workspace/work-lease.schema.json +246 -0
- package/dist/workspace/work-size.js +77 -0
- package/dist/workspace/work.js +283 -0
- package/dist/workspace/workspace-kinds.schema.json +259 -259
- package/dist/workspace/workspace-principals.schema.json +53 -53
- package/dist/workspace/write-lock-cli.js +105 -0
- package/dist/workspace/write-lock.js +424 -0
- package/dist/workspace/write-lock.schema.json +172 -0
- package/dist/workspace/write-scope.js +484 -0
- package/dist/yaml.js +459 -0
- package/package.json +2 -2
- package/src/build.ts +8 -0
- package/src/change-set.test.ts +48 -0
- package/src/change-set.ts +52 -2
- package/src/ci-jobs.test.ts +49 -0
- package/src/ci-jobs.ts +515 -0
- package/src/cli/commands/check-lexicon-plugin.ts +2 -0
- package/src/cli/commands/lint.ts +3 -0
- package/src/cli/commands/migrate.ts +2 -0
- package/src/cli/compiled-cli.e2e.test.ts +165 -0
- package/src/cli/main.ts +121 -27
- package/src/cli/mcp/workspace-tools.ts +1 -1
- package/src/codegen/pinned-upgrade.ts +2 -0
- package/src/components/discover.ts +2 -0
- package/src/components/pr-pipeline.ts +3 -2
- package/src/components/sandbox/driver.ts +3 -1
- package/src/composite.ts +15 -3
- package/src/config-import.ts +3 -0
- package/src/discovery/collect.ts +15 -1
- package/src/discovery/fold-build-parity.test.ts +71 -0
- package/src/discovery/fold-import.ts +25 -127
- package/src/discovery/fold-project-provenance.test.ts +21 -4
- package/src/discovery/host-composite.ts +101 -0
- package/src/discovery/import.ts +2 -0
- package/src/discovery/index.ts +11 -1
- package/src/discovery/sandbox/driver.ts +3 -1
- package/src/gate-decision-bundle.test.ts +5 -4
- package/src/gate-decision-identity.test.ts +59 -6
- package/src/gate-decision.ts +81 -21
- package/src/lexicon-module.ts +3 -0
- package/src/lifecycle/gate-audit.test.ts +55 -1
- package/src/lifecycle/gate-audit.ts +116 -3
- package/src/lifecycle/gate-ledger.test.ts +20 -1
- package/src/lifecycle/gate-ledger.ts +33 -1
- package/src/lint/config.ts +1 -1
- package/src/lint/discover.ts +28 -8
- package/src/lint/policy-import.ts +4 -1
- package/src/lint/rule-loader.ts +2 -0
- package/src/op/activities/activity-contracts.ts +1 -1
- package/src/op/activities/change-set.ts +11 -3
- package/src/op/activities/lexicon-upgrade.test.ts +2 -0
- package/src/op/activities/reconcile.test.ts +62 -2
- package/src/op/activities/reconcile.ts +46 -22
- package/src/op/builders.ts +1 -1
- package/src/op/discover.ts +3 -0
- package/src/op/op-waves-run.ts +4 -3
- package/src/op/op-waves.test.ts +2 -0
- package/src/op/work-lease-run.test.ts +12 -4
- package/src/ts-loader.test.ts +23 -0
- package/src/ts-loader.ts +122 -0
- package/src/workspace/__fixtures__/contract-repo.ts +17 -1
- package/src/workspace/__fixtures__/sessions.ts +3 -3
- package/src/workspace/change-set.schema.json +5 -3
- package/src/workspace/chant-migrations/chud-lexicon-exit.ts +1 -1
- package/src/workspace/ci-green-workflow.test.ts +4 -4
- package/src/workspace/ci-green-workflow.ts +5 -2
- package/src/workspace/class-data.test.ts +64 -0
- package/src/workspace/class-data.ts +236 -0
- package/src/workspace/declaration.ts +1 -1
- package/src/workspace/kinds.ts +7 -36
- package/src/workspace/lineage-migrations.ts +2 -0
- package/src/workspace/points.ts +1 -1
- package/src/workspace/principal-classes.ts +12 -95
- package/src/workspace/records-formats.test.ts +7 -2
- package/src/workspace/records-sessions-write.test.ts +3 -3
- package/src/workspace/status-contract.e2e.test.ts +37 -0
- package/src/workspace/status-contract.test.ts +23 -21
|
@@ -0,0 +1,447 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Status surface — reconciles the release ledger against live truth (#568,
|
|
3
|
+
* epic #551 "Build & deploy observability").
|
|
4
|
+
*
|
|
5
|
+
* Two ledgers, joined by one key. What's been built lives in the
|
|
6
|
+
* content-addressed `BuildArchive` (../components/verbs/build-archive.ts,
|
|
7
|
+
* ./build-ledger.ts). What we *recorded* deploying lives in the release
|
|
8
|
+
* ledger (./release-ledger.ts). What's *actually running* is live truth:
|
|
9
|
+
* ownership markers (../ownership.ts) plus `lifecycle diff --live`
|
|
10
|
+
* (./live-diff.ts). This module is the join: for each component/env, line up
|
|
11
|
+
* the latest recorded release against whatever live evidence is available,
|
|
12
|
+
* and flag the four things that matter —
|
|
13
|
+
*
|
|
14
|
+
* - **unrecorded** — something is live/owned but no release record exists
|
|
15
|
+
* for it. Someone (or some pipeline) deployed outside the recorded path.
|
|
16
|
+
* - **stale** — a release record exists but nothing live corresponds to it
|
|
17
|
+
* anymore (the component disappeared from observation).
|
|
18
|
+
* - **drifted** — a release record exists and the component is observed
|
|
19
|
+
* live, but a positive live observation contradicts the record (#2513):
|
|
20
|
+
* the live identity a lexicon reports (`attributes.digest` /
|
|
21
|
+
* `attributes.gitSha`) differs from the recorded release's, the ownership
|
|
22
|
+
* marker went from chant's to someone else's, or the live configuration
|
|
23
|
+
* changed against a lifecycle snapshot taken at or after the release (the
|
|
24
|
+
* `update` verdict `lifecycle plan` gives). Only things chant saw count:
|
|
25
|
+
* a resource it could not read, or one that reports no identity, never
|
|
26
|
+
* makes a component drifted.
|
|
27
|
+
* - **reconciled** — a release record exists and live evidence (via
|
|
28
|
+
* ownership) confirms the component is present and owned by chant.
|
|
29
|
+
* - **unknown** — live evidence was requested and could not be read (#1089),
|
|
30
|
+
* or was not requested at all. A component chant could not observe is never
|
|
31
|
+
* reported `stale`: "the read failed" and "it is gone" are different facts.
|
|
32
|
+
*
|
|
33
|
+
* This is deliberately a light-touch reconciliation: chant's lexicons report
|
|
34
|
+
* resource-level status (`ResourceMetadata`), not "the digest currently
|
|
35
|
+
* running" (most lexicons have no notion of image digest at all — a
|
|
36
|
+
* CloudFormation stack doesn't expose "the ECS task's image digest" through
|
|
37
|
+
* `describeResources`). So the live axis here is presence/ownership, not a
|
|
38
|
+
* digest re-derivation; digest-level truth is what the *release ledger*
|
|
39
|
+
* itself provides, and cross-environment digest comparison
|
|
40
|
+
* (`buildIsInBothEnvs`) is the query the epic actually asks for ("which
|
|
41
|
+
* build is in prod, and is it the one tested in staging").
|
|
42
|
+
*/
|
|
43
|
+
import { latestPerComponent } from "./release-ledger.js";
|
|
44
|
+
import { isLegacyContentDigest } from "./legacy-digest.js";
|
|
45
|
+
import { unobservedReasonText } from "../observation.js";
|
|
46
|
+
/**
|
|
47
|
+
* The `ResourceMetadata.attributes` keys a lexicon sets to report which build
|
|
48
|
+
* a live resource is running (#2513), and the release-record field each one is
|
|
49
|
+
* compared with. Opt-in: a lexicon that sets neither is reconciled on presence,
|
|
50
|
+
* ownership and snapshot drift alone, exactly as before.
|
|
51
|
+
*
|
|
52
|
+
* - `digest` — the artifact digest serving now (`sha256:...`). Matches the
|
|
53
|
+
* record's `digest`, or its `inputDigest` when the record has one.
|
|
54
|
+
* - `gitSha` — the commit the live build came from. Matches the record's
|
|
55
|
+
* `gitSha`; an abbreviated sha (7+ characters) matches by prefix.
|
|
56
|
+
*/
|
|
57
|
+
export const LIVE_IDENTITY_ATTRIBUTES = { digest: "digest", gitSha: "gitSha" };
|
|
58
|
+
function identityOf(entity, meta) {
|
|
59
|
+
const attrs = meta?.attributes;
|
|
60
|
+
if (!attrs)
|
|
61
|
+
return undefined;
|
|
62
|
+
const digest = attrs[LIVE_IDENTITY_ATTRIBUTES.digest];
|
|
63
|
+
const gitSha = attrs[LIVE_IDENTITY_ATTRIBUTES.gitSha];
|
|
64
|
+
const d = typeof digest === "string" && digest.length > 0 ? digest : undefined;
|
|
65
|
+
const g = typeof gitSha === "string" && gitSha.length > 0 ? gitSha : undefined;
|
|
66
|
+
if (!d && !g)
|
|
67
|
+
return undefined;
|
|
68
|
+
return { entity, ...(d ? { digest: d } : {}), ...(g ? { gitSha: g } : {}) };
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* An ownership transition between the snapshot and now that contradicts a
|
|
72
|
+
* chant release. `unknown` on either side answers nothing and is skipped, the
|
|
73
|
+
* same way the change set never escalates `unknown` (#1089, #1168).
|
|
74
|
+
*/
|
|
75
|
+
function ownershipChange(then, now) {
|
|
76
|
+
if (!then || !now)
|
|
77
|
+
return undefined;
|
|
78
|
+
if (then.ownership === "owned" && now.ownership === "foreign") {
|
|
79
|
+
return "ownership marker was chant's at the last snapshot and is gone now";
|
|
80
|
+
}
|
|
81
|
+
const a = then.marker;
|
|
82
|
+
const b = now.marker;
|
|
83
|
+
if (a && b && (a.stack !== b.stack || (a.env !== undefined && b.env !== undefined && a.env !== b.env))) {
|
|
84
|
+
return `ownership marker changed from ${a.stack}${a.env ? `/${a.env}` : ""} to ${b.stack}${b.env ? `/${b.env}` : ""}`;
|
|
85
|
+
}
|
|
86
|
+
return undefined;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Overlay per-component stack-presence evidence onto change-set evidence.
|
|
90
|
+
*
|
|
91
|
+
* The change-set axis (`liveEvidenceFromChangeSet`) is entity-keyed and, for
|
|
92
|
+
* AWS, single-stack-per-env — it can't see a multi-stack component project where
|
|
93
|
+
* each component owns its own stack (#57). `supplement` carries the direct
|
|
94
|
+
* per-component stack observation (from a lexicon's `describeStackStatus`), which
|
|
95
|
+
* is authoritative for **presence** (`live`) and **ownership**; the change-set's
|
|
96
|
+
* `action` is kept, since drift is still assessed from the diff. A component in
|
|
97
|
+
* only one map passes through unchanged.
|
|
98
|
+
*
|
|
99
|
+
* The change-set's `rollup` is kept too (behold#100). This merge rebuilds the
|
|
100
|
+
* evidence object field by field, so anything not named here is dropped — and
|
|
101
|
+
* `describeStackStatus` reports a stack, never per-resource counts, so the
|
|
102
|
+
* supplement has no rollup to contribute. Before this, every component on a
|
|
103
|
+
* lexicon that implements `describeStackStatus` lost the counts #1300 had just
|
|
104
|
+
* computed. That is AWS and only AWS, which made the rollup absent on exactly
|
|
105
|
+
* the substrate it was meant to be verified against: behold#98 shipped its
|
|
106
|
+
* consumer against floci-az/floci-gcp rows, where no stack observer runs and
|
|
107
|
+
* the field survived.
|
|
108
|
+
*/
|
|
109
|
+
export function mergeLiveEvidence(base, supplement) {
|
|
110
|
+
const merged = new Map(base ?? []);
|
|
111
|
+
for (const [component, sup] of supplement) {
|
|
112
|
+
const b = merged.get(component);
|
|
113
|
+
merged.set(component, {
|
|
114
|
+
live: sup.live,
|
|
115
|
+
// A direct stack observation that succeeded answers the question the
|
|
116
|
+
// change-set axis could not — so it clears an inherited "not observed".
|
|
117
|
+
// A supplement that itself could not read keeps the hole.
|
|
118
|
+
...(sup.unobserved ? { unobserved: sup.unobserved } : {}),
|
|
119
|
+
ownership: sup.ownership ?? b?.ownership,
|
|
120
|
+
action: b?.action,
|
|
121
|
+
stack: sup.stack ?? b?.stack,
|
|
122
|
+
// The unit split rides the same direct observation `live` came from —
|
|
123
|
+
// dropping it here would resurrect the lie the field exists to fix.
|
|
124
|
+
...(sup.partial ? { partial: sup.partial } : {}),
|
|
125
|
+
// Base first: the counts come from the change set, and a stack
|
|
126
|
+
// observation has none to offer.
|
|
127
|
+
...(b?.rollup ?? sup.rollup ? { rollup: b?.rollup ?? sup.rollup } : {}),
|
|
128
|
+
// Identity and snapshot drift come from the per-resource reads; a stack
|
|
129
|
+
// observation carries neither, so dropping them here would make
|
|
130
|
+
// `drifted` unreachable again on every lexicon with a stack observer.
|
|
131
|
+
...(b?.identities ? { identities: b.identities } : {}),
|
|
132
|
+
...(b?.driftSignals ? { driftSignals: b.driftSignals } : {}),
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
return merged;
|
|
136
|
+
}
|
|
137
|
+
/** Resolve the live entity/resource name(s) a component owns: its explicit mapping, or `[component]` when none is given. */
|
|
138
|
+
export function resolveLiveNames(component, mapping) {
|
|
139
|
+
const mapped = mapping?.get(component);
|
|
140
|
+
return mapped && mapped.length > 0 ? mapped : [component];
|
|
141
|
+
}
|
|
142
|
+
/** Count a component's entity verdicts without collapsing them (behold#98). */
|
|
143
|
+
function rollUp(entries) {
|
|
144
|
+
let present = 0;
|
|
145
|
+
let absent = 0;
|
|
146
|
+
let unobserved = 0;
|
|
147
|
+
for (const e of entries) {
|
|
148
|
+
if (e.unobserved)
|
|
149
|
+
unobserved += 1;
|
|
150
|
+
else if (e.live)
|
|
151
|
+
present += 1;
|
|
152
|
+
else
|
|
153
|
+
absent += 1;
|
|
154
|
+
}
|
|
155
|
+
return { total: entries.length, present, absent, unobserved };
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Merge live evidence for several entity/resource names owned by one
|
|
159
|
+
* component into a single verdict. `live` and `ownership` favor the
|
|
160
|
+
* most-actionable signal (present/owned) over "nothing here"; `action`
|
|
161
|
+
* favors `update` so that drift on *any* owned entity surfaces as drift for
|
|
162
|
+
* the component as a whole, matching `reconcileStatus`'s single check for
|
|
163
|
+
* `action === "update"`.
|
|
164
|
+
*
|
|
165
|
+
* The per-entity counts survive as {@link LiveComponentEvidence.rollup}, so a
|
|
166
|
+
* consumer that needs the shape rather than the verdict is not forced to redo
|
|
167
|
+
* this join on the far side of a CLI boundary.
|
|
168
|
+
*/
|
|
169
|
+
function mergeEvidence(entries) {
|
|
170
|
+
if (entries.length === 0)
|
|
171
|
+
return undefined;
|
|
172
|
+
if (entries.length === 1)
|
|
173
|
+
return { ...entries[0], rollup: rollUp(entries) };
|
|
174
|
+
const live = entries.some((e) => e.live);
|
|
175
|
+
const ownership = entries.some((e) => e.ownership === "owned")
|
|
176
|
+
? "owned"
|
|
177
|
+
: entries.some((e) => e.ownership === "foreign")
|
|
178
|
+
? "foreign"
|
|
179
|
+
: "unknown";
|
|
180
|
+
const action = entries.some((e) => e.action === "update")
|
|
181
|
+
? "update"
|
|
182
|
+
: entries.find((e) => e.action !== undefined)?.action;
|
|
183
|
+
// A component whose entities were partly readable is still partly unknown, so
|
|
184
|
+
// any unobserved entity keeps the hole — unless something under it was
|
|
185
|
+
// actually seen live, which already answers "is this deployed".
|
|
186
|
+
const unobserved = live ? undefined : entries.find((e) => e.unobserved)?.unobserved;
|
|
187
|
+
const identities = entries.flatMap((e) => e.identities ?? []);
|
|
188
|
+
const driftSignals = entries.flatMap((e) => e.driftSignals ?? []);
|
|
189
|
+
return {
|
|
190
|
+
live,
|
|
191
|
+
ownership,
|
|
192
|
+
action,
|
|
193
|
+
...(unobserved ? { unobserved } : {}),
|
|
194
|
+
rollup: rollUp(entries),
|
|
195
|
+
...(identities.length ? { identities } : {}),
|
|
196
|
+
...(driftSignals.length ? { driftSignals } : {}),
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Build a `component -> live evidence` map from a `ChangeSet`. Components and
|
|
201
|
+
* chant entities are different namespaces (a component's `name` need not
|
|
202
|
+
* equal any single lexicon entity name), so callers that want live
|
|
203
|
+
* reconciliation for a component whose live name(s) differ from its own name
|
|
204
|
+
* pass `nameMapping` (typically projected from `Component.liveNames`, see
|
|
205
|
+
* ../components/component.ts) — e.g. `new Map([["search-svc",
|
|
206
|
+
* ["search-service-v2"]]])`. Without a mapping (or for a component with no
|
|
207
|
+
* entry in it), the component's own name is used as its sole live name — the
|
|
208
|
+
* identity-keyed join that was this function's only behavior before #598,
|
|
209
|
+
* preserved here as the fallback so existing callers see no change.
|
|
210
|
+
*/
|
|
211
|
+
export function liveEvidenceFromChangeSet(cs, nameMapping, opts) {
|
|
212
|
+
const evidenceByName = new Map();
|
|
213
|
+
for (const entry of cs.entries) {
|
|
214
|
+
const obs = opts?.observations?.get(entry.name);
|
|
215
|
+
// Identity and marker transitions only from a resource that was actually
|
|
216
|
+
// read present. An unobserved or absent entity contributes nothing.
|
|
217
|
+
const identity = entry.evidence.live ? identityOf(entry.name, obs?.now) : undefined;
|
|
218
|
+
const driftSignals = [];
|
|
219
|
+
if (obs && entry.action === "update") {
|
|
220
|
+
driftSignals.push({
|
|
221
|
+
entity: entry.name,
|
|
222
|
+
kind: "attributes",
|
|
223
|
+
...(obs.thenAt ? { since: obs.thenAt } : {}),
|
|
224
|
+
...(entry.deltas?.length ? { detail: entry.deltas.map((d) => d.path).join(", ") } : {}),
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
const ownershipDetail = obs && entry.evidence.live ? ownershipChange(obs.then, obs.now) : undefined;
|
|
228
|
+
if (ownershipDetail) {
|
|
229
|
+
driftSignals.push({
|
|
230
|
+
entity: entry.name,
|
|
231
|
+
kind: "ownership",
|
|
232
|
+
...(obs?.thenAt ? { since: obs.thenAt } : {}),
|
|
233
|
+
detail: ownershipDetail,
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
evidenceByName.set(entry.name, {
|
|
237
|
+
rollup: rollUp([
|
|
238
|
+
{
|
|
239
|
+
live: entry.evidence.live,
|
|
240
|
+
...(entry.action === "unobserved" && entry.unobservedReason
|
|
241
|
+
? { unobserved: { reason: entry.unobservedReason } }
|
|
242
|
+
: {}),
|
|
243
|
+
},
|
|
244
|
+
]),
|
|
245
|
+
live: entry.evidence.live,
|
|
246
|
+
action: entry.action,
|
|
247
|
+
ownership: entry.ownership,
|
|
248
|
+
// Carry the plan's "could not look" verdict through so the status join
|
|
249
|
+
// reports a hole instead of reading `live: false` as "gone" (#1089).
|
|
250
|
+
...(entry.action === "unobserved" && entry.unobservedReason
|
|
251
|
+
? {
|
|
252
|
+
unobserved: {
|
|
253
|
+
reason: entry.unobservedReason,
|
|
254
|
+
...(entry.unobservedDetail ? { detail: entry.unobservedDetail } : {}),
|
|
255
|
+
},
|
|
256
|
+
}
|
|
257
|
+
: {}),
|
|
258
|
+
...(identity ? { identities: [identity] } : {}),
|
|
259
|
+
...(driftSignals.length ? { driftSignals } : {}),
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
if (!nameMapping)
|
|
263
|
+
return evidenceByName;
|
|
264
|
+
// Re-key by component: for each component that has an explicit mapping,
|
|
265
|
+
// aggregate evidence across every live name it owns. Components with no
|
|
266
|
+
// mapping entry keep their identity-keyed evidence as-is (already present
|
|
267
|
+
// in evidenceByName under their own name).
|
|
268
|
+
const result = new Map(evidenceByName);
|
|
269
|
+
for (const [component, liveNames] of nameMapping) {
|
|
270
|
+
if (!liveNames || liveNames.length === 0)
|
|
271
|
+
continue;
|
|
272
|
+
const merged = mergeEvidence(liveNames
|
|
273
|
+
.map((n) => evidenceByName.get(n))
|
|
274
|
+
.filter((e) => e !== undefined));
|
|
275
|
+
if (merged) {
|
|
276
|
+
result.set(component, merged);
|
|
277
|
+
}
|
|
278
|
+
else {
|
|
279
|
+
result.delete(component);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
return result;
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Reconcile the release ledger against live evidence for one environment.
|
|
286
|
+
* Pure — no I/O. Callers assemble `records` (./release-ledger.ts's
|
|
287
|
+
* `readReleaseLedger`), `liveEvidence` (from a `ChangeSet` via
|
|
288
|
+
* `liveEvidenceFromChangeSet`, or `undefined` when `--live` wasn't
|
|
289
|
+
* requested), `builds` (a `component -> BuildLedgerEntry` lookup keyed by
|
|
290
|
+
* digest, from ./build-ledger.ts), and `componentBomByDigest` (#614, a
|
|
291
|
+
* `digest -> ComponentBomSummary` lookup, also from ./build-ledger.ts) ahead
|
|
292
|
+
* of time.
|
|
293
|
+
*/
|
|
294
|
+
export function reconcileStatus(env, records, opts) {
|
|
295
|
+
const latest = latestPerComponent(records);
|
|
296
|
+
const liveEvidence = opts?.liveEvidence;
|
|
297
|
+
const componentNames = new Set([...latest.keys(), ...(opts?.allComponents ?? [])]);
|
|
298
|
+
const rows = [];
|
|
299
|
+
for (const component of [...componentNames].sort()) {
|
|
300
|
+
const recorded = latest.get(component);
|
|
301
|
+
const evidence = liveEvidence?.get(component);
|
|
302
|
+
const build = recorded ? opts?.buildsByDigest?.get(recorded.digest) : undefined;
|
|
303
|
+
const componentBom = recorded ? opts?.componentBomByDigest?.get(recorded.digest) : undefined;
|
|
304
|
+
let reconciliation;
|
|
305
|
+
let detail;
|
|
306
|
+
let contradiction;
|
|
307
|
+
if (!liveEvidence) {
|
|
308
|
+
// No live evidence requested at all (digest-only / offline mode) — the
|
|
309
|
+
// ledger is the only signal available, so recorded-vs-unrecorded still
|
|
310
|
+
// makes sense but drift can't be assessed.
|
|
311
|
+
reconciliation = recorded ? "unknown" : "unrecorded";
|
|
312
|
+
detail = recorded
|
|
313
|
+
? "recorded; live status not queried (pass --live to reconcile)"
|
|
314
|
+
: "no release record found";
|
|
315
|
+
}
|
|
316
|
+
else if (evidence?.unobserved) {
|
|
317
|
+
// Live evidence was requested and could not be read (#1089). Neither
|
|
318
|
+
// `stale` (which claims the component is gone) nor `reconciled` is
|
|
319
|
+
// supportable — the honest verdict is that nothing is known.
|
|
320
|
+
reconciliation = "unknown";
|
|
321
|
+
const why = `${unobservedReasonText(evidence.unobserved.reason)}${evidence.unobserved.detail ? `: ${evidence.unobserved.detail}` : ""}`;
|
|
322
|
+
detail = recorded
|
|
323
|
+
? `recorded ${recorded.timestamp} (digest ${recorded.digest}), but live state could not be observed — ${why}`
|
|
324
|
+
: `no release record, and live state could not be observed — ${why}`;
|
|
325
|
+
}
|
|
326
|
+
else if (!recorded && evidence?.live) {
|
|
327
|
+
reconciliation = "unrecorded";
|
|
328
|
+
detail = `live${evidence.ownership === "owned" ? " and chant-owned" : ""}, but no release record exists — deployed outside the recorded path`;
|
|
329
|
+
}
|
|
330
|
+
else if (!recorded && !evidence?.live) {
|
|
331
|
+
reconciliation = "unrecorded";
|
|
332
|
+
// "Nothing observed live" was a lie for a partially-present component
|
|
333
|
+
// (#1528) — say what was seen and name what was not.
|
|
334
|
+
detail = evidence?.partial
|
|
335
|
+
? `no release record; ${evidence.partial.present} of ${evidence.partial.total} deploy units observed live (missing: ${evidence.partial.missing.join(", ")})`
|
|
336
|
+
: "no release record and nothing observed live";
|
|
337
|
+
}
|
|
338
|
+
else if (recorded && !evidence?.live) {
|
|
339
|
+
reconciliation = "stale";
|
|
340
|
+
detail = evidence?.partial
|
|
341
|
+
? `recorded ${recorded.timestamp} (digest ${recorded.digest}), but only ${evidence.partial.present} of ${evidence.partial.total} deploy units observed live now (missing: ${evidence.partial.missing.join(", ")})`
|
|
342
|
+
: `recorded ${recorded.timestamp} (digest ${recorded.digest}), but nothing observed live now`;
|
|
343
|
+
}
|
|
344
|
+
else if (recorded && (contradiction = contradictsRecord(recorded, evidence))) {
|
|
345
|
+
reconciliation = "drifted";
|
|
346
|
+
detail = `recorded ${recorded.timestamp} (digest ${recorded.digest}), but ${contradiction}`;
|
|
347
|
+
}
|
|
348
|
+
else {
|
|
349
|
+
reconciliation = "reconciled";
|
|
350
|
+
detail = `recorded ${recorded.timestamp} (digest ${recorded.digest}), live and consistent`;
|
|
351
|
+
}
|
|
352
|
+
rows.push({
|
|
353
|
+
component,
|
|
354
|
+
env,
|
|
355
|
+
recorded,
|
|
356
|
+
build,
|
|
357
|
+
componentBom,
|
|
358
|
+
reconciliation,
|
|
359
|
+
detail,
|
|
360
|
+
// `live` is only emitted when it is a real answer: requested AND read.
|
|
361
|
+
// An unread component leaves it absent (= unknown to every consumer)
|
|
362
|
+
// rather than reporting `false`, which would read as "not deployed".
|
|
363
|
+
...(liveEvidence && !evidence?.unobserved ? { live: !!evidence?.live } : {}),
|
|
364
|
+
...(evidence?.unobserved ? { unobserved: evidence.unobserved } : {}),
|
|
365
|
+
...(evidence?.stack ? { stack: evidence.stack } : {}),
|
|
366
|
+
...(evidence?.rollup ? { resources: evidence.rollup } : {}),
|
|
367
|
+
...(evidence?.partial ? { partial: evidence.partial } : {}),
|
|
368
|
+
});
|
|
369
|
+
}
|
|
370
|
+
return rows;
|
|
371
|
+
}
|
|
372
|
+
/** `sha256:abc` and `abc` name the same digest; anything else compares exactly. */
|
|
373
|
+
function sameDigest(a, b) {
|
|
374
|
+
const bare = (d) => d.replace(/^sha256:/, "");
|
|
375
|
+
return a === b || bare(a) === bare(b);
|
|
376
|
+
}
|
|
377
|
+
/** Full shas compare exactly; an abbreviated one (7+ chars) matches by prefix. */
|
|
378
|
+
function sameGitSha(a, b) {
|
|
379
|
+
if (a === b)
|
|
380
|
+
return true;
|
|
381
|
+
const [short, long] = a.length <= b.length ? [a, b] : [b, a];
|
|
382
|
+
return short.length >= 7 && long.startsWith(short);
|
|
383
|
+
}
|
|
384
|
+
function notBefore(since, recordedAt) {
|
|
385
|
+
const s = Date.parse(since);
|
|
386
|
+
const r = Date.parse(recordedAt);
|
|
387
|
+
// An unparseable timestamp cannot place the change after the release, so
|
|
388
|
+
// it is not attributed to drift since it.
|
|
389
|
+
return !Number.isNaN(s) && !Number.isNaN(r) && s >= r;
|
|
390
|
+
}
|
|
391
|
+
/**
|
|
392
|
+
* Does live evidence for a present, recorded component contradict its latest
|
|
393
|
+
* release record (#2513)? Returns why, or `undefined` when nothing seen says
|
|
394
|
+
* so. Every rule reads a positive observation; a missing identity, an
|
|
395
|
+
* `unknown` ownership or a resource nobody read is not a contradiction.
|
|
396
|
+
*/
|
|
397
|
+
function contradictsRecord(recorded, evidence) {
|
|
398
|
+
for (const id of evidence.identities ?? []) {
|
|
399
|
+
if (id.digest !== undefined) {
|
|
400
|
+
const matches = sameDigest(id.digest, recorded.digest) ||
|
|
401
|
+
(recorded.inputDigest !== undefined && sameDigest(id.digest, recorded.inputDigest));
|
|
402
|
+
if (!matches)
|
|
403
|
+
return `live ${id.entity} reports digest ${id.digest}`;
|
|
404
|
+
}
|
|
405
|
+
if (id.gitSha !== undefined && !sameGitSha(id.gitSha, recorded.gitSha)) {
|
|
406
|
+
return `live ${id.entity} reports git sha ${id.gitSha}, recorded ${recorded.gitSha}`;
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
if (evidence.driftSignals) {
|
|
410
|
+
// A signal against a snapshot taken before the release may be the release
|
|
411
|
+
// itself, so only a change seen since the release counts. A signal with no
|
|
412
|
+
// `since` was produced by a caller that did not say, and counts.
|
|
413
|
+
const since = evidence.driftSignals.filter((d) => d.since === undefined || notBefore(d.since, recorded.timestamp));
|
|
414
|
+
const first = since[0];
|
|
415
|
+
if (first) {
|
|
416
|
+
const what = first.kind === "ownership" ? first.detail ?? "ownership marker changed" : `live configuration of ${first.entity} changed${first.detail ? ` (${first.detail})` : ""}`;
|
|
417
|
+
const more = since.length > 1 ? ` (+${since.length - 1} more)` : "";
|
|
418
|
+
return `${what} since the snapshot of ${first.since ?? "an earlier read"}${more}`;
|
|
419
|
+
}
|
|
420
|
+
return undefined;
|
|
421
|
+
}
|
|
422
|
+
// Evidence assembled without per-entity observations: the change set's own
|
|
423
|
+
// `update` verdict is the only drift signal there is.
|
|
424
|
+
if (evidence.action === "update")
|
|
425
|
+
return "live configuration has drifted since";
|
|
426
|
+
return undefined;
|
|
427
|
+
}
|
|
428
|
+
/** Compare the latest recorded digest for `component` between two environments' release records. */
|
|
429
|
+
export function compareAcrossEnvironments(component, envA, envB) {
|
|
430
|
+
const latestA = latestPerComponent(envA.records).get(component);
|
|
431
|
+
const latestB = latestPerComponent(envB.records).get(component);
|
|
432
|
+
const idA = latestA ? latestA.inputDigest ?? latestA.digest : undefined;
|
|
433
|
+
const idB = latestB ? latestB.inputDigest ?? latestB.digest : undefined;
|
|
434
|
+
const comparedOnInputs = (latestA?.inputDigest ?? latestB?.inputDigest) !== undefined;
|
|
435
|
+
return {
|
|
436
|
+
component,
|
|
437
|
+
envA: envA.name,
|
|
438
|
+
envB: envB.name,
|
|
439
|
+
digestA: latestA?.digest,
|
|
440
|
+
digestB: latestB?.digest,
|
|
441
|
+
same: !!idA && !!idB && idA === idB,
|
|
442
|
+
...(comparedOnInputs && idA && idB ? { comparedOn: { a: idA, b: idB } } : {}),
|
|
443
|
+
...(idA && idB && idA !== idB && isLegacyContentDigest(idA) !== isLegacyContentDigest(idB)
|
|
444
|
+
? { mixedDigestForms: true }
|
|
445
|
+
: {}),
|
|
446
|
+
};
|
|
447
|
+
}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { summarize } from "./change-set.js";
|
|
2
|
+
import { unobservedReasonText } from "../observation.js";
|
|
3
|
+
/**
|
|
4
|
+
* Verdict priority, most-cautious first: if anything is `unknown`, the tick
|
|
5
|
+
* as a whole must be treated as `unknown` — "unknown never remediates" is a
|
|
6
|
+
* whole-tick property, not a per-component one, since a rule table has no
|
|
7
|
+
* way to act on "some of the environment" only. `drifted` outranks `stale`/
|
|
8
|
+
* `unrecorded` because it is the actionable case ApplyOp's re-apply fixes;
|
|
9
|
+
* `reconciled` is the quiet-environment default.
|
|
10
|
+
*/
|
|
11
|
+
const STATUS_PRIORITY = [
|
|
12
|
+
"unknown",
|
|
13
|
+
"drifted",
|
|
14
|
+
"stale",
|
|
15
|
+
"unrecorded",
|
|
16
|
+
"reconciled",
|
|
17
|
+
];
|
|
18
|
+
/** The worst (most-cautious) reconciliation verdict across a set of component rows. `"reconciled"` for an empty set — nothing to converge is a quiet environment. */
|
|
19
|
+
export function worstStatus(rows) {
|
|
20
|
+
const present = new Set(rows.map((r) => r.reconciliation));
|
|
21
|
+
for (const candidate of STATUS_PRIORITY) {
|
|
22
|
+
if (present.has(candidate))
|
|
23
|
+
return candidate;
|
|
24
|
+
}
|
|
25
|
+
return "reconciled";
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Join a `ChangeSet` and `ComponentStatusRow[]` for one tick into a
|
|
29
|
+
* `ConvergeSymptom`. Pure — no I/O.
|
|
30
|
+
*/
|
|
31
|
+
export function deriveSymptoms(env, cs, statusRows) {
|
|
32
|
+
const counts = summarize(cs);
|
|
33
|
+
const unobservedReasons = [
|
|
34
|
+
...new Set(cs.entries
|
|
35
|
+
.filter((e) => e.action === "unobserved" && e.unobservedReason !== undefined)
|
|
36
|
+
.map((e) => e.unobservedReason)),
|
|
37
|
+
].sort((a, b) => unobservedReasonText(a).localeCompare(unobservedReasonText(b)));
|
|
38
|
+
return {
|
|
39
|
+
env,
|
|
40
|
+
status: worstStatus(statusRows),
|
|
41
|
+
components: statusRows,
|
|
42
|
+
createCount: counts.create,
|
|
43
|
+
updateCount: counts.update,
|
|
44
|
+
deleteCount: counts.delete,
|
|
45
|
+
adoptCount: counts.adopt,
|
|
46
|
+
runtimeCount: counts.runtime,
|
|
47
|
+
effectCount: counts.effect,
|
|
48
|
+
unobservedCount: counts.unobserved,
|
|
49
|
+
unobservedReasons,
|
|
50
|
+
totalCount: cs.entries.length,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
/** Every field name a `ConvergeSymptom` produces — the runtime whitelist `OPS014` (packages/core/src/lint/rules/op/ops014-converge-rule-refusals.ts) re-validates a serialized rule table's predicates against. Kept in sync with {@link ConvergeSymptom} by hand (deliberately small, changes rarely). */
|
|
54
|
+
export const CONVERGE_SYMPTOM_FIELDS = new Set([
|
|
55
|
+
"env",
|
|
56
|
+
"status",
|
|
57
|
+
"components",
|
|
58
|
+
"createCount",
|
|
59
|
+
"updateCount",
|
|
60
|
+
"deleteCount",
|
|
61
|
+
"adoptCount",
|
|
62
|
+
"runtimeCount",
|
|
63
|
+
"effectCount",
|
|
64
|
+
"unobservedCount",
|
|
65
|
+
"unobservedReasons",
|
|
66
|
+
"totalCount",
|
|
67
|
+
]);
|
|
68
|
+
/**
|
|
69
|
+
* The environment variable a dispatched Op reads the resource from, when a
|
|
70
|
+
* ConvergeOp with an observer step fired its rule for one resource (#2778).
|
|
71
|
+
*/
|
|
72
|
+
export const CONVERGE_RESOURCE_ENV = "CHANT_CONVERGE_RESOURCE";
|
|
73
|
+
/** Every field a {@link ResourceSymptom} produces: OPS014's whitelist for a ConvergeOp with an observer step. */
|
|
74
|
+
export const RESOURCE_SYMPTOM_FIELDS = new Set(["env", "resource", "status", "detail"]);
|
|
75
|
+
const RESOURCE_STATUSES = new Set(["in-sync", "drifted", "unknown"]);
|
|
76
|
+
/**
|
|
77
|
+
* Read an observer step's result as a {@link ResourceObservation}. The
|
|
78
|
+
* result is the observation itself, or a `shell()` step's result whose
|
|
79
|
+
* stdout is the observation as JSON. Throws, naming what is wrong, on
|
|
80
|
+
* anything else: a tick must not converge from a reading it can't parse.
|
|
81
|
+
*/
|
|
82
|
+
export function parseResourceObservation(value) {
|
|
83
|
+
let candidate = value;
|
|
84
|
+
if (candidate && typeof candidate === "object" && !("resources" in candidate) && typeof candidate.stdout === "string") {
|
|
85
|
+
const stdout = candidate.stdout;
|
|
86
|
+
try {
|
|
87
|
+
candidate = JSON.parse(stdout);
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
throw new Error(`the observer step's stdout is not JSON: ${stdout.slice(0, 120)}`);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
const resources = candidate?.resources;
|
|
94
|
+
if (!Array.isArray(resources)) {
|
|
95
|
+
throw new Error("the observer step returned no `resources` array: it must return { resources: [{ name, status }] }, or print it as JSON");
|
|
96
|
+
}
|
|
97
|
+
const seen = new Set();
|
|
98
|
+
const out = [];
|
|
99
|
+
for (const [i, r] of resources.entries()) {
|
|
100
|
+
const entry = r;
|
|
101
|
+
if (!entry || typeof entry.name !== "string" || entry.name === "") {
|
|
102
|
+
throw new Error(`the observer step's resources[${i}] has no name`);
|
|
103
|
+
}
|
|
104
|
+
if (typeof entry.status !== "string" || !RESOURCE_STATUSES.has(entry.status)) {
|
|
105
|
+
throw new Error(`the observer step's resource "${entry.name}" has status ${JSON.stringify(entry.status)}: it must be in-sync, drifted or unknown`);
|
|
106
|
+
}
|
|
107
|
+
if (seen.has(entry.name))
|
|
108
|
+
throw new Error(`the observer step reported resource "${entry.name}" twice`);
|
|
109
|
+
seen.add(entry.name);
|
|
110
|
+
out.push({
|
|
111
|
+
name: entry.name,
|
|
112
|
+
status: entry.status,
|
|
113
|
+
...(typeof entry.detail === "string" && entry.detail !== "" ? { detail: entry.detail } : {}),
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
return { resources: out };
|
|
117
|
+
}
|