@intentius/chant 0.72.4 → 0.73.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/build.d.ts CHANGED
@@ -110,6 +110,15 @@ export interface BuildOptions {
110
110
  * (unchanged behavior/performance).
111
111
  */
112
112
  sandbox?: boolean;
113
+ /**
114
+ * spec 2.0, `ι = executing` — invoke project-owned code at `F-Call` step 6
115
+ * instead of falling back. See {@link DiscoveryOptions.executing}.
116
+ *
117
+ * The fold's value is then what a run computes in this process, environment
118
+ * and all, which is why `open` is the default and is strict. Mutually
119
+ * exclusive with {@link sandbox}. Default `false`.
120
+ */
121
+ executing?: boolean;
113
122
  /**
114
123
  * chant #1064 — this build's resolved build-time parameter values (see
115
124
  * ./build-params.ts's `resolveBuildParams`, driven by the CLI's
@@ -1 +1 @@
1
- {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../src/build.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../src/build.ts"],"names":[],"mappings":"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"}
@@ -40,7 +40,52 @@ export interface CoreOutput extends Declarable {
40
40
  readonly value: unknown;
41
41
  }
42
42
  /**
43
- * Type guard to check if a value is a Declarable
43
+ * Type guard to check if a value is a Declarable.
44
+ *
45
+ * chant#2444 — accepts an entity a HOST built, not only one chant built.
46
+ *
47
+ * `F-Host-Interface` item 1 says an entity carries a non-enumerable declarable
48
+ * marker, and a host supplies its own: the specification's conformance host
49
+ * marks with `Symbol.for("tsad.conformance.declarable")`. Testing identity
50
+ * against chant's symbol alone refused those for not being chant's rather than
51
+ * for being malformed, which is what chant#2442 hit inside composite member
52
+ * validation and what would otherwise keep biting in the entity tallies and the
53
+ * revival pass-through.
54
+ *
55
+ * ## Why NOT the reference implementation's reading
56
+ *
57
+ * The reference reads L6.1 as "any own symbol or non-enumerable own property",
58
+ * which is right in its domain and **unsafe in chant's**. Two measurements say
59
+ * so, and both were taken rather than assumed:
60
+ *
61
+ * - A real chant entity's non-enumerable own NAMES are `lexicon`,
62
+ * `entityType`, `kind`, `props`, `attributes`, `Ref`. "Any non-enumerable
63
+ * own property" is therefore close to "any chant object at all".
64
+ * - chant has SEVEN marker symbols, not one — `chant.intrinsic`,
65
+ * `chant.composite`, `chant.stackOutput`, `chant.lexiconOutput`,
66
+ * `chant.effect-receipt`, `chant.secret-declaration`, `chant.childProject`
67
+ * — each a non-enumerable own symbol set to `true`. Under "any own symbol"
68
+ * an Intrinsic and a StackOutput both classify as Declarable, which is a
69
+ * worse bug than the one being fixed: they would enter the entity tallies.
70
+ *
71
+ * The reference can read any symbol because its domain has one. chant
72
+ * distinguishes seven kinds BY symbol identity, so it needs the marker's name.
73
+ * Hence the suffix: the marker must say `declarable`, whoever owns it.
74
+ *
75
+ * ## What the suffix cannot do
76
+ *
77
+ * It is a convention, not a registry. A host that marks with, say,
78
+ * `Symbol.for("acme.entity")` carries a perfectly good non-enumerable marker
79
+ * and is refused here, because nothing in this function knows that package is
80
+ * one the caller named. The context that would settle it —
81
+ * `FoldProjectOptions.lexiconPackages`, chant#2438 — lives in the fold path and
82
+ * does not reach a type guard called from a dozen places.
83
+ *
84
+ * That is a deliberate trade, not an oversight: a convention that refuses an
85
+ * unknown-but-valid marker costs a host one symbol name, while a rule loose
86
+ * enough to accept any marker miscounts chant's own seven kinds on every build.
87
+ * If a real host ever needs the other side of it, the fix is to thread the
88
+ * named packages through rather than to widen the test.
44
89
  */
45
90
  export declare function isDeclarable(value: unknown): value is Declarable;
46
91
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"declarable.d.ts","sourceRoot":"","sources":["../src/declarable.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,iBAAiB,eAAiC,CAAC;AAEhE;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,CAAC,EAAE,UAAU,GAAG,UAAU,GAAG,QAAQ,CAAC;IACnD,QAAQ,CAAC,CAAC,iBAAiB,CAAC,EAAE,IAAI,CAAC;CACpC;AAED;;;;;GAKG;AACH,MAAM,WAAW,kBAAmB,SAAQ,UAAU;IACpD,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,UAAU,GAAG,KAAK,IAAI,kBAAkB,CAEnF;AAED;;GAEG;AACH,MAAM,WAAW,aAAc,SAAQ,UAAU;IAC/C,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,UAAW,SAAQ,UAAU;IAC5C,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,UAAU,CAOhE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAE/D"}
1
+ {"version":3,"file":"declarable.d.ts","sourceRoot":"","sources":["../src/declarable.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,iBAAiB,eAAiC,CAAC;AAEhE;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,CAAC,EAAE,UAAU,GAAG,UAAU,GAAG,QAAQ,CAAC;IACnD,QAAQ,CAAC,CAAC,iBAAiB,CAAC,EAAE,IAAI,CAAC;CACpC;AAED;;;;;GAKG;AACH,MAAM,WAAW,kBAAmB,SAAQ,UAAU;IACpD,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,UAAU,GAAG,KAAK,IAAI,kBAAkB,CAEnF;AAED;;GAEG;AACH,MAAM,WAAW,aAAc,SAAQ,UAAU;IAC/C,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,UAAW,SAAQ,UAAU;IAC5C,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB;AAWD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,UAAU,CAKhE;AAeD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAE/D"}
@@ -1 +1 @@
1
- {"version":3,"file":"fold-import.d.ts","sourceRoot":"","sources":["../../src/discovery/fold-import.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fold-import.d.ts","sourceRoot":"","sources":["../../src/discovery/fold-import.ts"],"names":[],"mappings":"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"}
@@ -92,6 +92,20 @@ export interface DiscoveryOptions {
92
92
  * process, no IPC) and fold coverage, is unchanged unless requested.
93
93
  */
94
94
  sandbox?: boolean;
95
+ /**
96
+ * spec 2.0, `ι = executing` — invoke project-owned code at `F-Call` step 6
97
+ * rather than falling back.
98
+ *
99
+ * `F-Call` step 5 makes a declarator whose callee resolves to a project file
100
+ * `run` under every other mode, so a build that wants the value a run would
101
+ * compute has to say so. The value is then this process's: the factory body
102
+ * and its module's top level execute here, environment and all, which is
103
+ * exactly why it cannot be the default.
104
+ *
105
+ * Mutually exclusive with {@link sandbox}, which refuses to import project
106
+ * code at all. Asking for both is a contradiction rather than a preference.
107
+ */
108
+ executing?: boolean;
95
109
  /**
96
110
  * chant #1064 — this build's resolved build-time parameter values (see
97
111
  * ../build-params.ts's `resolveBuildParams`, driven by the CLI's
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/discovery/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAQ/C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AA8D1D;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B,6DAA6D;IAC7D,IAAI,EAAE,MAAM,CAAC;IACb,uFAAuF;IACvF,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;IACrB,gGAAgG;IAChG,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iFAAiF;IACjF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;;;;;;;;;;OAaG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;;;;;;;OAUG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IAEf;;;;;;;OAOG;IACH,UAAU,CAAC,EAAE,YAAY,EAAE,CAAC;IAE5B;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAE7B;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;;;;;;;;;OAUG;IACH,WAAW,CAAC,EAAE,oBAAoB,EAAE,CAAC;CACtC;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,8CAA8C;IAC9C,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAClC,8DAA8D;IAC9D,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IACvC,qDAAqD;IACrD,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,mDAAmD;IACnD,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB;;;OAGG;IACH,aAAa,EAAE,YAAY,EAAE,CAAC;CAC/B;AAED;;;;;;;;GAQG;AACH,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC,CAiSjG"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/discovery/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAQ/C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AA8D1D;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B,6DAA6D;IAC7D,IAAI,EAAE,MAAM,CAAC;IACb,uFAAuF;IACvF,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;IACrB,gGAAgG;IAChG,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iFAAiF;IACjF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;;;;;;;;;;OAaG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;;;;;;;OAUG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IAEf;;;;;;;OAOG;IACH,UAAU,CAAC,EAAE,YAAY,EAAE,CAAC;IAE5B;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAE7B;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;;;;;;;;;OAYG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;;;;;;;;;OAUG;IACH,WAAW,CAAC,EAAE,oBAAoB,EAAE,CAAC;CACtC;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,8CAA8C;IAC9C,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAClC,8DAA8D;IAC9D,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IACvC,qDAAqD;IACrD,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,mDAAmD;IACnD,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB;;;OAGG;IACH,aAAa,EAAE,YAAY,EAAE,CAAC;CAC/B;AAED;;;;;;;;GAQG;AACH,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC,CA8SjG"}
@@ -1 +1 @@
1
- {"version":3,"file":"driver.d.ts","sourceRoot":"","sources":["../../../src/discovery/sandbox/driver.ts"],"names":[],"mappings":"AA4DA,MAAM,WAAW,qBAAqB;IACpC,qIAAqI;IACrI,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,oNAAoN;IACpN,SAAS,EAAE,MAAM,CAAC;CACnB;AAOD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,qBAAqB,GAAG,MAAM,CA6F3E;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,0BAA0B,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CA6CrE;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAmGjF"}
1
+ {"version":3,"file":"driver.d.ts","sourceRoot":"","sources":["../../../src/discovery/sandbox/driver.ts"],"names":[],"mappings":"AA4DA,MAAM,WAAW,qBAAqB;IACpC,qIAAqI;IACrI,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,oNAAoN;IACpN,SAAS,EAAE,MAAM,CAAC;CACnB;AAOD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,qBAAqB,GAAG,MAAM,CAsH3E;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,0BAA0B,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CA6CrE;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAmGjF"}
@@ -207,13 +207,28 @@ import { type IntrinsicDef } from "../lexicon.js";
207
207
  * binding whatever an invoked factory returns is what chant never checked
208
208
  * (`L8.19`), and a declarator reaching a call through a const alias is what
209
209
  * chant resolves while refusing a call nested elsewhere (`L2.18`).
210
+ * - **1.7** put `F-Eval-CallLocal` before the two registered call shapes, so a
211
+ * call through a name the project bound is the project function's call
212
+ * whatever the registry says. That is what chant's whole-build fold already
213
+ * did, and the reason the specification moved rather than chant: probes with
214
+ * chant's own `output` showed the binding-first order living in
215
+ * `resolveCallExpression`, while `L2.11` described the expression
216
+ * classifier. The two were never required to share an order.
217
+ * - **1.8** added `ι = executing`, and chant carries it as of `0.72.3`
218
+ * (#2455) — `FoldProjectOptions.executing`, mutually exclusive with
219
+ * `sandbox`. `open` stays the default and stays strict (#2453).
210
220
  *
211
221
  * `scripts/check-docs-citations.ts` refuses to run when this constant and the
212
- * pinned specification disagree, so `.github/workflows/docs-check.yml` pins the
213
- * `spec-1.6` commit and the two move together. That coupling is deliberate: it
214
- * is what stops the docs being gated against a rule set nobody writes against.
222
+ * rules it loads disagree, so this and the `@intentius/tsad-conformance`
223
+ * devDependency move together. That coupling is deliberate: it is what stops
224
+ * the docs being gated against a rule set nobody writes against — which is
225
+ * exactly what happened while this sat at `1.0` through six versions, passing
226
+ * because both sides were equally stale.
227
+ *
228
+ * Until chant#2470 the rules came from a commit `docs-check.yml` checked out;
229
+ * now they come from the published package, so bumping it is what moves this.
215
230
  */
216
- export declare const SPEC_VERSION = "1.6";
231
+ export declare const SPEC_VERSION = "2.1";
217
232
  /** The two EVL rule ids a shape violation can be attributed to. */
218
233
  export type SubsetRuleId = "EVL001" | "EVL003";
219
234
  /** A located, shape-level rejection: the offending node, the EVL rule id it maps to, and a message. */
@@ -1 +1 @@
1
- {"version":3,"file":"subset.d.ts","sourceRoot":"","sources":["../../src/fold/subset.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAEjC,OAAO,EAAiD,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAE9F;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwKG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,eAAO,MAAM,YAAY,QAAQ,CAAC;AAElC,mEAAmE;AACnE,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE/C,uGAAuG;AACvG,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC;IACd,MAAM,EAAE,YAAY,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB;AAMD,0FAA0F;AAC1F,eAAO,MAAM,0BAA0B,EAAE,WAAW,CAAC,EAAE,CAAC,UAAU,CAchE,CAAC;AAEH,oFAAoF;AACpF,eAAO,MAAM,yBAAyB,EAAE,WAAW,CAAC,EAAE,CAAC,UAAU,CAG/D,CAAC;AAEH,gHAAgH;AAChH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,EAAE,CAAC,YAAY,GACpB,IAAI,IAAI,EAAE,CAAC,UAAU,GAAG,EAAE,CAAC,aAAa,GAAG,EAAE,CAAC,cAAc,CAE9D;AAED,6GAA6G;AAC7G,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,GAAG,IAAI,IAAI,EAAE,CAAC,aAAa,GAAG,EAAE,CAAC,cAAc,CAErG;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,SAAS,SAAK,GAAG,MAAM,CAGnE;AAMD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,GAAG,WAAW,CAAC,MAAM,CAAC,CAoDpF;AAgCD,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,GAAG,MAAM,CAEzE;AAED,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,GAAG,MAAM,CAE1E;AAED,eAAO,MAAM,iCAAiC,8BAA8B,CAAC;AAE7E,eAAO,MAAM,yBAAyB,sBAAsB,CAAC;AAE7D,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,GAAG,MAAM,CAEtE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,EAAE,CAAC,cAAc,GAAG,MAAM,CAErE;AAED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,MAAM,CAElE;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,EAAE,CAAC,wBAAwB,EACjC,UAAU,CAAC,EAAE,SAAS,YAAY,EAAE,GACnC,eAAe,GAAG,SAAS,CAc7B;AAWD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,EAAE,CAAC,IAAI,EACb,UAAU,CAAC,EAAE,SAAS,YAAY,EAAE,GACnC,eAAe,GAAG,SAAS,CAkO7B"}
1
+ {"version":3,"file":"subset.d.ts","sourceRoot":"","sources":["../../src/fold/subset.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAEjC,OAAO,EAAiD,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAE9F;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwKG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0DG;AACH,eAAO,MAAM,YAAY,QAAQ,CAAC;AAElC,mEAAmE;AACnE,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE/C,uGAAuG;AACvG,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC;IACd,MAAM,EAAE,YAAY,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB;AAMD,0FAA0F;AAC1F,eAAO,MAAM,0BAA0B,EAAE,WAAW,CAAC,EAAE,CAAC,UAAU,CAchE,CAAC;AAEH,oFAAoF;AACpF,eAAO,MAAM,yBAAyB,EAAE,WAAW,CAAC,EAAE,CAAC,UAAU,CAG/D,CAAC;AAEH,gHAAgH;AAChH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,EAAE,CAAC,YAAY,GACpB,IAAI,IAAI,EAAE,CAAC,UAAU,GAAG,EAAE,CAAC,aAAa,GAAG,EAAE,CAAC,cAAc,CAE9D;AAED,6GAA6G;AAC7G,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,GAAG,IAAI,IAAI,EAAE,CAAC,aAAa,GAAG,EAAE,CAAC,cAAc,CAErG;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,SAAS,SAAK,GAAG,MAAM,CAGnE;AAMD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,GAAG,WAAW,CAAC,MAAM,CAAC,CAoDpF;AAgCD,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,GAAG,MAAM,CAEzE;AAED,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,GAAG,MAAM,CAE1E;AAED,eAAO,MAAM,iCAAiC,8BAA8B,CAAC;AAE7E,eAAO,MAAM,yBAAyB,sBAAsB,CAAC;AAE7D,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,GAAG,MAAM,CAEtE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,EAAE,CAAC,cAAc,GAAG,MAAM,CAErE;AAED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,MAAM,CAElE;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,EAAE,CAAC,wBAAwB,EACjC,UAAU,CAAC,EAAE,SAAS,YAAY,EAAE,GACnC,eAAe,GAAG,SAAS,CAc7B;AAWD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,EAAE,CAAC,IAAI,EACb,UAAU,CAAC,EAAE,SAAS,YAAY,EAAE,GACnC,eAAe,GAAG,SAAS,CAkO7B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@intentius/chant",
3
- "version": "0.72.4",
3
+ "version": "0.73.0",
4
4
  "description": "Declarative infrastructure-as-code toolkit — TypeScript on Node.js",
5
5
  "license": "Apache-2.0",
6
6
  "homepage": "https://intentius.io/chant",
package/src/build.ts CHANGED
@@ -209,6 +209,15 @@ export interface BuildOptions {
209
209
  * (unchanged behavior/performance).
210
210
  */
211
211
  sandbox?: boolean;
212
+ /**
213
+ * spec 2.0, `ι = executing` — invoke project-owned code at `F-Call` step 6
214
+ * instead of falling back. See {@link DiscoveryOptions.executing}.
215
+ *
216
+ * The fold's value is then what a run computes in this process, environment
217
+ * and all, which is why `open` is the default and is strict. Mutually
218
+ * exclusive with {@link sandbox}. Default `false`.
219
+ */
220
+ executing?: boolean;
212
221
 
213
222
  /**
214
223
  * chant #1064 — this build's resolved build-time parameter values (see
@@ -676,6 +685,7 @@ export async function build(
676
685
  intrinsics: options?.intrinsics,
677
686
  lexicons: options?.lexicons,
678
687
  sandbox: options?.sandbox,
688
+ executing: options?.executing,
679
689
  buildParams: options?.buildParams,
680
690
  });
681
691
 
@@ -0,0 +1,88 @@
1
+ import { describe, test, expect } from "vitest";
2
+ import { isDeclarable, DECLARABLE_MARKER } from "./declarable";
3
+ import { INTRINSIC_MARKER } from "./intrinsic";
4
+ import { STACK_OUTPUT_MARKER } from "./stack-output";
5
+ import { COMPOSITE_MARKER } from "./composite";
6
+
7
+ /**
8
+ * chant#2444 — `isDeclarable` accepts an entity a HOST built.
9
+ *
10
+ * `F-Host-Interface` item 1 says an entity carries a non-enumerable declarable
11
+ * marker, and a host supplies its own. Testing identity against chant's symbol
12
+ * alone refused those for not being chant's rather than for being malformed —
13
+ * which is what chant#2442 hit inside composite member validation, and what
14
+ * would otherwise keep biting in the entity tallies and the revival
15
+ * pass-through, where it fails silently rather than loudly.
16
+ *
17
+ * The interesting half of this test file is the second describe block. The
18
+ * reference implementation reads the same rule as "any own symbol or
19
+ * non-enumerable own property", which is right for a domain with one marker and
20
+ * wrong for chant, which has seven. Those cases pin the narrowing.
21
+ */
22
+ function marked(symbol: symbol, value: unknown = true): object {
23
+ const o = {};
24
+ Object.defineProperty(o, symbol, { value, enumerable: false });
25
+ return o;
26
+ }
27
+
28
+ describe("isDeclarable accepts a host's marker (chant#2444)", () => {
29
+ test("chant's own marker, which is every entity a chant build makes", () => {
30
+ expect(isDeclarable(marked(DECLARABLE_MARKER))).toBe(true);
31
+ });
32
+
33
+ test("the specification host's marker", () => {
34
+ // The exact symbol `@tsad/shapes` uses. This is the case chant#2442 hit.
35
+ expect(isDeclarable(marked(Symbol.for("tsad.conformance.declarable")))).toBe(true);
36
+ });
37
+
38
+ test("any implementation's, as long as the marker says declarable", () => {
39
+ expect(isDeclarable(marked(Symbol.for("some.other.tool.declarable")))).toBe(true);
40
+ });
41
+
42
+ test("a plain object is not one", () => {
43
+ expect(isDeclarable({})).toBe(false);
44
+ expect(isDeclarable({ entityType: "Bucket", props: {} })).toBe(false);
45
+ expect(isDeclarable(null)).toBe(false);
46
+ expect(isDeclarable("Bucket")).toBe(false);
47
+ });
48
+ });
49
+
50
+ describe("the narrowing, and why the reference's reading is unsafe here", () => {
51
+ test("chant's OTHER markers are not declarable markers", () => {
52
+ // The measurement that decided the implementation. Under "any own symbol",
53
+ // every one of these classifies as an entity and enters the tallies — a
54
+ // worse bug than the one chant#2444 fixes.
55
+ expect(isDeclarable(marked(INTRINSIC_MARKER))).toBe(false);
56
+ expect(isDeclarable(marked(STACK_OUTPUT_MARKER))).toBe(false);
57
+ expect(isDeclarable(marked(COMPOSITE_MARKER))).toBe(false);
58
+ });
59
+
60
+ test("a non-enumerable own NAME is not a marker either", () => {
61
+ // A real chant entity's non-enumerable own names are `lexicon`,
62
+ // `entityType`, `kind`, `props`, `attributes` and `Ref`. Reading "any
63
+ // non-enumerable own property" as the marker is close to "any chant object".
64
+ const o = {};
65
+ Object.defineProperty(o, "props", { value: {}, enumerable: false });
66
+ Object.defineProperty(o, "entityType", { value: "Bucket", enumerable: false });
67
+ expect(isDeclarable(o)).toBe(false);
68
+ });
69
+
70
+ test("an ENUMERABLE declarable symbol is refused", () => {
71
+ // F-Host-Interface item 1 says non-enumerable, and it matters: an
72
+ // enumerable marker travels through a spread and would reach an artifact.
73
+ const o = {};
74
+ Object.defineProperty(o, Symbol.for("x.declarable"), { value: true, enumerable: true });
75
+ expect(isDeclarable(o)).toBe(false);
76
+ });
77
+
78
+ test("a declarable symbol whose value is not true is refused", () => {
79
+ expect(isDeclarable(marked(Symbol.for("x.declarable"), false))).toBe(false);
80
+ expect(isDeclarable(marked(Symbol.for("x.declarable"), "yes"))).toBe(false);
81
+ });
82
+
83
+ test("a symbol that merely contains the word is refused", () => {
84
+ // Suffix, not substring: `declarable.thing` is not a declarable marker.
85
+ expect(isDeclarable(marked(Symbol.for("x.declarable.thing")))).toBe(false);
86
+ expect(isDeclarable(marked(Symbol.for("notdeclarable")))).toBe(false);
87
+ });
88
+ });
package/src/declarable.ts CHANGED
@@ -48,15 +48,80 @@ export interface CoreOutput extends Declarable {
48
48
  }
49
49
 
50
50
  /**
51
- * Type guard to check if a value is a Declarable
51
+ * The suffix a declarable marker's symbol description ends with.
52
+ *
53
+ * chant#2444 — what makes a marker mean "entity" rather than "some other kind
54
+ * of chant value". `Symbol.for("chant.declarable")` has it; so does the
55
+ * specification host's `Symbol.for("tsad.conformance.declarable")`.
56
+ */
57
+ const DECLARABLE_MARKER_SUFFIX = ".declarable";
58
+
59
+ /**
60
+ * Type guard to check if a value is a Declarable.
61
+ *
62
+ * chant#2444 — accepts an entity a HOST built, not only one chant built.
63
+ *
64
+ * `F-Host-Interface` item 1 says an entity carries a non-enumerable declarable
65
+ * marker, and a host supplies its own: the specification's conformance host
66
+ * marks with `Symbol.for("tsad.conformance.declarable")`. Testing identity
67
+ * against chant's symbol alone refused those for not being chant's rather than
68
+ * for being malformed, which is what chant#2442 hit inside composite member
69
+ * validation and what would otherwise keep biting in the entity tallies and the
70
+ * revival pass-through.
71
+ *
72
+ * ## Why NOT the reference implementation's reading
73
+ *
74
+ * The reference reads L6.1 as "any own symbol or non-enumerable own property",
75
+ * which is right in its domain and **unsafe in chant's**. Two measurements say
76
+ * so, and both were taken rather than assumed:
77
+ *
78
+ * - A real chant entity's non-enumerable own NAMES are `lexicon`,
79
+ * `entityType`, `kind`, `props`, `attributes`, `Ref`. "Any non-enumerable
80
+ * own property" is therefore close to "any chant object at all".
81
+ * - chant has SEVEN marker symbols, not one — `chant.intrinsic`,
82
+ * `chant.composite`, `chant.stackOutput`, `chant.lexiconOutput`,
83
+ * `chant.effect-receipt`, `chant.secret-declaration`, `chant.childProject`
84
+ * — each a non-enumerable own symbol set to `true`. Under "any own symbol"
85
+ * an Intrinsic and a StackOutput both classify as Declarable, which is a
86
+ * worse bug than the one being fixed: they would enter the entity tallies.
87
+ *
88
+ * The reference can read any symbol because its domain has one. chant
89
+ * distinguishes seven kinds BY symbol identity, so it needs the marker's name.
90
+ * Hence the suffix: the marker must say `declarable`, whoever owns it.
91
+ *
92
+ * ## What the suffix cannot do
93
+ *
94
+ * It is a convention, not a registry. A host that marks with, say,
95
+ * `Symbol.for("acme.entity")` carries a perfectly good non-enumerable marker
96
+ * and is refused here, because nothing in this function knows that package is
97
+ * one the caller named. The context that would settle it —
98
+ * `FoldProjectOptions.lexiconPackages`, chant#2438 — lives in the fold path and
99
+ * does not reach a type guard called from a dozen places.
100
+ *
101
+ * That is a deliberate trade, not an oversight: a convention that refuses an
102
+ * unknown-but-valid marker costs a host one symbol name, while a rule loose
103
+ * enough to accept any marker miscounts chant's own seven kinds on every build.
104
+ * If a real host ever needs the other side of it, the fix is to thread the
105
+ * named packages through rather than to widen the test.
52
106
  */
53
107
  export function isDeclarable(value: unknown): value is Declarable {
54
- return (
55
- typeof value === "object" &&
56
- value !== null &&
57
- DECLARABLE_MARKER in value &&
58
- (value as Record<symbol, unknown>)[DECLARABLE_MARKER] === true
59
- );
108
+ if (typeof value !== "object" || value === null) return false;
109
+ // chant's own, which is every entity a chant build makes.
110
+ if ((value as Record<symbol, unknown>)[DECLARABLE_MARKER] === true) return true;
111
+ return carriesForeignDeclarableMarker(value);
112
+ }
113
+
114
+ /** A declarable marker some other implementation owns — see {@link isDeclarable}. */
115
+ function carriesForeignDeclarableMarker(value: object): boolean {
116
+ for (const marker of Object.getOwnPropertySymbols(value)) {
117
+ const descriptor = Object.getOwnPropertyDescriptor(value, marker);
118
+ // Non-enumerable and `true`, per F-Host-Interface item 1. An enumerable
119
+ // symbol would travel through a spread and reach an artifact, which a
120
+ // marker must not.
121
+ if (descriptor === undefined || descriptor.enumerable || descriptor.value !== true) continue;
122
+ if (marker.description?.endsWith(DECLARABLE_MARKER_SUFFIX) === true) return true;
123
+ }
124
+ return false;
60
125
  }
61
126
 
62
127
  /**
@@ -167,15 +167,31 @@ describe("composite factory interpretation (chant #1023)", () => {
167
167
  // The probe fires — an inadmissible factory still invokes, exactly as before.
168
168
  // ───────────────────────────────────────────────────────────────────────
169
169
 
170
- test("an INADMISSIBLE factory is still invoked in-process (the probe fires)", async () => {
170
+ test("an INADMISSIBLE factory is refused rather than invoked (spec 2.0)", async () => {
171
171
  await writeComposite(INADMISSIBLE_BODY);
172
172
  await writeMain(CALL_WEBAPP);
173
173
 
174
174
  const result = await discover(srcDir, { fold: true, lexicons: [LEXICON_NAME] });
175
175
 
176
+ // Interpretation declines on the body's shape, which is step 4. `F-Call`
177
+ // step 5 then makes the verdict `run` rather than importing the module and
178
+ // invoking it, because the specifier is a project file.
179
+ expect(result.errors).toEqual([]);
180
+ expect(result.foldDecisions.find((d) => d.file.endsWith("main.ts"))?.mode).toBe("run");
181
+ // The module does run, because `run` means the file is run and this build
182
+ // asked for no sandbox. What the fold no longer does is invoke it.
183
+ expect(foldExecutionCounts()).toMatchObject({ factoryInterpretations: 0, projectFactoryInvocations: 0 });
184
+ });
185
+
186
+ test("an INADMISSIBLE factory is invoked under `executing` (spec 2.0)", async () => {
187
+ await writeComposite(INADMISSIBLE_BODY);
188
+ await writeMain(CALL_WEBAPP);
189
+
190
+ const result = await discover(srcDir, { fold: true, executing: true, lexicons: [LEXICON_NAME] });
191
+
176
192
  expect(result.errors).toEqual([]);
177
193
  expect(result.foldDecisions.find((d) => d.file.endsWith("main.ts"))?.mode).toBe("fold");
178
- expect(moduleRan(), "the defining module must have been imported and run here").toBe(true);
194
+ expect(moduleRan(), "the defining module was imported, because the caller asked").toBe(true);
179
195
  expect(foldExecutionCounts()).toMatchObject({ factoryInterpretations: 0, projectFactoryInvocations: 1 });
180
196
  expect([...result.entities.keys()]).toEqual(["webBucket"]);
181
197
  });
@@ -416,9 +432,20 @@ describe("composite factory interpretation (chant #1023)", () => {
416
432
  export const web = makeApp({ name: "data" });
417
433
  `);
418
434
 
419
- const result = await discover(srcDir, { fold: true, lexicons: [LEXICON_NAME] });
435
+ const plain = await discover(srcDir, { fold: true, lexicons: [LEXICON_NAME] });
436
+
437
+ // Rule 2 still holds — a plain function is not a registered composite, so
438
+ // interpretation never applies to it. What changed at spec 2.0 is the arm
439
+ // it falls to: `F-Call` step 5 refuses a project file rather than invoking.
440
+ expect(plain.foldDecisions.find((d) => d.file.endsWith("main.ts"))?.mode).toBe("run");
441
+ expect(foldExecutionCounts(), "the fold invoked nothing; the fallback run is what imported it").toMatchObject({
442
+ factoryInterpretations: 0,
443
+ projectFactoryInvocations: 0,
444
+ });
445
+
446
+ const result = await discover(srcDir, { fold: true, executing: true, lexicons: [LEXICON_NAME] });
420
447
 
421
- expect(moduleRan(), "a plain function must still be invoked").toBe(true);
448
+ expect(moduleRan(), "a plain function is invoked under `executing`").toBe(true);
422
449
  expect(foldExecutionCounts()).toMatchObject({ factoryInterpretations: 0, projectFactoryInvocations: 1 });
423
450
  expect([...result.entities.keys()].sort()).toEqual(["webBucket", "webRole"]);
424
451
  });
@@ -104,12 +104,14 @@ describe("tryFoldFile", () => {
104
104
  expect(result.entities.map(([name]) => name).sort()).toEqual(["a", "b"]);
105
105
  });
106
106
 
107
- // chant #1023 (epic #1019 Phase 5): a bare composite factory call, resolved
108
- // through the file's own imports, now folds — the factory is invoked for
109
- // real with statically-folded props, exactly as `#1022`'s resource
110
- // constructors already were. This used to be the canonical fallback case;
111
- // flipping it to fold is the point of #1023.
112
- test("folds a top-level composite factory call, zero module execution", async () => {
107
+ // chant #1023 (epic #1019 Phase 5) made this fold by INVOKING the factory
108
+ // for real with statically-folded props. spec 2.0's `F-Call` step 5 moved
109
+ // that invocation behind `ι = executing`, because the factory's body and its
110
+ // module's top level are the project's own code. The body here is admissible
111
+ // in shape but interpretation declines on it — `Bucket` is a module-level
112
+ // const bound to a `createResource(...)` call — so step 4 does not catch it
113
+ // and step 5 decides.
114
+ test("a top-level composite factory call falls back, and folds under `executing`", async () => {
113
115
  await writeResourceDefs();
114
116
  await writeFile(
115
117
  join(testDir, "composites.ts"),
@@ -133,7 +135,11 @@ describe("tryFoldFile", () => {
133
135
  `,
134
136
  );
135
137
 
136
- const result = await tryFoldFile(file);
138
+ const refused = await tryFoldFile(file);
139
+ expect(refused.ok).toBe(false);
140
+ if (!refused.ok) expect(refused.reason).toContain("does not invoke project-owned code");
141
+
142
+ const result = await tryFoldFile(file, undefined, createFoldSession(undefined, undefined, undefined, false, [], true));
137
143
 
138
144
  expect(result.ok).toBe(true);
139
145
  if (!result.ok) return;
@@ -1576,6 +1576,36 @@ async function invokeResolvedCallee(
1576
1576
  const refusal = sandboxedExecutionRefusal(binding, ctx, calleeName, "composite factory");
1577
1577
  if (refusal) throw cheapError(refusal);
1578
1578
 
1579
+ // spec 2.0, `F-Call` step 5 — a callee that resolves to a PROJECT FILE is
1580
+ // not imported and invoked here. Invoking it runs the factory body, and its
1581
+ // whole module's top level, in the CLI's own process, and that is the
1582
+ // project's own code rather than a package's.
1583
+ //
1584
+ // Step 2's project-owned invocation moved behind `ι = executing` at v0.72.3
1585
+ // (chant#2455). Step 6 is the same path and had not moved, which is the
1586
+ // whole of this change. The specification took the decision first: its
1587
+ // rationale says of `executing` that "it is never the default", and
1588
+ // `verdict.md` calls `open` the strict default.
1589
+ //
1590
+ // A package factory still runs here, which is what `F-Host-Admission`
1591
+ // governs. A project-file callee that a `Composite` registered is
1592
+ // INTERPRETED at step 4 and never reaches this line; only one that
1593
+ // interpretation declined does, and for that the verdict is `run`.
1594
+ // "Project file" is the specifier's ORIGIN, not its syntax.
1595
+ // {@link isProjectFileSpecifier} is true of any absolute path, and chant's
1596
+ // own modules are imported by absolute path throughout the tests, so the
1597
+ // shape test alone refuses `propagate` and every other host function chant
1598
+ // publishes. {@link isTrustedExecutableBinding} draws the line the rule
1599
+ // means: an active lexicon package or chant-core's own tree is a package's
1600
+ // code, and everything else reached by a relative or absolute specifier is
1601
+ // the project's.
1602
+ if (!ctx.executing && isProjectFileSpecifier(binding.specifier) && !isTrustedExecutableBinding(binding, ctx)) {
1603
+ throw cheapError(
1604
+ `"${calleeName}" is imported from "${binding.specifier}", which is a project file; ` +
1605
+ "the default mode does not invoke project-owned code (`executing` would run it and fold what it returns)",
1606
+ );
1607
+ }
1608
+
1579
1609
  let modulePath: string;
1580
1610
  try {
1581
1611
  modulePath = resolveModulePathMemoized(binding.specifier, ctx.file, ctx.resolvePathCache);
@@ -372,7 +372,14 @@ describe("discover — fold mode (#1022, epic #1019)", () => {
372
372
  );
373
373
 
374
374
  const withoutFold = await discover(testDir);
375
- const withFold = await discover(testDir, { fold: true });
375
+ // spec 2.0 — the default refuses to invoke the project-file factory, so
376
+ // the file falls back. Output equivalence is what this test is about and
377
+ // it holds either way, because the fallback run computes the same thing.
378
+ const refused = await discover(testDir, { fold: true });
379
+ expect(refused.foldDecisions.find((d) => d.file.endsWith("stack.ts"))?.mode).toBe("run");
380
+ expect([...refused.entities.keys()].sort()).toEqual([...withoutFold.entities.keys()].sort());
381
+
382
+ const withFold = await discover(testDir, { fold: true, executing: true });
376
383
 
377
384
  expect(withFold.errors).toEqual([]);
378
385
  expect(withFold.entities.size).toBe(withoutFold.entities.size);
@@ -165,6 +165,20 @@ export interface DiscoveryOptions {
165
165
  * process, no IPC) and fold coverage, is unchanged unless requested.
166
166
  */
167
167
  sandbox?: boolean;
168
+ /**
169
+ * spec 2.0, `ι = executing` — invoke project-owned code at `F-Call` step 6
170
+ * rather than falling back.
171
+ *
172
+ * `F-Call` step 5 makes a declarator whose callee resolves to a project file
173
+ * `run` under every other mode, so a build that wants the value a run would
174
+ * compute has to say so. The value is then this process's: the factory body
175
+ * and its module's top level execute here, environment and all, which is
176
+ * exactly why it cannot be the default.
177
+ *
178
+ * Mutually exclusive with {@link sandbox}, which refuses to import project
179
+ * code at all. Asking for both is a contradiction rather than a preference.
180
+ */
181
+ executing?: boolean;
168
182
 
169
183
  /**
170
184
  * chant #1064 — this build's resolved build-time parameter values (see
@@ -263,8 +277,21 @@ export async function discover(path: string, options?: DiscoveryOptions): Promis
263
277
  // `sandbox` the session refuses those imports and the file demotes to the
264
278
  // run path — which, under `sandbox`, is the isolated child. See
265
279
  // fold-import.ts's `sandboxedExecutionRefusal`.
280
+ if (options?.sandbox === true && options?.executing === true) {
281
+ throw new Error(
282
+ "discover: `sandbox` and `executing` are mutually exclusive — the first refuses to import " +
283
+ "project code and the second exists to invoke it. Pass one.",
284
+ );
285
+ }
266
286
  const foldSession = options?.fold
267
- ? createFoldSession(options.intrinsics, buildParamValuesMap, options.lexicons, options.sandbox === true)
287
+ ? createFoldSession(
288
+ options.intrinsics,
289
+ buildParamValuesMap,
290
+ options.lexicons,
291
+ options.sandbox === true,
292
+ [],
293
+ options.executing === true,
294
+ )
268
295
  : undefined;
269
296
  if (options?.fold) {
270
297
  for (const file of files) {
@@ -85,6 +85,7 @@ export function generateDriverSource(options: GenerateDriverOptions): string {
85
85
  `import { classifyChildError } from ${lit(CHILD_ERRORS_MODULE)};`,
86
86
  `import { getProvenance } from ${lit(PROVENANCE_MODULE)};`,
87
87
  `import { setBuildParams } from ${lit(PARAMS_MODULE)};`,
88
+ `import { writeSync } from "node:fs";`,
88
89
  ``,
89
90
  `const BUILD_ROOT = ${lit(buildRoot)};`,
90
91
  ``,
@@ -95,7 +96,29 @@ export function generateDriverSource(options: GenerateDriverOptions): string {
95
96
  // them exactly. Bound before any project import below.
96
97
  `setBuildParams(${lit({ ...currentBuildParams })});`,
97
98
  ``,
99
+ // chant#2461 — which file was being imported when the loop drained.
100
+ //
101
+ // A project file whose module scope awaits something that never settles
102
+ // makes its `await import(...)` never complete. Nothing keeps the loop
103
+ // alive, so Node exits 0 having sent nothing, and `main().catch` never
104
+ // fires because an unsettled promise is not a rejection. The parent then
105
+ // knows only that the child vanished.
106
+ //
107
+ // The child DOES know, right up to the moment it exits. `process.on("exit")`
108
+ // runs synchronously, so it cannot `process.send` — that is asynchronous and
109
+ // the channel will never be serviced — but a synchronous `writeSync` to fd 2
110
+ // lands, and the parent already captures and forwards stderr.
111
+ `let importing;`,
112
+ `let reported = false;`,
113
+ `process.on("exit", () => {`,
114
+ ` if (reported || importing === undefined) return;`,
115
+ ` writeSync(2, "chant: this file's module scope never finished evaluating, so the build could not " +`,
116
+ ` "report anything: " + importing + "\\n A top-level \`await\` that never settles does this. " +`,
117
+ ` "Nothing is thrown, so nothing else can name it (chant#2461).\\n");`,
118
+ `});`,
119
+ ``,
98
120
  `function send(payload) {`,
121
+ ` reported = true;`,
99
122
  ` if (typeof process.send === "function") process.send(payload);`,
100
123
  ` else console.log(JSON.stringify(payload));`,
101
124
  `}`,
@@ -115,12 +138,14 @@ export function generateDriverSource(options: GenerateDriverOptions): string {
115
138
 
116
139
  for (const file of files) {
117
140
  lines.push(
141
+ ` importing = ${lit(file)};`,
118
142
  ` try {`,
119
143
  ` const mod = await import(${lit(file)});`,
120
144
  ` modules.push({ file: ${lit(file)}, exports: mod });`,
121
145
  ` } catch (err) {`,
122
146
  ` errors.push(classifyChildError(${lit(file)}, err).toJSON());`,
123
147
  ` }`,
148
+ ` importing = undefined;`,
124
149
  );
125
150
  }
126
151
 
@@ -4,6 +4,7 @@ import { join, dirname, resolve } from "node:path";
4
4
  import { tmpdir } from "node:os";
5
5
  import { fileURLToPath } from "node:url";
6
6
  import { discover } from "../index";
7
+ import { foldExecutionCounts, resetFoldExecutionCounts } from "../fold-import";
7
8
 
8
9
  /**
9
10
  * chant #1093 — the security property `--sandbox` is supposed to buy, tested
@@ -101,16 +102,37 @@ describe("fold under --sandbox never executes project code in the CLI process (c
101
102
  );
102
103
  }
103
104
 
104
- test("plain --fold DOES invoke a project-owned composite factory in-process (the probe fires)", async () => {
105
+ test("plain --fold refuses a project-owned composite factory: nothing runs here (spec 2.0)", async () => {
105
106
  await writeCompositeFixture();
107
+ resetFoldExecutionCounts();
106
108
 
107
109
  const result = await discover(testDir, { fold: true });
108
110
 
109
- // The file folds today — and folding it ran project code right here.
111
+ // Until spec 2.0 this folded, and folding it ran project code right here.
112
+ // `F-Call` step 5 moved that invocation behind `ι = executing`, so the
113
+ // verdict is `run` and the FOLD invokes nothing.
114
+ const main = result.foldDecisions.find((d) => d.file.endsWith("main.ts"));
115
+ expect(main?.mode).toBe("run");
116
+ expect(foldExecutionCounts()).toMatchObject({ projectFactoryInvocations: 0 });
117
+ // The markers still fire, because a `run` verdict means the file is run,
118
+ // and without --sandbox the run path is this process. That is the fallback
119
+ // doing its job rather than the fold reaching project code, and it is
120
+ // exactly what the next test moves to the child.
121
+ expect(marker(MODULE_MARKER)).toBe(true);
122
+ expect([...result.entities.keys()].sort()).toEqual(["webBucket", "webRole"]);
123
+ });
124
+
125
+ test("`executing` invokes it, which is what that mode is for (spec 2.0)", async () => {
126
+ await writeCompositeFixture();
127
+ resetFoldExecutionCounts();
128
+
129
+ const result = await discover(testDir, { fold: true, executing: true });
130
+
110
131
  const main = result.foldDecisions.find((d) => d.file.endsWith("main.ts"));
111
132
  expect(main?.mode).toBe("fold");
112
- expect(marker(MODULE_MARKER), "composites.ts's module top level ran in this process").toBe(true);
113
- expect(marker(FACTORY_MARKER), "the factory body ran in this process").toBe(true);
133
+ expect(foldExecutionCounts()).toMatchObject({ projectFactoryInvocations: 1 });
134
+ expect(marker(MODULE_MARKER), "composites.ts's module top level ran, because the caller asked").toBe(true);
135
+ expect(marker(FACTORY_MARKER), "the factory body ran, because the caller asked").toBe(true);
114
136
  expect([...result.entities.keys()].sort()).toEqual(["webBucket", "webRole"]);
115
137
  });
116
138
 
@@ -108,7 +108,15 @@ describe("why a sandboxed child ends without a result (chant#2461)", () => {
108
108
 
109
109
  const message = result.errors.map((e) => e.message).join("\n");
110
110
  expect(message).toContain("child exited before reporting results (code 0, signal null)");
111
- expect(message).toContain("drained its loop without sending");
111
+
112
+ // chant#2461's user-facing half: the child names the file it was
113
+ // importing when its loop drained. It cannot `process.send` from an exit
114
+ // handler — that is asynchronous and the channel will never be serviced —
115
+ // so it writes synchronously to stderr, which the parent captures and
116
+ // forwards. Without this the build dies silently and nothing anywhere
117
+ // says which file.
118
+ expect(message).toContain("never finished evaluating");
119
+ expect(message).toContain("hangs.ts");
112
120
  expect(message).toContain("top-level");
113
121
  } finally {
114
122
  rmSync(root, { recursive: true, force: true });
@@ -210,13 +210,28 @@ import { intrinsicCallFolds, intrinsicCallFoldsEagerly, type IntrinsicDef } from
210
210
  * binding whatever an invoked factory returns is what chant never checked
211
211
  * (`L8.19`), and a declarator reaching a call through a const alias is what
212
212
  * chant resolves while refusing a call nested elsewhere (`L2.18`).
213
+ * - **1.7** put `F-Eval-CallLocal` before the two registered call shapes, so a
214
+ * call through a name the project bound is the project function's call
215
+ * whatever the registry says. That is what chant's whole-build fold already
216
+ * did, and the reason the specification moved rather than chant: probes with
217
+ * chant's own `output` showed the binding-first order living in
218
+ * `resolveCallExpression`, while `L2.11` described the expression
219
+ * classifier. The two were never required to share an order.
220
+ * - **1.8** added `ι = executing`, and chant carries it as of `0.72.3`
221
+ * (#2455) — `FoldProjectOptions.executing`, mutually exclusive with
222
+ * `sandbox`. `open` stays the default and stays strict (#2453).
213
223
  *
214
224
  * `scripts/check-docs-citations.ts` refuses to run when this constant and the
215
- * pinned specification disagree, so `.github/workflows/docs-check.yml` pins the
216
- * `spec-1.6` commit and the two move together. That coupling is deliberate: it
217
- * is what stops the docs being gated against a rule set nobody writes against.
225
+ * rules it loads disagree, so this and the `@intentius/tsad-conformance`
226
+ * devDependency move together. That coupling is deliberate: it is what stops
227
+ * the docs being gated against a rule set nobody writes against — which is
228
+ * exactly what happened while this sat at `1.0` through six versions, passing
229
+ * because both sides were equally stale.
230
+ *
231
+ * Until chant#2470 the rules came from a commit `docs-check.yml` checked out;
232
+ * now they come from the published package, so bumping it is what moves this.
218
233
  */
219
- export const SPEC_VERSION = "1.6";
234
+ export const SPEC_VERSION = "2.1";
220
235
 
221
236
  /** The two EVL rule ids a shape violation can be attributed to. */
222
237
  export type SubsetRuleId = "EVL001" | "EVL003";
@@ -335,10 +335,24 @@ const COMPOSITES = `
335
335
 
336
336
  const MAIN = `
337
337
  import { Bucket } from ${JSON.stringify(LEXICON)};
338
- import { WebService, LegacyService } from "../composites";
338
+ import { WebService } from "../composites";
339
339
 
340
340
  export const logs = new Bucket({ BucketName: "logs" });
341
341
  export const web = WebService({ name: "data", tier: "prod", iam: { path: "/service/" } });
342
+ `;
343
+
344
+ /**
345
+ * `LegacyService` sits in its own file since spec 2.0.
346
+ *
347
+ * It is one `if` outside the subset, so step 4 declines and `F-Call` step 5
348
+ * makes the declarator `run`. A verdict is per file, so leaving it beside
349
+ * `web` took the whole file to run and every field's origin with it — the
350
+ * interpreted composite's provenance is only observable in a file that folds.
351
+ * `executing` is the other way to keep it, and this fixture wants the default.
352
+ */
353
+ const LEGACY_MAIN = `
354
+ import { LegacyService } from "../composites";
355
+
342
356
  export const legacy = LegacyService({ name: "old" });
343
357
  `;
344
358
 
@@ -361,6 +375,7 @@ describe("fold provenance over a real composite build (#2161)", () => {
361
375
  await mkdir(srcDir, { recursive: true });
362
376
  await writeFile(join(testDir, "composites.ts"), COMPOSITES);
363
377
  await writeFile(join(srcDir, "main.ts"), MAIN);
378
+ await writeFile(join(srcDir, "legacy.ts"), LEGACY_MAIN);
364
379
  });
365
380
 
366
381
  afterEach(async () => {