@intentius/chant-lexicon-k8s 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.
Files changed (47) hide show
  1. package/dist/api/sweep-types.d.ts +1 -2
  2. package/dist/api/sweep-types.d.ts.map +1 -1
  3. package/dist/composites/operator-stack.d.ts +19 -18
  4. package/dist/composites/operator-stack.d.ts.map +1 -1
  5. package/dist/config.d.ts +4 -4
  6. package/dist/deep-observe-hooks.d.ts +4 -4
  7. package/dist/deep-observe.d.ts +23 -16
  8. package/dist/deep-observe.d.ts.map +1 -1
  9. package/dist/export-resources.d.ts +1 -1
  10. package/dist/integrity.json +3 -3
  11. package/dist/lint/audit-catalog.d.ts.map +1 -1
  12. package/dist/lint/audit-lineage.d.ts +10 -0
  13. package/dist/lint/audit-lineage.d.ts.map +1 -0
  14. package/dist/manifest.json +1 -1
  15. package/dist/op/activities/argo.d.ts +4 -4
  16. package/dist/op/activities/argo.d.ts.map +1 -1
  17. package/dist/op/activities/index.d.ts +9 -7
  18. package/dist/op/activities/index.d.ts.map +1 -1
  19. package/dist/op/activities/kubectl.d.ts +7 -7
  20. package/dist/op/activities/kubectl.d.ts.map +1 -1
  21. package/dist/op/activities/wait-for-ready.d.ts +6 -5
  22. package/dist/op/activities/wait-for-ready.d.ts.map +1 -1
  23. package/dist/op/builders.d.ts +13 -13
  24. package/dist/skills/chant-k8s-argo.md +27 -13
  25. package/package.json +3 -3
  26. package/src/api/sweep-types.ts +1 -2
  27. package/src/composites/composites.test.ts +13 -2
  28. package/src/composites/operator-stack.ts +22 -20
  29. package/src/config.ts +4 -4
  30. package/src/crd/crd-sources.ts +4 -4
  31. package/src/deep-observe-hooks.ts +4 -4
  32. package/src/deep-observe.test.ts +219 -46
  33. package/src/deep-observe.ts +28 -21
  34. package/src/export-resources.ts +1 -1
  35. package/src/lint/audit-catalog.ts +5 -1
  36. package/src/lint/audit-lineage.ts +127 -0
  37. package/src/op/activities/argo.test.ts +7 -8
  38. package/src/op/activities/argo.ts +4 -4
  39. package/src/op/activities/index.ts +9 -7
  40. package/src/op/activities/kubectl.test.ts +5 -4
  41. package/src/op/activities/kubectl.ts +52 -67
  42. package/src/op/activities/wait-for-ready.test.ts +2 -2
  43. package/src/op/activities/wait-for-ready.ts +7 -7
  44. package/src/op/builders.ts +13 -13
  45. package/src/plugin.ts +1 -1
  46. package/src/serializer.test.ts +26 -0
  47. package/src/skills/chant-k8s-argo.md +27 -13
@@ -10,8 +10,7 @@
10
10
  *
11
11
  * It lives in its own module, with no imports of its own, because both
12
12
  * consumers reach it from different directions — `../export-resources.ts`
13
- * pulls in the whole import parser, and a Temporal worker loading the apply
14
- * activity should not.
13
+ * pulls in the whole import parser, and the apply activity should not.
15
14
  */
16
15
  export declare const DEFAULT_IMPORT_TYPES: readonly string[];
17
16
  //# sourceMappingURL=sweep-types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sweep-types.d.ts","sourceRoot":"","sources":["../../src/api/sweep-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,oBAAoB,EAAE,SAAS,MAAM,EAoBjD,CAAC"}
1
+ {"version":3,"file":"sweep-types.d.ts","sourceRoot":"","sources":["../../src/api/sweep-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,oBAAoB,EAAE,SAAS,MAAM,EAoBjD,CAAC"}
@@ -16,39 +16,40 @@
16
16
  * (lease fencing, `chant operator status`, durable gate-as-fact semantics).
17
17
  * `OperatorStack`'s container command is deliberately `chant run <name>`,
18
18
  * the one-shot local tick `ConvergeOp` (#1484) already ships and tests
19
- * against (`lexicons/temporal/src/composites/converge-op.ts`'s own doc:
19
+ * against (`packages/core/src/op/composites/converge-op.ts`'s own doc:
20
20
  * "one-shot runnable locally for a single tick"). When #1485 lands, a
21
21
  * caller can override `command` to shell out to `chant operator tick`
22
22
  * instead — this composite doesn't need to change for that; only the
23
23
  * command a caller passes does.
24
24
  *
25
25
  * `concurrencyPolicy: "Forbid"` is the k8s-native analogue of
26
- * `ConvergeOp`'s own Temporal schedule `overlap: "Skip"` policy — never
27
- * queue a second tick behind one still running.
26
+ * `ConvergeOp`'s own `schedule.overlap: "skip"` policy — never queue a
27
+ * second tick behind one still running.
28
28
  *
29
29
  * ## RBAC derivation
30
30
  *
31
31
  * `ConvergeOp` adds no authority an environment did not already grant
32
32
  * (#1484's Autonomy table). `OperatorStack` re-derives the same bound at the
33
- * k8s RBAC layer, independently of the temporal lexicon (this module has no
34
- * dependency on it see the layering note below): for each hosted
33
+ * k8s RBAC layer, from the Op configs alone (see the Layering note below for
34
+ * what this module imports and what it restates): for each hosted
35
35
  * ConvergeOp, walk its `dispatchTargets` (the OpConfigs its rule table's
36
36
  * `run()` actions may name) through `classifyOpVerbClass`
37
37
  * (`packages/core/src/op/op-verb-class.ts`, #1954), then keep only the
38
38
  * highest verb class this host's `dial` could ever actually free-run —
39
39
  * exactly `convergeTick`'s own `verbClassAllowedToDispatch` gate and
40
- * `TMP014`'s build-time refusal, restated as an RBAC ceiling:
40
+ * `OPS014`'s build-time refusal, restated as an RBAC ceiling:
41
41
  *
42
42
  * - `dial: "observe"` never dispatches (report-only) → read-only RBAC,
43
43
  * regardless of what the rule table's targets could otherwise do.
44
- * - `dial: "reconcile"` only free-runs a read-only target (TMP014 refuses a
44
+ * - `dial: "reconcile"` only free-runs a read-only target (OPS014 refuses a
45
45
  * mutating dispatch under reconcile in v1) → read-only RBAC.
46
46
  * - `dial: "apply"` free-runs read-only and mutating targets → RBAC gains
47
47
  * create/update/patch, never delete.
48
48
  * - A `dispatchTargets` entry that itself classifies `destructive` is
49
- * refused outright, at construction — TMP014 already refuses a
50
- * destructive `run()` target under any dial in v1 (the local dispatch
51
- * executor can't honor its required gate), so a `destructive` target
49
+ * refused outright, at construction — OPS014 already refuses a
50
+ * destructive `run()` target under any dial in v1 (a converge tick runs
51
+ * unattended, and a destructive dispatch needs a person's approval before
52
+ * it is attempted, not a gate read after the fact), so a `destructive` target
52
53
  * reaching this composite is either a config bypassing that build check
53
54
  * or a target `OperatorStack` should never grant permission toward.
54
55
  * `never delete`, unconditionally, in v1 — no verb class here ever grants
@@ -61,11 +62,11 @@
61
62
  *
62
63
  * ## Layering
63
64
  *
64
- * `lexicons/k8s` has no workspace dependency on `lexicons/temporal` (nor
65
- * the reverse see both packages' `package.json`), so this module doesn't
66
- * import `ConvergeOpConfig`/`ConvergeRule` types. `OperatorStackConvergeHost`
67
- * restates the handful of `ConvergeOp` fields this composite actually needs
68
- * (`name`, `schedule`, `env`, `dial`) structurally; `dispatchTargets` takes
65
+ * `OperatorStackConvergeHost` restates the handful of `ConvergeOp` fields
66
+ * this composite actually needs (`name`, `schedule`, `env`, `dial`)
67
+ * structurally rather than importing `ConvergeOpConfig`: the CronJob is
68
+ * built from a host description, not from an Op config, and a caller that
69
+ * has neither should still be able to describe one. `dispatchTargets` takes
69
70
  * plain `OpConfig`-shaped values from `@intentius/chant/op` (a dependency
70
71
  * this lexicon already has via the `@intentius/chant` peer dependency),
71
72
  * the same type `classifyOpVerbClass` itself takes.
@@ -74,7 +75,7 @@ import type { OpConfig, OpVerbClass } from "@intentius/chant/op";
74
75
  import { Namespace, CronJob, ServiceAccount, Role, RoleBinding } from "../generated/index.js";
75
76
  /**
76
77
  * Mirrors `ConvergeOp`'s own `ConvergeDial`
77
- * (`lexicons/temporal/src/composites/converge-op.ts`) structurally — see
78
+ * (`packages/core/src/op/composites/converge-op.ts`) structurally — see
78
79
  * this module's Layering doc for why it's restated rather than imported.
79
80
  */
80
81
  export type OperatorDial = "observe" | "reconcile" | "apply";
@@ -96,7 +97,7 @@ export interface OperatorStackConvergeHost {
96
97
  /**
97
98
  * OpConfigs for every op this ConvergeOp's rule table may `run()` — the
98
99
  * sibling `*.op.ts` declarations its `run()` actions name. Used to derive
99
- * least-privilege RBAC the same way `TMP014` derives its build-time
100
+ * least-privilege RBAC the same way `OPS014` derives its build-time
100
101
  * refusals. Omit or leave empty when every rule only `report()`s; the
101
102
  * host still gets read-only RBAC for its own observation.
102
103
  */
@@ -153,7 +154,7 @@ export declare const DEFAULT_RESOURCE_RULES: OperatorRbacResourceRule[];
153
154
  * Derive the highest verb class a host's ServiceAccount actually needs:
154
155
  * the max, across `dispatchTargets`, of each target's own class — but only
155
156
  * counting a target `dial` could ever actually dispatch (one it can't just
156
- * gets reported, per `TMP014`/`convergeTick`, and needs no elevated grant).
157
+ * gets reported, per `OPS014`/`convergeTick`, and needs no elevated grant).
157
158
  * A `dispatchTargets` entry that classifies `destructive` is refused
158
159
  * outright rather than silently ignored — see this module's RBAC
159
160
  * derivation doc on why a destructive target reaching this composite is
@@ -1 +1 @@
1
- {"version":3,"file":"operator-stack.d.ts","sourceRoot":"","sources":["../../src/composites/operator-stack.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"operator-stack.d.ts","sourceRoot":"","sources":["../../src/composites/operator-stack.ts"],"names":[],"mappings":"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"}
package/dist/config.d.ts CHANGED
@@ -2,8 +2,8 @@
2
2
  * K8s environment → cluster binding — chant #1100.
3
3
  *
4
4
  * Every cloud lexicon binds an environment to a scope: AWS resolves `<env>`
5
- * to a CloudFormation stack, Azure treats `<env>` as the resource group,
6
- * Temporal looks up `temporal.profiles.<env>`. Before this, k8s bound
5
+ * to a CloudFormation stack, Azure treats `<env>` as the resource group.
6
+ * Before this, k8s bound
7
7
  * nothing — `describeResources` shelled out to `kubectl get` with no
8
8
  * `--context`, so `chant lifecycle diff prod --live` read whichever cluster
9
9
  * `kubectl config current-context` happened to point at.
@@ -40,8 +40,8 @@
40
40
  * and the missing binding.
41
41
  *
42
42
  * `ChantConfig` uses `.passthrough()` in its Zod schema so the `k8s` key is
43
- * accepted at runtime without core changes, exactly like `temporal.profiles`
44
- * (see `lexicons/temporal/src/config.ts`). The type side is the declaration
43
+ * accepted at runtime without core changes, exactly like the `terraform` key
44
+ * (see `lexicons/terraform/src/config.ts`). The type side is the declaration
45
45
  * merge at the bottom of this file — without it the snippet above compiles
46
46
  * only until someone adds `satisfies ChantConfig`, which every example
47
47
  * project does and which is the only thing type-checking the rest of the
@@ -49,7 +49,8 @@ import type { DeepArrayElement, DeepNormalizationHooks } from "@intentius/chant/
49
49
  * Kubernetes-defaulted fields, per entity type, as index-erased property
50
50
  * paths. Subtracted only where source never declared the property
51
51
  * (`side === "live" && counterpart === "absent"`) — cdk-real-drift's default
52
- * subtraction, same convention as AWS/Azure/Temporal's tables.
52
+ * subtraction, same convention as the AWS and Azure tables
53
+ * (`AWS_SERVICE_DEFAULTS`, `AZURE_SERVICE_DEFAULTS`).
53
54
  *
54
55
  * Sparse and evidence-based rather than derived from the generated schema:
55
56
  * the k8s OpenAPI spec this lexicon's codegen consumes
@@ -58,9 +59,8 @@ import type { DeepArrayElement, DeepNormalizationHooks } from "@intentius/chant/
58
59
  * actually expressible today. Widening this table is additive and needs no
59
60
  * contract change.
60
61
  *
61
- * `spec.strategy` is listed whole, not as `spec.strategy.type`, for the same
62
- * reason Temporal's `TEMPORAL_SCHEDULE_DEFAULTS` lists `state` whole: pruning
63
- * only the leaf would still recurse into the object, and a nested default the
62
+ * `spec.strategy` is listed whole rather than as `spec.strategy.type`, because
63
+ * pruning only the leaf would still recurse into the object, and a nested default the
64
64
  * table does not separately name (`rollingUpdate.maxSurge`/`maxUnavailable`,
65
65
  * both `"25%"` when `spec.strategy` is omitted entirely) would leave behind an
66
66
  * empty `strategy: {}` — a value distinct from no `strategy` key at all, and
@@ -9,10 +9,10 @@
9
9
  *
10
10
  * ## What managedFields decides, and what it does not
11
11
  *
12
- * AWS, Azure and Temporal's rows all prune by a **static, entityType-keyed**
13
- * table: an ARN always looks like an ARN, `provisioningState` is always
14
- * server-populated, a namespace's retention default is always the same
15
- * value. None of that needs the specific live object in hand — it is exactly
12
+ * The AWS and Azure rows both prune by a **static, entityType-keyed** table
13
+ * (`AWS_SERVICE_DEFAULTS`, `AZURE_SERVICE_DEFAULTS`): an ARN always looks like
14
+ * an ARN, `provisioningState` is always server-populated. Neither needs the
15
+ * specific live object in hand — it is exactly
16
16
  * what `./deep-observe-hooks.ts`'s `k8sDeepNormalizationHooks` is, and it
17
17
  * covers Kubernetes' *equivalent* static noise (`status`,
18
18
  * `metadata.{uid,resourceVersion,generation,creationTimestamp}`, a handful of
@@ -31,7 +31,7 @@
31
31
  * was controller noise. It silenced exactly the case the deep read exists
32
32
  * for — `kubectl label deploy web team=platform` is foreign-owned
33
33
  * (`kubectl-edit`) and undeclared, and never appeared in fieldDrift. The
34
- * policy now (recorded on #1202) is:
34
+ * policy now (recorded on #1202, refined by #2160) is:
35
35
  *
36
36
  * 1. **Chant-owned** (`chant`, `chant:<stack>` — chant #1075, matched on the
37
37
  * family so a stack rename does not stop recognizing its own history) is
@@ -41,18 +41,25 @@
41
41
  * write currently holds the field, and a foreign write that overrides a
42
42
  * value chant's manifest asks for is the thing `lifecycle diff --live`
43
43
  * exists to surface. It reports as `changed`.
44
- * 3. **Foreign-owned and undeclared** is reported as `undeclared` drift,
45
- * unless the accepted baseline already carries it at that value. The
46
- * baseline (`--update-baseline`) is the noise valve: an HPA that owns
47
- * `spec.replicas` on a Deployment whose source is silent about replicas
48
- * reports once, gets accepted, and stays quiet until the value moves.
44
+ * 3. **Undeclared** a path outside the declaration's claimed-field set
45
+ * (`@intentius/chant/claimed-fields`) is reported as unclaimed and
46
+ * is not drift at all. Before #2160 it was `undeclared` drift that the
47
+ * accepted baseline had to absorb one path at a time; the declaration
48
+ * answers on the first read instead, so an HPA that owns `spec.replicas`
49
+ * on a Deployment whose source is silent about replicas is quiet with
50
+ * nothing recorded anywhere.
49
51
  *
50
- * So ownership decides nothing about *whether* a path is compared. What it
51
- * contributes is `fieldOwners` (#1189): every reported drift names the
52
- * manager that holds the field live, which is how an operator tells
53
- * `hpa-controller` doing its job from somebody running `kubectl edit`. The
54
- * only fields subtracted because a foreign manager wrote them are the
55
- * well-known system ones on the static allowlist.
52
+ * So ownership decides nothing about *whether* a path is compared, and since
53
+ * #2160 it no longer decides the verdict either the declaration does. What
54
+ * it contributes is `fieldOwners` (#1189), and that is worth more here than
55
+ * anywhere else: on every other substrate a held field can only be reported
56
+ * as "not chant's", while here it is reported as `hpa-controller`'s or
57
+ * `kubectl-edit`'s by name, which is the difference between a controller
58
+ * doing its job and somebody bypassing the pipeline. Core takes the manager
59
+ * where this reader supplies one and falls back to the claim where it does
60
+ * not (a path inside a key-addressed list, which no `fieldsV1` entry names in
61
+ * that form). The only fields subtracted because a foreign manager wrote them
62
+ * are the well-known system ones on the static allowlist.
56
63
  *
57
64
  * ## Resolving a managedFields entry against a live array
58
65
  *
@@ -1 +1 @@
1
- {"version":3,"file":"deep-observe.d.ts","sourceRoot":"","sources":["../src/deep-observe.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4FG;AAGH,OAAO,KAAK,EACV,qBAAqB,EAGtB,MAAM,0BAA0B,CAAC;AAIlC,OAAO,EAAE,kBAAkB,EAAE,KAAK,aAAa,EAAE,MAAM,iCAAiC,CAAC;AACzF,OAAO,EAAuB,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAQvE,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AASjE,OAAO,EAAE,yBAAyB,EAAE,kBAAkB,EAAE,KAAK,aAAa,EAAE,CAAC;AAE7E,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,CAAC;IAC9E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,sFAAsF;IACtF,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAQD;;;;;;;GAOG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,qBAAqB,EAC9B,OAAO,GAAE,YAAkC,GAC1C,OAAO,CAAC,qBAAqB,CAAC,CAgHhC"}
1
+ {"version":3,"file":"deep-observe.d.ts","sourceRoot":"","sources":["../src/deep-observe.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmGG;AAGH,OAAO,KAAK,EACV,qBAAqB,EAGtB,MAAM,0BAA0B,CAAC;AAIlC,OAAO,EAAE,kBAAkB,EAAE,KAAK,aAAa,EAAE,MAAM,iCAAiC,CAAC;AACzF,OAAO,EAAuB,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAQvE,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AASjE,OAAO,EAAE,yBAAyB,EAAE,kBAAkB,EAAE,KAAK,aAAa,EAAE,CAAC;AAE7E,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,CAAC;IAC9E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,sFAAsF;IACtF,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAQD;;;;;;;GAOG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,qBAAqB,EAC9B,OAAO,GAAE,YAAkC,GAC1C,OAAO,CAAC,qBAAqB,CAAC,CAgHhC"}
@@ -25,7 +25,7 @@ import { DEFAULT_IMPORT_TYPES } from "./api/sweep-types.js";
25
25
  * reachable by naming it with `--selector type=...`. Defined in
26
26
  * `./api/sweep-types.ts` and re-exported here, its original home — chant
27
27
  * #1075's ownership-scoped prune needs the same list without pulling the
28
- * import parser into a Temporal worker.
28
+ * import parser in behind the apply activity.
29
29
  */
30
30
  export { DEFAULT_IMPORT_TYPES };
31
31
  export declare function exportResources(options: {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "algorithm": "sha256",
3
3
  "artifacts": {
4
- "manifest.json": "1da8b72c3bd2a53fefd9a5ae0ae56e82ba22c06f9c47fab9d51d9ffa4d6cffa5",
4
+ "manifest.json": "5c4819e96d62042f7bd66f276c2d447f93dcb92105f1fce9a0b820249803c09d",
5
5
  "meta.json": "8b999bc142f448b0b627ecdc9e2388bbe672c8a1f7aae5303135624cf2fe65e3",
6
6
  "types/index.d.ts": "5f67de738adb455805e72600948940af9c664283785fb68c9fd8f5ea90d42cc3",
7
7
  "rules/argo-appset-single-project.ts": "afa9f310753aa2d475f35012b13135b2dfaebed2a35d44edbe185ebc07673674",
@@ -62,8 +62,8 @@
62
62
  "skills/chant-k8s-eks.md": "9e953d6a2c39518c4b797a2bf54ff5b4a33530503e5b6d66e35921e8f952432f",
63
63
  "skills/chant-k8s-gke.md": "8938840bf9ef5ed58d6333fdd773b3dd54ecaf25a9df35e58f7f5c3355d4928f",
64
64
  "skills/chant-k8s-aks.md": "e18f0e2b055f72cd7a37deaf258d7027c2d4d3e286e8fd4975b27a1f981a3ad9",
65
- "skills/chant-k8s-argo.md": "b1a0b826559d8c5033a479c5781efaf650320f0aee4419d8841170bd3393cea5",
65
+ "skills/chant-k8s-argo.md": "24c9a85b78a2fc5c6657424baac9cc6d6caff6f47605b8146b2c0082133181cf",
66
66
  "skills/chant-k8s-flux.md": "9670efc2e9854bd14686b5adeb707396b9030a4dcaee6529b30abf56efe2c50c"
67
67
  },
68
- "composite": "2ba97fe4de1e25b51dcb93e5c1ee40d20783dab70ba03b06d9d14b8bae98bb76"
68
+ "composite": "293e1809032d42cf01169debcfa6fd95d04dd9e66b2c08779b9463fdec798f9f"
69
69
  }
@@ -1 +1 @@
1
- {"version":3,"file":"audit-catalog.d.ts","sourceRoot":"","sources":["../../src/lint/audit-catalog.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAqD,KAAK,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAElH,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAyCpD,CAAC"}
1
+ {"version":3,"file":"audit-catalog.d.ts","sourceRoot":"","sources":["../../src/lint/audit-catalog.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAqD,KAAK,QAAQ,EAAgB,MAAM,gCAAgC,CAAC;AAGhI,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAyCpD,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Prior art for these audit rules: the open-source tools whose checks cover the
3
+ * same condition, credited per rule. See packages/core/src/audit/prior-art.ts for
4
+ * the registry, the relation vocabulary, and why this is credit rather than
5
+ * authority. Kept by hand; the prior-art sweep (scripts/prior-art-sweep.ts) reports
6
+ * when a credited tool's index no longer lists a rule cited here.
7
+ */
8
+ import type { Lineage } from "@intentius/chant/audit/catalog";
9
+ export declare const k8sAuditLineage: Record<string, Lineage[]>;
10
+ //# sourceMappingURL=audit-lineage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit-lineage.d.ts","sourceRoot":"","sources":["../../src/lint/audit-lineage.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAC;AAE9D,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAqHrD,CAAC"}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "k8s",
3
- "version": "0.56.0",
3
+ "version": "0.58.0",
4
4
  "chantVersion": ">=0.1.0",
5
5
  "namespace": "K8s",
6
6
  "intrinsics": [],
@@ -10,8 +10,8 @@
10
10
  * `ResourceFetcher` for `waitForReady`.
11
11
  *
12
12
  * It stays **dependency-light** — primitives-only signature (app name /
13
- * namespace / server), no generated Argo CRD types — so a Temporal worker loads
14
- * it cheaply.
13
+ * namespace / server), no generated Argo CRD types — so importing the lexicon's
14
+ * activity module at run time stays cheap.
15
15
  */
16
16
  export interface WaitForArgoSyncArgs {
17
17
  /** Argo Application name. */
@@ -29,7 +29,7 @@ export interface WaitForArgoSyncArgs {
29
29
  insecure?: boolean;
30
30
  /** kubectl context (used when `server` is not set). */
31
31
  context?: string;
32
- /** Poll interval in ms (default 15000). Heartbeats every poll. */
32
+ /** Poll interval in ms (default 15000). */
33
33
  intervalMs?: number;
34
34
  }
35
35
  /** The two status fields the activity gates on. */
@@ -52,7 +52,7 @@ export declare const defaultArgoStatusFetcher: ArgoStatusFetcher;
52
52
  * `ArgoSyncFailedError` if it reaches a terminal unhealthy state (Degraded /
53
53
  * Missing).
54
54
  *
55
- * Delegates the poll loop, heartbeat, and ready/terminal evaluation to the
55
+ * Delegates the poll loop and the ready/terminal evaluation to the
56
56
  * generic `waitForReady` using the shared `argoproj.io/Application` readiness
57
57
  * spec. The Argo `ArgoStatusFetcher` is adapted into a `ResourceFetcher` that
58
58
  * shapes `{health, sync}` into the `status.health.status` / `status.sync.status`
@@ -1 +1 @@
1
- {"version":3,"file":"argo.d.ts","sourceRoot":"","sources":["../../../src/op/activities/argo.ts"],"names":[],"mappings":"AAMA;;;;;;;;;;;;;;GAcG;AAEH,MAAM,WAAW,mBAAmB;IAClC,6BAA6B;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,oEAAoE;IACpE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kEAAkE;IAClE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,uDAAuD;IACvD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kEAAkE;IAClE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,mDAAmD;AACnD,MAAM,WAAW,aAAa;IAC5B,4FAA4F;IAC5F,MAAM,EAAE,MAAM,CAAC;IACf,iDAAiD;IACjD,IAAI,EAAE,MAAM,CAAC;CACd;AAED,2EAA2E;AAC3E,MAAM,MAAM,iBAAiB,GAAG,CAC9B,IAAI,EAAE,mBAAmB,EACzB,MAAM,CAAC,EAAE,WAAW,KACjB,OAAO,CAAC,aAAa,CAAC,CAAC;AAE5B,4EAA4E;AAC5E,qBAAa,mBAAoB,SAAQ,KAAK;gBAChC,OAAO,EAAE,MAAM;CAI5B;AA4CD,oEAAoE;AACpE,eAAO,MAAM,wBAAwB,EAAE,iBACkC,CAAC;AAE1E;;;;;;;;;;;;;GAaG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,mBAAmB,EACzB,MAAM,CAAC,EAAE,WAAW,EACpB,OAAO,GAAE,iBAA4C,GACpD,OAAO,CAAC,aAAa,CAAC,CAkCxB"}
1
+ {"version":3,"file":"argo.d.ts","sourceRoot":"","sources":["../../../src/op/activities/argo.ts"],"names":[],"mappings":"AAMA;;;;;;;;;;;;;;GAcG;AAEH,MAAM,WAAW,mBAAmB;IAClC,6BAA6B;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,oEAAoE;IACpE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kEAAkE;IAClE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,uDAAuD;IACvD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2CAA2C;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,mDAAmD;AACnD,MAAM,WAAW,aAAa;IAC5B,4FAA4F;IAC5F,MAAM,EAAE,MAAM,CAAC;IACf,iDAAiD;IACjD,IAAI,EAAE,MAAM,CAAC;CACd;AAED,2EAA2E;AAC3E,MAAM,MAAM,iBAAiB,GAAG,CAC9B,IAAI,EAAE,mBAAmB,EACzB,MAAM,CAAC,EAAE,WAAW,KACjB,OAAO,CAAC,aAAa,CAAC,CAAC;AAE5B,4EAA4E;AAC5E,qBAAa,mBAAoB,SAAQ,KAAK;gBAChC,OAAO,EAAE,MAAM;CAI5B;AA4CD,oEAAoE;AACpE,eAAO,MAAM,wBAAwB,EAAE,iBACkC,CAAC;AAE1E;;;;;;;;;;;;;GAaG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,mBAAmB,EACzB,MAAM,CAAC,EAAE,WAAW,EACpB,OAAO,GAAE,iBAA4C,GACpD,OAAO,CAAC,aAAa,CAAC,CAkCxB"}
@@ -1,21 +1,23 @@
1
1
  /**
2
2
  * k8s Op activities — resolved by the core activity registry when a project's
3
- * `chant.config.ts` lists the `k8s` lexicon. Relocated from the temporal lexicon
3
+ * `chant.config.ts` lists the `k8s` lexicon. Relocated from the hosting lexicon
4
4
  * (#809) so Kubernetes-facing imperative activities live with their product:
5
5
  * - kubectlApply — server-side apply a rendered manifest (and, since chant
6
6
  * #1075, prune chant-owned objects it no longer declares; `applyManifest`
7
- * is the same work with a report of what it did, which is what the
8
- * Temporal lexicon's `nativeApply` dispatcher calls for a kubectl target)
7
+ * is the same work with a report of what it did, which is what core's
8
+ * `nativeApply` dispatcher calls for a kubectl target)
9
9
  * - waitForArgoSync — block until an Argo CD Application is Healthy && Synced
10
10
  *
11
11
  * k3dUp / k3dDown moved again, to the k3d lexicon (chant #1410) — a lexicon
12
12
  * owns its own product's activities, and k3d is its own product now. Projects
13
13
  * using them list `k3d` in `lexicons`; loadActivities(["k3d"]) provides them.
14
14
  *
15
- * The step builders (kubectlApply, k3dUp, k3dDown) stay in core, re-exported from
16
- * the temporal Op-authoring barrel like the other core builders. Each activity is
17
- * dependency-light — it shells out to a CLI and does not import the k8s declarable
18
- * surface — so a Temporal worker loads it cheaply.
15
+ * The step builders (kubectlApply, k3dUp, k3dDown) stay in core and reach
16
+ * authors through `@intentius/chant/op` like the other core builders. Each
17
+ * activity is dependency-light — it shells out to a CLI and does not import the
18
+ * k8s declarable surface — so `loadActivities`
19
+ * (`packages/core/src/op/activity-registry.ts`), which imports this module at
20
+ * run time, pulls in nothing expensive.
19
21
  */
20
22
  export { kubectlApply, applyManifest, readManifestDocuments } from "./kubectl.js";
21
23
  export type { KubectlApplyArgs, ApplyManifestResult, AppliedRef, ApplyDeleteMode } from "./kubectl.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/op/activities/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAC/E,YAAY,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAMpG,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,YAAY,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAEhE,OAAO,EAAE,eAAe,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,QAAQ,CAAC;AACxF,YAAY,EAAE,mBAAmB,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AAEpF,OAAO,EACL,YAAY,EACZ,sBAAsB,EACtB,kBAAkB,EAClB,oBAAoB,EACpB,YAAY,EACZ,OAAO,EACP,aAAa,EACb,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,gBAAgB,EAChB,eAAe,EACf,aAAa,EACb,cAAc,EACd,cAAc,EACd,SAAS,GACV,MAAM,kBAAkB,CAAC;AAW1B,OAAO,EAAE,oBAAoB,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AACrG,YAAY,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/op/activities/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAC/E,YAAY,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAMpG,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,YAAY,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAEhE,OAAO,EAAE,eAAe,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,QAAQ,CAAC;AACxF,YAAY,EAAE,mBAAmB,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AAEpF,OAAO,EACL,YAAY,EACZ,sBAAsB,EACtB,kBAAkB,EAClB,oBAAoB,EACpB,YAAY,EACZ,OAAO,EACP,aAAa,EACb,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,gBAAgB,EAChB,eAAe,EACf,aAAa,EACb,cAAc,EACd,cAAc,EACd,SAAS,GACV,MAAM,kBAAkB,CAAC;AAW1B,OAAO,EAAE,oBAAoB,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AACrG,YAAY,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC"}
@@ -3,9 +3,9 @@
3
3
  *
4
4
  * chant #1074 moved this off `kubectl apply -f`. The activity contract is
5
5
  * unchanged (a manifest path, an optional context, `Promise<void>`, the
6
- * `longInfra` profile's 15s heartbeat) because Temporal workers register it by
7
- * that signature; what changed is underneath. The name is kept for the same
8
- * reason.
6
+ * `longInfra` profile) because an Op step names the activity by its export
7
+ * name and core's registry resolves it there; what changed is underneath. The
8
+ * name is kept for the same reason.
9
9
  *
10
10
  * chant #1075 finished the job on two axes:
11
11
  *
@@ -35,14 +35,14 @@ import { type K8sConnector } from "../../api/connect.js";
35
35
  /**
36
36
  * How the apply treats chant-owned objects that are no longer declared. The
37
37
  * same three values `nativeApply` has always taken; `gated` differs from
38
- * `owned-only` only in that the workflow pauses for approval first, which is
39
- * the composite's business, not this activity's.
38
+ * `owned-only` only in that an approval gate runs before this activity does,
39
+ * which is the composite's business, not this activity's.
40
40
  */
41
41
  export type ApplyDeleteMode = "never" | "owned-only" | "gated";
42
42
  export interface KubectlApplyArgs {
43
43
  /**
44
44
  * Path to a manifest file, or a directory of them. With `documents` given,
45
- * this becomes only the human-facing label the heartbeats and logs carry
45
+ * this becomes only the human-facing label the step's log lines carry
46
46
  * (e.g. `kustomize:<dir>`), and nothing is read from disk.
47
47
  */
48
48
  manifest: string;
@@ -151,7 +151,7 @@ export declare function resolveFieldManager(args: KubectlApplyArgs): Promise<str
151
151
  export declare function applyManifest(args: KubectlApplyArgs, signal?: AbortSignal, connect?: K8sConnector): Promise<ApplyManifestResult>;
152
152
  /**
153
153
  * Apply every document in `args.manifest`.
154
- * Uses longInfra profile 20m timeout, heartbeat every 15s.
154
+ * Uses the longInfra profile: 20m timeout, three attempts backing off from 30s.
155
155
  */
156
156
  export declare function kubectlApply(args: KubectlApplyArgs, signal?: AbortSignal, connect?: K8sConnector): Promise<void>;
157
157
  //# sourceMappingURL=kubectl.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"kubectl.d.ts","sourceRoot":"","sources":["../../../src/op/activities/kubectl.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAYH,OAAO,KAAK,EAAa,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAuB,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAK3E;;;;;GAKG;AACH,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,YAAY,GAAG,OAAO,CAAC;AAE/D,MAAM,WAAW,gBAAgB;IAC/B;;;;OAIG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,SAAS,EAAE,CAAC;IACxB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;;OAIG;IACH,UAAU,CAAC,EAAE,eAAe,CAAC;IAC7B;;;;;;;OAOG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,sFAAsF;IACtF,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,oCAAoC;AACpC,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,sCAAsC;AACtC,MAAM,WAAW,mBAAmB;IAClC,qDAAqD;IACrD,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,sFAAsF;IACtF,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB;;;;;;;OAOG;IACH,QAAQ,CAAC,EAAE,UAAU,EAAE,CAAC;CACzB;AAED,+EAA+E;AAC/E,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAiB7E;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAEjF;AAqHD;;;;;;;GAOG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,gBAAgB,EACtB,MAAM,CAAC,EAAE,WAAW,EACpB,OAAO,GAAE,YAAkC,GAC1C,OAAO,CAAC,mBAAmB,CAAC,CAkE9B;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,gBAAgB,EACtB,MAAM,CAAC,EAAE,WAAW,EACpB,OAAO,GAAE,YAAkC,GAC1C,OAAO,CAAC,IAAI,CAAC,CAEf"}
1
+ {"version":3,"file":"kubectl.d.ts","sourceRoot":"","sources":["../../../src/op/activities/kubectl.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAWH,OAAO,KAAK,EAAa,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAuB,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAK3E;;;;;GAKG;AACH,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,YAAY,GAAG,OAAO,CAAC;AAE/D,MAAM,WAAW,gBAAgB;IAC/B;;;;OAIG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,SAAS,EAAE,CAAC;IACxB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;;OAIG;IACH,UAAU,CAAC,EAAE,eAAe,CAAC;IAC7B;;;;;;;OAOG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,sFAAsF;IACtF,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,oCAAoC;AACpC,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,sCAAsC;AACtC,MAAM,WAAW,mBAAmB;IAClC,qDAAqD;IACrD,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,sFAAsF;IACtF,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB;;;;;;;OAOG;IACH,QAAQ,CAAC,EAAE,UAAU,EAAE,CAAC;CACzB;AAED,+EAA+E;AAC/E,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAiB7E;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAEjF;AAqHD;;;;;;;GAOG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,gBAAgB,EACtB,MAAM,CAAC,EAAE,WAAW,EACpB,OAAO,GAAE,YAAkC,GAC1C,OAAO,CAAC,mBAAmB,CAAC,CAqD9B;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,gBAAgB,EACtB,MAAM,CAAC,EAAE,WAAW,EACpB,OAAO,GAAE,YAAkC,GAC1C,OAAO,CAAC,IAAI,CAAC,CAEf"}
@@ -4,8 +4,8 @@ import { type K8sConnector } from "../../api/connect.js";
4
4
  * ready, driven by a data-only **readiness spec** rather than per-CRD code.
5
5
  *
6
6
  * Like `waitForArgoSync`, this activity is intentionally **dependency-light**:
7
- * its signature is primitives + a plain readiness spec, so a Temporal worker
8
- * loads it without importing the generated CRD declarable surface. It reads the
7
+ * its signature is primitives + a plain readiness spec, so the activity module
8
+ * loads without pulling in the generated CRD declarable surface. It reads the
9
9
  * resource and evaluates the spec's predicates. It generalizes the bespoke
10
10
  * `waitForArgoSync` / `waitForStack` waits — see #365.
11
11
  *
@@ -99,7 +99,7 @@ export interface WaitForReadyArgs {
99
99
  group?: string;
100
100
  /** Explicit readiness spec — wins over the registry/default. */
101
101
  spec?: ReadinessSpec;
102
- /** Poll interval in ms (default 15000). Heartbeats every poll. */
102
+ /** Poll interval in ms (default 15000). */
103
103
  intervalMs?: number;
104
104
  }
105
105
  /** Pluggable resource reader — overridden in tests with a fake. */
@@ -121,8 +121,9 @@ export declare function apiResourceFetcher(connect?: K8sConnector): ResourceFetc
121
121
  export declare const defaultResourceFetcher: ResourceFetcher;
122
122
  /**
123
123
  * Poll until the resource satisfies its readiness spec. Throws
124
- * `ReadinessFailedError` on a terminal state. Heartbeats every poll so the
125
- * `k8sWait` profile's 60s heartbeat timeout never trips.
124
+ * `ReadinessFailedError` on a terminal state, which the `k8sWait` profile lists
125
+ * as non-retryable, so a resource that will never become ready fails on the
126
+ * first attempt instead of burning the profile's 15m timeout three times.
126
127
  *
127
128
  * @param fetcher injectable reader (defaults to kubectl). Tests pass a fake to
128
129
  * drive not-ready → ready / terminal transitions.
@@ -1 +1 @@
1
- {"version":3,"file":"wait-for-ready.d.ts","sourceRoot":"","sources":["../../../src/op/activities/wait-for-ready.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"wait-for-ready.d.ts","sourceRoot":"","sources":["../../../src/op/activities/wait-for-ready.ts"],"names":[],"mappings":"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"}
@@ -18,20 +18,20 @@
18
18
  * earlier step's declared output.
19
19
  *
20
20
  * `core`'s own `kubectlApply`/`waitForReady`/`ensureSecret` (in
21
- * `@intentius/chant/op`, re-exported from `@intentius/chant-lexicon-temporal`
22
- * for lexicon-agnostic single-import convenience) are UNCHANGED and produce
23
- * byte-identical `ActivityStep` output for the same inputs these are purely
24
- * additive. Deliberately not swapped into the temporal barrel: that would
25
- * make `@intentius/chant-lexicon-temporal` depend on this package (and on
26
- * helm, for `helmInstall`) at runtime, which is exactly the "a worker image
27
- * needs no kubectl binary" / "temporal stays product-agnostic" property the
21
+ * `@intentius/chant/op`, the lexicon-agnostic single-import barrel) are
22
+ * UNCHANGED and produce byte-identical `ActivityStep` output for the same
23
+ * inputs these are purely additive. Deliberately not swapped into core's
24
+ * barrel: that would make `@intentius/chant` depend on this package (and on
25
+ * helm, for `helmInstall`) at runtime, so a project that never touches
26
+ * Kubernetes would install both just to import anything from `op`. That is
27
+ * exactly the "core stays product-agnostic" property the
28
28
  * `op/activities/index.ts` module docs across this repo call out on purpose
29
- * (activities were moved OUT of temporal into per-product lexicons for this
30
- * reason; the step-builder layer shouldn't reintroduce the coupling from the
31
- * other direction). An author who wants the typed surface imports it from
32
- * here — `@intentius/chant-lexicon-k8s` — which a project using `kubectlApply`
33
- * already depends on; existing `@intentius/chant-lexicon-temporal` imports
34
- * keep working exactly as before, opting in only if the import is changed.
29
+ * (activities live in per-product lexicons for this reason; the step-builder
30
+ * layer shouldn't reintroduce the coupling from the other direction). An
31
+ * author who wants the typed surface imports it from here —
32
+ * `@intentius/chant-lexicon-k8s` — which a project using `kubectlApply`
33
+ * already depends on; existing `@intentius/chant/op` imports keep working
34
+ * exactly as before, opting in only if the import is changed.
35
35
  */
36
36
  import { type ActivityStep, type NamedActivityStep, type WithStepRefs } from "@intentius/chant/op";
37
37
  import type { KubectlApplyArgs } from "./activities/kubectl.js";
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  skill: chant-k8s-argo
3
- description: Argo CD composites for GitOps reconciliation — ArgoAppFor, ArgoAppSetForRegions, AppProject scoping, cluster registration, and the Argo-vs-Temporal split
3
+ description: Argo CD composites for GitOps reconciliation — ArgoAppFor, ArgoAppSetForRegions, AppProject scoping, cluster registration, and how a deploy splits between Argo and a chant Op
4
4
  user-invocable: true
5
5
  ---
6
6
 
@@ -14,9 +14,9 @@ Chant authors typed infrastructure into manifests. Argo CD continuously reconcil
14
14
  |---|---|---|
15
15
  | **Chant** | Authoring typed infra → manifests | the lexicons |
16
16
  | **Argo CD** | Continuously reconciling declarative manifests (the apply layer) | `ArgoAppFor` / `ArgoAppSetForRegions` |
17
- | **Temporal** | Procedural steps Argo can't express ordering, signals, human gates, one-shot RPCs | the temporal lexicon + `waitForArgoSync` |
17
+ | **A chant Op** | Procedural steps Argo can't express: ordering, human gates, one-shot RPCs | an `Op` in the project, plus this lexicon's `waitForArgoSync` |
18
18
 
19
- Rule of thumb: **if it's declarative and converges, let Argo reconcile it. If it's a procedure with ordering, gates, or out-of-band steps, orchestrate it in Temporal.** Prefer Argo CD over Argo Workflows the procedural layer stays Temporal.
19
+ Rule of thumb: **if it's declarative and converges, let Argo reconcile it. If it's a procedure with ordering, gates, or out-of-band steps, write it as a chant Op and run it from CI or a steward.** Prefer Argo CD over Argo Workflows; the procedural layer stays an Op.
20
20
 
21
21
  ## Prerequisites
22
22
 
@@ -138,9 +138,9 @@ Produces a `Secret` labelled `argocd.argoproj.io/secret-type: cluster`. After th
138
138
 
139
139
  ---
140
140
 
141
- ## The Argo-vs-Temporal split
141
+ ## Splitting a deploy between Argo and an Op
142
142
 
143
- When a deploy has both declarative and procedural parts, let each layer own what it's good at. Example the multi-region CockroachDB deploy:
143
+ When a deploy has both declarative and procedural parts, let each layer own what it's good at. Example, the multi-region CockroachDB deploy:
144
144
 
145
145
  | Step | Owner | Why |
146
146
  |---|---|---|
@@ -148,16 +148,30 @@ When a deploy has both declarative and procedural parts, let each layer own what
148
148
  | Install ESO / operators (Helm) | **Argo** | Declarative Helm source |
149
149
  | Apply per-cluster K8s manifests | **Argo** (`ApplicationSet`) | One App per workload cluster |
150
150
  | Wait for workloads Healthy | **Argo** (`Health=Healthy`) | Subsumed by Application health |
151
- | Wait for DNS delegation | **Temporal** | Signal/update/auto-poll race out of band |
152
- | Generate + push TLS certs | **Temporal** | One-shot procedure, secrets not in git |
153
- | `cockroach init`, configure regions | **Temporal** | Ordered one-shot RPCs |
154
-
155
- From a Temporal workflow, gate procedural steps on Argo finishing a declarative apply with the `waitForArgoSync` activity (temporal lexicon, `argoSync` profile):
151
+ | Wait for DNS delegation | **an Op** | Out of band, and a human confirms it |
152
+ | Generate + push TLS certs | **an Op** | One-shot procedure, secrets not in git |
153
+ | `cockroach init`, configure regions | **an Op** | Ordered one-shot RPCs |
154
+
155
+ Argo owns the sync. The Op owns the ordering and the gates: its phases run in
156
+ sequence in one process (`packages/core/src/op/local-executor.ts`), and a `gate`
157
+ step reads the gate ledger, so a run that reaches a gate nobody has approved
158
+ records the pending fact, ends with status `gated` and exits 3. Someone runs
159
+ `chant approve <op> <gate>`, the next run reads the resolution and walks
160
+ through. CI is what runs the Op, on whatever cadence the Op's `schedule`
161
+ names.
162
+
163
+ To make a step wait on Argo, use this lexicon's `waitForArgoSync` activity. It is
164
+ exported from `lexicons/k8s/src/op/activities/index.ts`, and the core activity
165
+ registry resolves it by export name once `k8s` is in the project's `lexicons`.
166
+ Give the step core's `argoSync` profile
167
+ (`packages/core/src/op/activity-profiles.ts`): a 30m timeout, five attempts
168
+ backing off from 10s, and `ArgoSyncFailedError` marked non-retryable so a
169
+ terminally unhealthy Application fails fast instead of polling to the cap.
156
170
 
157
171
  ```typescript
158
- // In a Temporal Op workflow:
159
- await waitForArgoSync({ appName: "east-crdb", namespace: "argocd" });
160
- // ...now run the procedural steps that depend on the workloads being Healthy.
172
+ // In an Op phase:
173
+ activity("waitForArgoSync", { appName: "east-crdb", namespace: "argocd" }, "argoSync"),
174
+ // Later steps in the phase run once the workloads are Healthy.
161
175
  ```
162
176
 
163
177
  `waitForArgoSync` is dependency-free — it polls the Application's status (`health=Healthy && sync=Synced`) and never imports the Argo CRD types.