@intentius/tsad-conformance 1.4.0 → 1.6.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 (130) hide show
  1. package/dist/adapter.d.ts +53 -1
  2. package/dist/adapter.d.ts.map +1 -1
  3. package/dist/fixture.d.ts +28 -1
  4. package/dist/fixture.d.ts.map +1 -1
  5. package/dist/fixture.js +27 -2
  6. package/dist/fixture.js.map +1 -1
  7. package/dist/host.d.ts +13 -0
  8. package/dist/host.d.ts.map +1 -1
  9. package/dist/host.js +33 -0
  10. package/dist/host.js.map +1 -1
  11. package/dist/runner.d.ts +28 -2
  12. package/dist/runner.d.ts.map +1 -1
  13. package/dist/runner.js +129 -3
  14. package/dist/runner.js.map +1 -1
  15. package/fixtures/F-Call/a-host-factory-is-invoked/expect.json +45 -0
  16. package/fixtures/F-Call/a-host-factory-is-invoked/project/app.ts +4 -0
  17. package/fixtures/F-Call/a-host-factory-is-invoked/project/nested.ts +3 -0
  18. package/fixtures/F-Call/a-host-factory-is-invoked/project/plain.ts +3 -0
  19. package/fixtures/F-Declarator/a-const-alias-of-a-call-resolves-at-the-declarator/expect.json +50 -0
  20. package/fixtures/F-Declarator/a-const-alias-of-a-call-resolves-at-the-declarator/project/app.ts +13 -0
  21. package/fixtures/F-Declarator/a-const-alias-of-a-call-resolves-at-the-declarator/project/nested.ts +5 -0
  22. package/fixtures/F-Declarator/a-const-alias-of-a-call-resolves-at-the-declarator/project/store.ts +3 -0
  23. package/fixtures/F-Div-Step/step-reads-the-resolved-composite/expect.json +48 -0
  24. package/fixtures/F-Div-Step/step-reads-the-resolved-composite/project/app.ts +4 -0
  25. package/fixtures/F-Div-Step/step-reads-the-resolved-composite/project/pipeline.ts +3 -0
  26. package/fixtures/F-Host-Closed-vs-Open/package-call-is-closed/expect.json +18 -5
  27. package/fixtures/F-Host-Composite/a-registered-composite-is-interpreted/expect.json +47 -0
  28. package/fixtures/F-Host-Composite/a-registered-composite-is-interpreted/project/app.ts +4 -0
  29. package/fixtures/F-Host-Composite/a-registered-composite-is-interpreted/project/store.ts +6 -0
  30. package/fixtures/F-IsolatedRefusal/a-project-factory-is-refused-not-invoked/expect.json +18 -0
  31. package/fixtures/F-IsolatedRefusal/a-project-factory-is-refused-not-invoked/project/app.ts +3 -0
  32. package/fixtures/F-IsolatedRefusal/a-project-factory-is-refused-not-invoked/project/shapes.ts +5 -0
  33. package/fixtures/F-Obs-Counters/a-build-reports-its-counts/expect.json +43 -0
  34. package/fixtures/F-Obs-Counters/a-build-reports-its-counts/project/app.ts +5 -0
  35. package/fixtures/F-Obs-Counters/a-build-reports-its-counts/project/shapes.ts +3 -0
  36. package/fixtures/F-Rule-Equivalence/same-source-same-findings/expect.json +21 -0
  37. package/fixtures/F-Rule-Equivalence/same-source-same-findings/project/buckets.ts +8 -0
  38. package/fixtures/F-Rule-Equivalence/same-source-same-findings/project/helpers.ts +3 -0
  39. package/fixtures/F-Rule-Input/a-rule-sees-the-folded-namespace/expect.json +21 -0
  40. package/fixtures/F-Rule-Input/a-rule-sees-the-folded-namespace/project/buckets.ts +4 -0
  41. package/fixtures/F-Rule-Phase/a-post-rule-reads-the-artifact/expect.json +21 -0
  42. package/fixtures/F-Rule-Phase/a-post-rule-reads-the-artifact/project/pairs.ts +3 -0
  43. package/fixtures/F-Rule-Pure/findings-are-a-function-of-the-input/expect.json +21 -0
  44. package/fixtures/F-Rule-Pure/findings-are-a-function-of-the-input/project/buckets.ts +4 -0
  45. package/fixtures/F-Rule-Pure/findings-are-a-function-of-the-input/project/clock.ts +1 -0
  46. package/fixtures/F-Rule-Supply/the-host-names-the-rule/expect.json +21 -0
  47. package/fixtures/F-Rule-Supply/the-host-names-the-rule/project/app.ts +4 -0
  48. package/fixtures/F-Val-Domain/every-case-is-a-value/expect.json +49 -0
  49. package/fixtures/F-Val-Domain/every-case-is-a-value/project/app.ts +6 -0
  50. package/fixtures/F-Val-Envelope/envelopes-are-the-output-in-data-host/expect.json +41 -0
  51. package/fixtures/F-Val-Envelope/envelopes-are-the-output-in-data-host/project/app.ts +5 -0
  52. package/fixtures/F-Val-Source/a-form-per-case-in-data-host/expect.json +74 -0
  53. package/fixtures/F-Val-Source/a-form-per-case-in-data-host/project/app.ts +8 -0
  54. package/fixtures/F-Val-Source/a-form-per-case-in-full/expect.json +35 -0
  55. package/fixtures/F-Val-Source/a-form-per-case-in-full/project/app.ts +7 -0
  56. package/fixtures/F-Val-Symbol-Scope/a-symbol-only-inside-an-intrinsic/expect.json +32 -0
  57. package/fixtures/F-Val-Symbol-Scope/a-symbol-only-inside-an-intrinsic/project/interior.ts +3 -0
  58. package/fixtures/F-Val-Symbol-Scope/a-symbol-only-inside-an-intrinsic/project/top.ts +1 -0
  59. package/fixtures/S-Disqualify/each-arm-disqualifies-the-file/expect.json +34 -0
  60. package/fixtures/S-Disqualify/each-arm-disqualifies-the-file/project/array.ts +1 -0
  61. package/fixtures/S-Disqualify/each-arm-disqualifies-the-file/project/class.ts +1 -0
  62. package/fixtures/S-Disqualify/each-arm-disqualifies-the-file/project/default-function.ts +3 -0
  63. package/fixtures/S-Disqualify/each-arm-disqualifies-the-file/project/let.ts +1 -0
  64. package/fixtures/S-Disqualify/each-arm-disqualifies-the-file/project/ok.ts +1 -0
  65. package/fixtures/S-Disqualify/each-arm-disqualifies-the-file/project/rest.ts +1 -0
  66. package/fixtures/S-Disqualify/each-arm-disqualifies-the-file/project/star.ts +1 -0
  67. package/fixtures/S-Disqualify/each-arm-disqualifies-the-file/project/uninitialized.ts +1 -0
  68. package/fixtures/S-Disqualify/each-arm-disqualifies-the-file/project/var.ts +1 -0
  69. package/fixtures/S-ExportDestructure/plain-elements/expect.json +16 -0
  70. package/fixtures/S-ExportDestructure/plain-elements/project/app.ts +3 -0
  71. package/fixtures/S-ExportNamed/local-names-with-an-alias/expect.json +19 -0
  72. package/fixtures/S-ExportNamed/local-names-with-an-alias/project/app.ts +4 -0
  73. package/fixtures/S-ExportResource/new-with-props/expect.json +26 -0
  74. package/fixtures/S-ExportResource/new-with-props/project/app.ts +3 -0
  75. package/fixtures/S-ExportSingle/an-expression-initializer/expect.json +21 -0
  76. package/fixtures/S-ExportSingle/an-expression-initializer/input.ts +1 -0
  77. package/fixtures/S-ExportTypeOnly/type-exports-are-invisible/expect.json +19 -0
  78. package/fixtures/S-ExportTypeOnly/type-exports-are-invisible/project/app.ts +12 -0
  79. package/fixtures/S-FactoryBody/consts-then-a-final-return/expect.json +38 -0
  80. package/fixtures/S-FactoryBody/consts-then-a-final-return/project/bad-shapes.ts +7 -0
  81. package/fixtures/S-FactoryBody/consts-then-a-final-return/project/empty.ts +3 -0
  82. package/fixtures/S-FactoryBody/consts-then-a-final-return/project/good-shapes.ts +7 -0
  83. package/fixtures/S-FactoryBody/consts-then-a-final-return/project/good.ts +3 -0
  84. package/fixtures/S-FactoryBody/consts-then-a-final-return/project/no-return.ts +3 -0
  85. package/fixtures/S-FactoryParams/one-plainly-bound-parameter/expect.json +38 -0
  86. package/fixtures/S-FactoryParams/one-plainly-bound-parameter/project/bad-shapes.ts +4 -0
  87. package/fixtures/S-FactoryParams/one-plainly-bound-parameter/project/good-shapes.ts +3 -0
  88. package/fixtures/S-FactoryParams/one-plainly-bound-parameter/project/named.ts +3 -0
  89. package/fixtures/S-FactoryParams/one-plainly-bound-parameter/project/rest.ts +3 -0
  90. package/fixtures/S-FactoryParams/one-plainly-bound-parameter/project/two.ts +3 -0
  91. package/fixtures/S-Module/non-exported-statements-are-invisible/expect.json +17 -0
  92. package/fixtures/S-Module/non-exported-statements-are-invisible/project/app.ts +13 -0
  93. package/fixtures/S-Prop/a-computed-key-rejects/expect.json +10 -0
  94. package/fixtures/S-Prop/a-computed-key-rejects/input.ts +3 -0
  95. package/fixtures/S-Prop/literal-keys/expect.json +15 -0
  96. package/fixtures/S-Prop/literal-keys/input.ts +1 -0
  97. package/fixtures/S-ReExport/named-from-a-sibling/expect.json +18 -0
  98. package/fixtures/S-ReExport/named-from-a-sibling/project/app.ts +1 -0
  99. package/fixtures/S-ReExport/named-from-a-sibling/project/config.ts +2 -0
  100. package/fixtures/S-Shorthand/a-shorthand-property-resolves-as-an-identifier/expect.json +14 -0
  101. package/fixtures/S-Shorthand/a-shorthand-property-resolves-as-an-identifier/input.ts +4 -0
  102. package/fixtures/S-TopConst/an-unexported-const-is-a-binding/expect.json +16 -0
  103. package/fixtures/S-TopConst/an-unexported-const-is-a-binding/project/binding.ts +3 -0
  104. package/fixtures/S-TopConst/an-unexported-const-is-a-binding/project/invisible.ts +3 -0
  105. package/fixtures/UNCOVERED.md +1 -28
  106. package/fixtures/roundtrip/a-resource-and-its-attribute/expect.json +8 -0
  107. package/fixtures/roundtrip/a-resource-and-its-attribute/value.json +29 -0
  108. package/fixtures/roundtrip/a-resource-by-args/expect.json +8 -0
  109. package/fixtures/roundtrip/a-resource-by-args/value.json +14 -0
  110. package/fixtures/roundtrip/intrinsics-and-a-symbol/expect.json +8 -0
  111. package/fixtures/roundtrip/intrinsics-and-a-symbol/value.json +36 -0
  112. package/fixtures/roundtrip/scalars-and-containers/expect.json +8 -0
  113. package/fixtures/roundtrip/scalars-and-containers/value.json +28 -0
  114. package/package.json +1 -1
  115. package/spec/VERSION +1 -1
  116. package/spec/hosts.md +6 -2
  117. package/spec/judgments.md +27 -10
  118. package/spec/rules.md +7 -4
  119. package/spec/values.md +47 -2
  120. package/src/adapter.ts +53 -0
  121. package/src/adapters/chant.ts +361 -10
  122. package/src/adapters/rust.ts +77 -0
  123. package/src/chant-agreement.test.ts +68 -23
  124. package/src/corpus.test.ts +12 -0
  125. package/src/corpus.ts +76 -34
  126. package/src/fixture.ts +42 -3
  127. package/src/host.ts +50 -0
  128. package/src/runner.test.ts +6 -2
  129. package/src/runner.ts +107 -5
  130. package/src/rust-agreement.test.ts +37 -0
@@ -0,0 +1,45 @@
1
+ {
2
+ "rules": [
3
+ "F-Call",
4
+ "F-Host-Interface"
5
+ ],
6
+ "project": true,
7
+ "host": "shapes",
8
+ "verdicts": {
9
+ "app.ts": "fold",
10
+ "plain.ts": "fold",
11
+ "nested.ts": "run"
12
+ },
13
+ "rejectRule": {
14
+ "nested.ts": "F-Eval-Reject"
15
+ },
16
+ "exports": {
17
+ "app.ts": {
18
+ "bucket": {
19
+ "entityType": "Bucket",
20
+ "lexicon": "shapes",
21
+ "props": {
22
+ "name": "b"
23
+ },
24
+ "attributes": {}
25
+ },
26
+ "pair": {
27
+ "left": "left",
28
+ "right": {
29
+ "__attrRef": {
30
+ "entity": "bucket",
31
+ "attribute": "name"
32
+ }
33
+ },
34
+ "entityType": "Pair",
35
+ "lexicon": "shapes"
36
+ }
37
+ },
38
+ "plain.ts": {
39
+ "d": {
40
+ "described": "x"
41
+ }
42
+ }
43
+ },
44
+ "note": "Step 6 invokes a host-bound factory with the resolved arguments, an attribute reference among them left symbolic (L6.9), and since 1.6 step 7 binds whatever came back, so describe's plain data folds in plain.ts. F-Call is a declarator rule: the same call nested in an object literal is J1's, which has no rule for a call, so nested.ts runs."
45
+ }
@@ -0,0 +1,4 @@
1
+ import { makePair, Bucket } from "@tsad/shapes";
2
+
3
+ export const bucket = new Bucket({ name: "b" });
4
+ export const pair = makePair("left", bucket.name);
@@ -0,0 +1,3 @@
1
+ import { makePair } from "@tsad/shapes";
2
+
3
+ export const nested = { inner: makePair(1, 2) };
@@ -0,0 +1,3 @@
1
+ import { describe } from "@tsad/shapes";
2
+
3
+ export const d = describe("x");
@@ -0,0 +1,50 @@
1
+ {
2
+ "rules": [
3
+ "F-Declarator",
4
+ "F-Call",
5
+ "F-Count"
6
+ ],
7
+ "project": true,
8
+ "host": "shapes",
9
+ "verdicts": {
10
+ "store.ts": "run",
11
+ "app.ts": "fold",
12
+ "nested.ts": "run"
13
+ },
14
+ "rejectRule": {
15
+ "store.ts": "F-Eval-Function",
16
+ "nested.ts": "F-Eval-Reject"
17
+ },
18
+ "exports": {
19
+ "app.ts": {
20
+ "pair": {
21
+ "left": 1,
22
+ "right": 2,
23
+ "entityType": "Pair",
24
+ "lexicon": "shapes"
25
+ },
26
+ "data": {
27
+ "entityType": "Bucket",
28
+ "lexicon": "shapes",
29
+ "props": {
30
+ "name": "b"
31
+ },
32
+ "attributes": {}
33
+ },
34
+ "whole": {
35
+ "left": "l",
36
+ "right": "r",
37
+ "entityType": "Pair",
38
+ "lexicon": "shapes"
39
+ },
40
+ "left": "l",
41
+ "chained": {
42
+ "left": 1,
43
+ "right": 2,
44
+ "entityType": "Pair",
45
+ "lexicon": "shapes"
46
+ }
47
+ }
48
+ },
49
+ "note": "At a declarator a top-level const alias of a package call resolves through F-Call: a host-published composite invoked, a registered one interpreted, a plain factory invoked, an alias of an alias, and a destructure of one; the whole value or a member of it. The same read nested inside an expression (nested.ts) is J1's, which has no rule for a call, so it runs, as it does at chant."
50
+ }
@@ -0,0 +1,13 @@
1
+ import { Stack, makePair } from "@tsad/shapes";
2
+ import { Store } from "./store";
3
+
4
+ const published = Stack({ left: 1, right: 2 });
5
+ const registered = Store({ name: "b" });
6
+ const plain = makePair("l", "r");
7
+ const again = published;
8
+
9
+ export const pair = published.pair;
10
+ export const data = registered.data;
11
+ export const whole = plain;
12
+ export const left = plain.left;
13
+ export const { pair: chained } = again;
@@ -0,0 +1,5 @@
1
+ import { Stack } from "@tsad/shapes";
2
+
3
+ const w = Stack({ left: 1, right: 2 });
4
+
5
+ export const v = { p: w.pair };
@@ -0,0 +1,3 @@
1
+ import { Bucket, Composite } from "@tsad/shapes";
2
+
3
+ export const Store = Composite((props: { name: string }) => ({ data: new Bucket({ name: props.name }) }), "Store");
@@ -0,0 +1,48 @@
1
+ {
2
+ "rules": [
3
+ "F-Div-Step",
4
+ "S-CompositeStep",
5
+ "S-Unclaimed",
6
+ "F-Val-Fate"
7
+ ],
8
+ "project": true,
9
+ "host": "shapes",
10
+ "verdicts": {
11
+ "pipeline.ts": "run",
12
+ "app.ts": "fold"
13
+ },
14
+ "exports": {
15
+ "app.ts": {
16
+ "first": {
17
+ "entityType": "Bucket",
18
+ "lexicon": "shapes",
19
+ "props": {
20
+ "name": "first"
21
+ },
22
+ "attributes": {}
23
+ },
24
+ "both": {
25
+ "a": {
26
+ "entityType": "Bucket",
27
+ "lexicon": "shapes",
28
+ "props": {
29
+ "name": "a"
30
+ },
31
+ "attributes": {}
32
+ },
33
+ "b": {
34
+ "entityType": "Bucket",
35
+ "lexicon": "shapes",
36
+ "props": {
37
+ "name": "b"
38
+ },
39
+ "attributes": {}
40
+ }
41
+ }
42
+ }
43
+ },
44
+ "note": "The .step idiom on an unclaimed callee: the classifier admits any call, J1 yields a __compositeStep envelope, and its fate is to resolve the composite through F-Call and read step off the real result. Stage is unclaimed because no helper, intrinsic, local function or const claims the name; its registration module runs, and the caller interprets it from source.",
45
+ "rejectRule": {
46
+ "pipeline.ts": "F-Eval-Function"
47
+ }
48
+ }
@@ -0,0 +1,4 @@
1
+ import { Stage } from "./pipeline";
2
+
3
+ export const first = Stage({ name: "first" }).step;
4
+ export const both = { a: Stage({ name: "a" }).step, b: Stage({ name: "b" }).step };
@@ -0,0 +1,3 @@
1
+ import { Bucket, Composite } from "@tsad/shapes";
2
+
3
+ export const Stage = Composite((props: { name: string }) => ({ step: new Bucket({ name: props.name }) }), "Stage");
@@ -1,9 +1,22 @@
1
1
  {
2
- "rules": ["F-Host-Closed-vs-Open", "F-Eval-Reject"],
2
+ "rules": [
3
+ "F-Host-Closed-vs-Open",
4
+ "F-Call"
5
+ ],
3
6
  "project": true,
4
7
  "host": "shapes",
5
- "verdicts": { "pure.ts": "fold", "open.ts": "fold", "closed.ts": "run" },
6
- "exports": { "open.ts": { "v": "n1" } },
7
- "rejectRule": { "closed.ts": "F-Eval-Reject" },
8
- "note": "The asymmetry: a call into a project file folds whenever the body is in the subset, with no allowlist; a call into a package folds only through a registered name, and Bucket is registered as nothing but a constructor."
8
+ "verdicts": {
9
+ "pure.ts": "fold",
10
+ "open.ts": "fold",
11
+ "closed.ts": "run"
12
+ },
13
+ "exports": {
14
+ "open.ts": {
15
+ "v": "n1"
16
+ }
17
+ },
18
+ "rejectRule": {
19
+ "closed.ts": "F-Call"
20
+ },
21
+ "note": "The asymmetry: a call into a project file folds whenever the body is in the subset, with no allowlist; a call into a package folds only through a registered name. Bucket is registered as nothing but a constructor, so at the declarator F-Call invokes it (step 6), the call throws, and the file runs; a running file is what a package call outside the allowlist costs."
9
22
  }
@@ -0,0 +1,47 @@
1
+ {
2
+ "rules": [
3
+ "F-Host-Composite",
4
+ "F-Call",
5
+ "F-Count"
6
+ ],
7
+ "project": true,
8
+ "host": "shapes",
9
+ "verdicts": {
10
+ "store.ts": "run",
11
+ "app.ts": "fold"
12
+ },
13
+ "exports": {
14
+ "app.ts": {
15
+ "store": {
16
+ "data": {
17
+ "entityType": "Bucket",
18
+ "lexicon": "shapes",
19
+ "props": {
20
+ "name": "app"
21
+ },
22
+ "attributes": {}
23
+ },
24
+ "logs": {
25
+ "entityType": "Bucket",
26
+ "lexicon": "shapes",
27
+ "props": {
28
+ "name": "app-logs"
29
+ },
30
+ "attributes": {}
31
+ }
32
+ },
33
+ "logs": {
34
+ "entityType": "Bucket",
35
+ "lexicon": "shapes",
36
+ "props": {
37
+ "name": "other-logs"
38
+ },
39
+ "attributes": {}
40
+ }
41
+ }
42
+ },
43
+ "note": "The registration form: Composite bound in the defining module to the host's own import makes Store interpretable, so a call folds the factory body against store.ts's scope and never imports it (F-Call step 4). store.ts itself runs, since its declarator is a function used as a value (F-Eval-Function), and that is what lets a caller fold: the binding comes from source. new is admitted inside the body; the destructured call resolves once (F-Count) and indexes the members.",
44
+ "rejectRule": {
45
+ "store.ts": "F-Eval-Function"
46
+ }
47
+ }
@@ -0,0 +1,4 @@
1
+ import { Store } from "./store";
2
+
3
+ export const store = Store({ name: "app" });
4
+ export const { logs } = Store({ name: "other" });
@@ -0,0 +1,6 @@
1
+ import { Bucket, Composite } from "@tsad/shapes";
2
+
3
+ export const Store = Composite((props: { name: string }) => ({
4
+ data: new Bucket({ name: props.name }),
5
+ logs: new Bucket({ name: `${props.name}-logs` }),
6
+ }), "Store");
@@ -0,0 +1,18 @@
1
+ {
2
+ "rules": [
3
+ "F-IsolatedRefusal",
4
+ "F-Call"
5
+ ],
6
+ "project": true,
7
+ "host": "shapes",
8
+ "mode": "isolated",
9
+ "verdicts": {
10
+ "shapes.ts": "run",
11
+ "app.ts": "run"
12
+ },
13
+ "rejectRule": {
14
+ "shapes.ts": "F-Eval-Function",
15
+ "app.ts": "F-IsolatedRefusal"
16
+ },
17
+ "note": "Under ι = isolated a project factory that step 4 cannot interpret is refused at step 5 rather than imported and invoked at step 6, even though in open mode the build would fold this file by invocation. The refusal is what isolation costs, stated as a verdict; F-Obs-Counters' projectFactoryInvocations is zero across every folded file under isolated."
18
+ }
@@ -0,0 +1,3 @@
1
+ import { Pair2 } from "./shapes";
2
+
3
+ export const p = Pair2({ name: "a" }, "b");
@@ -0,0 +1,5 @@
1
+ import { Bucket, Composite } from "@tsad/shapes";
2
+
3
+ // Not interpretable: two parameters (S-FactoryParams). In open mode F-Call
4
+ // step 6 would import this module and invoke the definition instead.
5
+ export const Pair2 = Composite((a: { name: string }, b: string) => ({ bucket: new Bucket({ name: a.name + b }) }), "Pair2");
@@ -0,0 +1,43 @@
1
+ {
2
+ "rules": [
3
+ "F-Obs-Counters",
4
+ "F-IsolatedRefusal",
5
+ "F-Call"
6
+ ],
7
+ "project": true,
8
+ "host": "shapes",
9
+ "mode": "isolated",
10
+ "verdicts": {
11
+ "shapes.ts": "run",
12
+ "app.ts": "fold"
13
+ },
14
+ "rejectRule": {
15
+ "shapes.ts": "F-Eval-Function"
16
+ },
17
+ "exports": {
18
+ "app.ts": {
19
+ "n": {
20
+ "bucket": {
21
+ "entityType": "Bucket",
22
+ "lexicon": "shapes",
23
+ "props": {
24
+ "name": "a"
25
+ },
26
+ "attributes": {}
27
+ }
28
+ },
29
+ "p": {
30
+ "left": "l",
31
+ "right": "r",
32
+ "entityType": "Pair",
33
+ "lexicon": "shapes"
34
+ }
35
+ }
36
+ },
37
+ "counters": {
38
+ "factoryInvocations": 1,
39
+ "projectFactoryInvocations": 0,
40
+ "factoryInterpretations": 1
41
+ },
42
+ "note": "F-Obs-Counters is the observable behind F-NoOwnExecution: three non-negative integers per build. app.ts calls a project composite, which step 5 interprets (one interpretation), and a host factory, which step 6 invokes (one invocation); under isolated no invocation may resolve to project-owned code, so the second counter is zero across the build. Names follow the reference and only the shape is normative."
43
+ }
@@ -0,0 +1,5 @@
1
+ import { makePair } from "@tsad/shapes";
2
+ import { Named } from "./shapes";
3
+
4
+ export const n = Named({ name: "a" });
5
+ export const p = makePair("l", "r");
@@ -0,0 +1,3 @@
1
+ import { Bucket, Composite } from "@tsad/shapes";
2
+
3
+ export const Named = Composite(({ name }: { name: string }) => ({ bucket: new Bucket({ name }) }), "Named");
@@ -0,0 +1,21 @@
1
+ {
2
+ "rules": [
3
+ "F-Rule-Equivalence"
4
+ ],
5
+ "project": true,
6
+ "host": "shapes",
7
+ "verdicts": {
8
+ "buckets.ts": "fold",
9
+ "helpers.ts": "fold"
10
+ },
11
+ "findings": {
12
+ "buckets.ts": [
13
+ {
14
+ "rule": "SHAPES001",
15
+ "subject": "b",
16
+ "severity": "error"
17
+ }
18
+ ]
19
+ },
20
+ "note": "Bucket props built three ways, a same-file arrow, a sibling-file function and a literal, and one finding either way. compareAdapters holds two implementations to the same findings from this source whichever path each took, folding or running; that is the property, and it is measured the day a second implementation exposes the rules hook."
21
+ }
@@ -0,0 +1,8 @@
1
+ import { Bucket } from "@tsad/shapes";
2
+ import { named } from "./helpers";
3
+
4
+ const props = (name?: string) => (name ? { BucketName: name } : {});
5
+
6
+ export const a = new Bucket(props("a"));
7
+ export const b = new Bucket(props());
8
+ export const c = new Bucket(named("c"));
@@ -0,0 +1,3 @@
1
+ export function named(name: string) {
2
+ return { BucketName: name };
3
+ }
@@ -0,0 +1,21 @@
1
+ {
2
+ "rules": [
3
+ "F-Rule-Input",
4
+ "F-Rule-Finding"
5
+ ],
6
+ "project": true,
7
+ "host": "shapes",
8
+ "verdicts": {
9
+ "buckets.ts": "fold"
10
+ },
11
+ "findings": {
12
+ "buckets.ts": [
13
+ {
14
+ "rule": "SHAPES001",
15
+ "subject": "bad",
16
+ "severity": "error"
17
+ }
18
+ ]
19
+ },
20
+ "note": "The pre-synthesis rule reads final values: two Buckets, one without a BucketName. The finding names the export, the rule's id and the rule's own severity; its message is not compared, and no location is asked for because F-Obs-Provenance is optional."
21
+ }
@@ -0,0 +1,4 @@
1
+ import { Bucket } from "@tsad/shapes";
2
+
3
+ export const good = new Bucket({ BucketName: "logs" });
4
+ export const bad = new Bucket({});
@@ -0,0 +1,21 @@
1
+ {
2
+ "rules": [
3
+ "F-Rule-Phase",
4
+ "F-Rule-Finding"
5
+ ],
6
+ "project": true,
7
+ "host": "shapes",
8
+ "verdicts": {
9
+ "pairs.ts": "fold"
10
+ },
11
+ "findings": {
12
+ "artifact": [
13
+ {
14
+ "rule": "SHAPES002",
15
+ "subject": "missing: Bucket",
16
+ "severity": "warning"
17
+ }
18
+ ]
19
+ },
20
+ "note": "No Bucket anywhere, so the post-synthesis rule, which reads the serialized artifact and not the namespace, reports the missing-resource form: the subject states what is absent because there is nothing to attach it to (L11.5). The pre-synthesis rule has nothing to say, and a finding it did not make must not appear."
21
+ }
@@ -0,0 +1,3 @@
1
+ import { Pair } from "@tsad/shapes";
2
+
3
+ export const p = new Pair(1, 2);
@@ -0,0 +1,21 @@
1
+ {
2
+ "rules": [
3
+ "F-Rule-Pure"
4
+ ],
5
+ "project": true,
6
+ "host": "shapes",
7
+ "verdicts": {
8
+ "buckets.ts": "fold",
9
+ "clock.ts": "run"
10
+ },
11
+ "findings": {
12
+ "buckets.ts": [
13
+ {
14
+ "rule": "SHAPES001",
15
+ "subject": "bad",
16
+ "severity": "error"
17
+ }
18
+ ]
19
+ },
20
+ "note": "The runner asks for each phase twice and requires the same findings both times; a rule that read a clock or the environment would fail there before any comparison. clock.ts runs, so it has no folded namespace and no rule sees it; the findings are the same whether or not it exists."
21
+ }
@@ -0,0 +1,4 @@
1
+ import { Bucket } from "@tsad/shapes";
2
+
3
+ export const good = new Bucket({ BucketName: "logs" });
4
+ export const bad = new Bucket({});
@@ -0,0 +1 @@
1
+ export const now = Date.now();
@@ -0,0 +1,21 @@
1
+ {
2
+ "rules": [
3
+ "F-Rule-Supply",
4
+ "F-Rule-Finding"
5
+ ],
6
+ "project": true,
7
+ "host": "shapes",
8
+ "verdicts": {
9
+ "app.ts": "fold"
10
+ },
11
+ "findings": {
12
+ "app.ts": [
13
+ {
14
+ "rule": "SHAPES001",
15
+ "subject": "store",
16
+ "severity": "error"
17
+ }
18
+ ]
19
+ },
20
+ "note": "The shapes host supplies two rules by id and phase and no code; the code is the implementation's, and an implementation that carries no rule of that id reports the hook unavailable and the fixture is skipped visibly. Here a Bucket exists, so the post-synthesis rule is silent and only the host's pre-synthesis rule speaks, under the severity the host declared for it (L11.6)."
21
+ }
@@ -0,0 +1,4 @@
1
+ import { Bucket, Pair } from "@tsad/shapes";
2
+
3
+ export const pair = new Pair("x", "y");
4
+ export const store = new Bucket({});
@@ -0,0 +1,49 @@
1
+ {
2
+ "rules": [
3
+ "F-Val-Domain",
4
+ "F-Val-Serializable"
5
+ ],
6
+ "project": true,
7
+ "host": "shapes",
8
+ "verdicts": {
9
+ "app.ts": "fold"
10
+ },
11
+ "exports": {
12
+ "app.ts": {
13
+ "scalars": {
14
+ "s": "text",
15
+ "n": 1.5,
16
+ "b": false,
17
+ "z": null,
18
+ "u": "$undefined"
19
+ },
20
+ "list": [
21
+ 1,
22
+ "two",
23
+ [
24
+ 3
25
+ ],
26
+ {
27
+ "four": 4
28
+ }
29
+ ],
30
+ "bucket": {
31
+ "entityType": "Bucket",
32
+ "lexicon": "shapes",
33
+ "props": {
34
+ "name": "logs"
35
+ },
36
+ "attributes": {}
37
+ },
38
+ "reference": {
39
+ "arn": {
40
+ "__attrRef": {
41
+ "entity": "bucket",
42
+ "attribute": "arn"
43
+ }
44
+ }
45
+ }
46
+ }
47
+ },
48
+ "note": "The closed union's cases that can reach the namespace in the full profile: every scalar including undefined, arrays and objects of them, a resource revived to a live instance, and the one envelope that survives, an attribute reference. Nothing else is a value."
49
+ }
@@ -0,0 +1,6 @@
1
+ import { Bucket } from "@tsad/shapes";
2
+
3
+ export const scalars = { s: "text", n: 1.5, b: false, z: null, u: undefined };
4
+ export const list = [1, "two", [3], { four: 4 }];
5
+ export const bucket = new Bucket({ name: "logs" });
6
+ export const reference = { arn: bucket.arn };
@@ -0,0 +1,41 @@
1
+ {
2
+ "rules": [
3
+ "F-Val-Envelope",
4
+ "F-Profile-DataHost"
5
+ ],
6
+ "project": true,
7
+ "host": "shapes",
8
+ "profiles": [
9
+ "data-host"
10
+ ],
11
+ "verdicts": {
12
+ "app.ts": "fold"
13
+ },
14
+ "exports": {
15
+ "app.ts": {
16
+ "tagged": {
17
+ "__intrinsic": "join",
18
+ "strings": [
19
+ "bucket-",
20
+ ""
21
+ ],
22
+ "values": [
23
+ 1
24
+ ]
25
+ },
26
+ "called": {
27
+ "__intrinsic": "ref",
28
+ "args": [
29
+ "Logs"
30
+ ]
31
+ },
32
+ "resource": {
33
+ "__resource": "Bucket",
34
+ "props": {
35
+ "name": "logs"
36
+ }
37
+ }
38
+ }
39
+ },
40
+ "note": "Three envelopes, recognised by key, as the data-host profile emits them: no fate runs, the envelope is the output. Each is a finished value that denotes something not yet constructed, never a thunk. A helper call is not here because the profile has no helpers: there is nothing to invoke."
41
+ }
@@ -0,0 +1,5 @@
1
+ import { Bucket, join, ref } from "@tsad/shapes";
2
+
3
+ export const tagged = join`bucket-${1}`;
4
+ export const called = ref("Logs");
5
+ export const resource = new Bucket({ name: "logs" });