@principles/core 1.242.0 → 1.244.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 (84) hide show
  1. package/dist/runtime-v2/feature-flags/__tests__/context-manifest-budget-flag.test.d.ts +12 -0
  2. package/dist/runtime-v2/feature-flags/__tests__/context-manifest-budget-flag.test.d.ts.map +1 -0
  3. package/dist/runtime-v2/feature-flags/__tests__/context-manifest-budget-flag.test.js +114 -0
  4. package/dist/runtime-v2/feature-flags/__tests__/context-manifest-budget-flag.test.js.map +1 -0
  5. package/dist/runtime-v2/feature-flags/__tests__/progressive-evaluator-flag.test.d.ts +8 -0
  6. package/dist/runtime-v2/feature-flags/__tests__/progressive-evaluator-flag.test.d.ts.map +1 -0
  7. package/dist/runtime-v2/feature-flags/__tests__/progressive-evaluator-flag.test.js +56 -0
  8. package/dist/runtime-v2/feature-flags/__tests__/progressive-evaluator-flag.test.js.map +1 -0
  9. package/dist/runtime-v2/feature-flags/feature-flag-contract.d.ts.map +1 -1
  10. package/dist/runtime-v2/feature-flags/feature-flag-contract.js +14 -0
  11. package/dist/runtime-v2/feature-flags/feature-flag-contract.js.map +1 -1
  12. package/dist/runtime-v2/index.d.ts +2 -0
  13. package/dist/runtime-v2/index.d.ts.map +1 -1
  14. package/dist/runtime-v2/index.js +2 -0
  15. package/dist/runtime-v2/index.js.map +1 -1
  16. package/dist/runtime-v2/internalization/__tests__/context-manifest.property.test.d.ts +12 -0
  17. package/dist/runtime-v2/internalization/__tests__/context-manifest.property.test.d.ts.map +1 -0
  18. package/dist/runtime-v2/internalization/__tests__/context-manifest.property.test.js +176 -0
  19. package/dist/runtime-v2/internalization/__tests__/context-manifest.property.test.js.map +1 -0
  20. package/dist/runtime-v2/internalization/__tests__/progressive-evaluator.property.test.d.ts +11 -0
  21. package/dist/runtime-v2/internalization/__tests__/progressive-evaluator.property.test.d.ts.map +1 -0
  22. package/dist/runtime-v2/internalization/__tests__/progressive-evaluator.property.test.js +154 -0
  23. package/dist/runtime-v2/internalization/__tests__/progressive-evaluator.property.test.js.map +1 -0
  24. package/dist/runtime-v2/internalization/__tests__/prompt-budget-manager.property.test.d.ts +12 -0
  25. package/dist/runtime-v2/internalization/__tests__/prompt-budget-manager.property.test.d.ts.map +1 -0
  26. package/dist/runtime-v2/internalization/__tests__/prompt-budget-manager.property.test.js +254 -0
  27. package/dist/runtime-v2/internalization/__tests__/prompt-budget-manager.property.test.js.map +1 -0
  28. package/dist/runtime-v2/internalization/__tests__/resolve-injection.property.test.d.ts +15 -0
  29. package/dist/runtime-v2/internalization/__tests__/resolve-injection.property.test.d.ts.map +1 -0
  30. package/dist/runtime-v2/internalization/__tests__/resolve-injection.property.test.js +150 -0
  31. package/dist/runtime-v2/internalization/__tests__/resolve-injection.property.test.js.map +1 -0
  32. package/dist/runtime-v2/internalization/artificer-runner.d.ts.map +1 -1
  33. package/dist/runtime-v2/internalization/artificer-runner.js +12 -0
  34. package/dist/runtime-v2/internalization/artificer-runner.js.map +1 -1
  35. package/dist/runtime-v2/internalization/context-manifest.d.ts +117 -0
  36. package/dist/runtime-v2/internalization/context-manifest.d.ts.map +1 -0
  37. package/dist/runtime-v2/internalization/context-manifest.js +156 -0
  38. package/dist/runtime-v2/internalization/context-manifest.js.map +1 -0
  39. package/dist/runtime-v2/internalization/context-manifests.d.ts +74 -0
  40. package/dist/runtime-v2/internalization/context-manifests.d.ts.map +1 -0
  41. package/dist/runtime-v2/internalization/context-manifests.js +192 -0
  42. package/dist/runtime-v2/internalization/context-manifests.js.map +1 -0
  43. package/dist/runtime-v2/internalization/dimension-coverage-policy.d.ts +54 -0
  44. package/dist/runtime-v2/internalization/dimension-coverage-policy.d.ts.map +1 -0
  45. package/dist/runtime-v2/internalization/dimension-coverage-policy.js +70 -0
  46. package/dist/runtime-v2/internalization/dimension-coverage-policy.js.map +1 -0
  47. package/dist/runtime-v2/internalization/dreamer-runner.d.ts.map +1 -1
  48. package/dist/runtime-v2/internalization/dreamer-runner.js +13 -1
  49. package/dist/runtime-v2/internalization/dreamer-runner.js.map +1 -1
  50. package/dist/runtime-v2/internalization/evaluator-output.d.ts +26 -0
  51. package/dist/runtime-v2/internalization/evaluator-output.d.ts.map +1 -1
  52. package/dist/runtime-v2/internalization/evaluator-output.js +7 -1
  53. package/dist/runtime-v2/internalization/evaluator-output.js.map +1 -1
  54. package/dist/runtime-v2/internalization/evaluator-runner.d.ts.map +1 -1
  55. package/dist/runtime-v2/internalization/evaluator-runner.js +13 -0
  56. package/dist/runtime-v2/internalization/evaluator-runner.js.map +1 -1
  57. package/dist/runtime-v2/internalization/index.d.ts +2 -0
  58. package/dist/runtime-v2/internalization/index.d.ts.map +1 -1
  59. package/dist/runtime-v2/internalization/index.js +2 -0
  60. package/dist/runtime-v2/internalization/index.js.map +1 -1
  61. package/dist/runtime-v2/internalization/progressive-evaluator.d.ts +115 -0
  62. package/dist/runtime-v2/internalization/progressive-evaluator.d.ts.map +1 -0
  63. package/dist/runtime-v2/internalization/progressive-evaluator.js +248 -0
  64. package/dist/runtime-v2/internalization/progressive-evaluator.js.map +1 -0
  65. package/dist/runtime-v2/internalization/prompt-budget-manager.d.ts +90 -0
  66. package/dist/runtime-v2/internalization/prompt-budget-manager.d.ts.map +1 -0
  67. package/dist/runtime-v2/internalization/prompt-budget-manager.js +149 -0
  68. package/dist/runtime-v2/internalization/prompt-budget-manager.js.map +1 -0
  69. package/dist/runtime-v2/internalization/resolve-injection.d.ts +62 -0
  70. package/dist/runtime-v2/internalization/resolve-injection.d.ts.map +1 -0
  71. package/dist/runtime-v2/internalization/resolve-injection.js +78 -0
  72. package/dist/runtime-v2/internalization/resolve-injection.js.map +1 -0
  73. package/dist/runtime-v2/internalization/scribe-runner.d.ts.map +1 -1
  74. package/dist/runtime-v2/internalization/scribe-runner.js +10 -0
  75. package/dist/runtime-v2/internalization/scribe-runner.js.map +1 -1
  76. package/dist/runtime-v2/internalization/summary-field-reader.d.ts +38 -0
  77. package/dist/runtime-v2/internalization/summary-field-reader.d.ts.map +1 -0
  78. package/dist/runtime-v2/internalization/summary-field-reader.js +108 -0
  79. package/dist/runtime-v2/internalization/summary-field-reader.js.map +1 -0
  80. package/dist/runtime-v2/runner/base-peer-runner.d.ts +36 -0
  81. package/dist/runtime-v2/runner/base-peer-runner.d.ts.map +1 -1
  82. package/dist/runtime-v2/runner/base-peer-runner.js +71 -0
  83. package/dist/runtime-v2/runner/base-peer-runner.js.map +1 -1
  84. package/package.json +1 -1
@@ -0,0 +1,176 @@
1
+ /**
2
+ * Property tests for ContextManifest well-formedness + ranking
3
+ * (design §6.2, §6.6.1, tasks 5.3–5.4).
4
+ *
5
+ * CP-12: manifest well-formedness (built-in manifests + synthetic generators)
6
+ * CP-13: unlisted fields sort last via rankOf
7
+ *
8
+ * @see .kiro/specs/internalization-progressive-disclosure/design.md §6.2, §6.6.1
9
+ * @see .kiro/specs/internalization-progressive-disclosure/requirements.md Requirement 4
10
+ */
11
+ import { describe, it, expect } from 'vitest';
12
+ import fc from 'fast-check';
13
+ import { CONTEXT_MANIFEST_SCHEMA_VERSION, validateManifest, rankOf, declaredFields, checkManifestCriterionAlignment, } from '../context-manifest.js';
14
+ import { BUILTIN_MANIFESTS, DREAMER_MANIFEST, SCRIBE_MANIFEST, ARTIFICER_MANIFEST, EVALUATOR_STAGE1_MANIFEST, EVALUATOR_STAGE2_MANIFEST, MANIFEST_RUNNER_KINDS, } from '../context-manifests.js';
15
+ import { DIMENSION_COVERAGE_POLICY, REQUIRED_FIDELITY_DIMENSIONS, ALL_DREAMER_DIMENSIONS, } from '../dimension-coverage-policy.js';
16
+ // ── CP-12: manifest well-formedness ──────────────────────────────────────────
17
+ describe('CP-12 — manifest well-formedness', () => {
18
+ it('BUILTIN_MANIFESTS has exactly 4 distinct runnerKinds (no diagnostic stage)', () => {
19
+ // dreamer, scribe, artificer, evaluator — never diag_rootcause/distiller/router
20
+ expect(MANIFEST_RUNNER_KINDS).toHaveLength(4);
21
+ expect(new Set(MANIFEST_RUNNER_KINDS)).toEqual(new Set(['dreamer', 'scribe', 'artificer', 'evaluator']));
22
+ for (const kind of MANIFEST_RUNNER_KINDS) {
23
+ expect(kind).not.toMatch(/^diag_/);
24
+ }
25
+ });
26
+ it('every built-in manifest is well-formed (non-adjudicator path)', () => {
27
+ for (const m of BUILTIN_MANIFESTS) {
28
+ // Pass isAdjudicator only for evaluator manifests.
29
+ const isAdj = m.runnerKind === 'evaluator';
30
+ const result = validateManifest(m, { isAdjudicator: isAdj });
31
+ expect(result.ok, `manifest ${m.manifestId}: ${result.ok ? '' : JSON.stringify(result.error)}`).toBe(true);
32
+ }
33
+ });
34
+ it('every built-in manifest has schemaVersion, positive budget, all-string tiers/priority', () => {
35
+ for (const m of BUILTIN_MANIFESTS) {
36
+ expect(m.schemaVersion).toBe(CONTEXT_MANIFEST_SCHEMA_VERSION);
37
+ expect(m.budgetTokens).toBeGreaterThan(0);
38
+ for (const arr of [m.tier0, m.tier1, m.tier2, m.priority]) {
39
+ for (const el of arr) {
40
+ expect(typeof el).toBe('string');
41
+ }
42
+ }
43
+ }
44
+ });
45
+ it('priority covers every declared field in every built-in manifest', () => {
46
+ // design §6.2: priority must cover tier0 ∪ tier1 ∪ tier2. The built-in
47
+ // manifests list every field explicitly.
48
+ for (const m of BUILTIN_MANIFESTS) {
49
+ const declared = new Set(declaredFields(m));
50
+ const priority = new Set(m.priority);
51
+ for (const path of declared) {
52
+ expect(priority.has(path), `${m.manifestId}: priority missing ${path}`).toBe(true);
53
+ }
54
+ }
55
+ });
56
+ it('budgetTokens not positive → validation fails', () => {
57
+ const bad = { ...DREAMER_MANIFEST, budgetTokens: 0 };
58
+ const result = validateManifest(bad);
59
+ expect(result.ok).toBe(false);
60
+ if (!result.ok)
61
+ expect(result.error.kind).toBe('budget_not_positive');
62
+ });
63
+ it('non-string element in a tier → validation fails (rc-4)', () => {
64
+ const bad = { ...DREAMER_MANIFEST, tier1: [...DREAMER_MANIFEST.tier1, 123] };
65
+ const result = validateManifest(bad);
66
+ expect(result.ok).toBe(false);
67
+ if (!result.ok)
68
+ expect(result.error.kind).toBe('non_string_element');
69
+ });
70
+ it('synthetic manifests with injected non-string elements are always rejected', () => {
71
+ const validBase = DREAMER_MANIFEST;
72
+ fc.assert(fc.property(fc.constantFrom('tier0', 'tier1', 'tier2', 'priority'), fc.oneof(fc.integer(), fc.boolean(), fc.constant(null), fc.constant(undefined)), (arrayName, badElement) => {
73
+ const arr = validBase[arrayName];
74
+ const corrupted = [...arr, badElement];
75
+ const manifest = { ...validBase, [arrayName]: corrupted };
76
+ const result = validateManifest(manifest);
77
+ expect(result.ok).toBe(false);
78
+ if (!result.ok)
79
+ expect(result.error.kind).toBe('non_string_element');
80
+ }), { numRuns: 60 });
81
+ });
82
+ });
83
+ // ── INV-MANIFEST-CRITERION (§6.6.1) ───────────────────────────────────────────
84
+ describe('INV-MANIFEST-CRITERION — adjudicator manifests inject all non-excluded dims', () => {
85
+ it('both evaluator stage manifests inject all 4 non-excluded dreamer dimensions', () => {
86
+ // strategicPerspective is excluded; the other 4 must be injectable.
87
+ for (const m of [EVALUATOR_STAGE1_MANIFEST, EVALUATOR_STAGE2_MANIFEST]) {
88
+ const allPaths = new Set([...m.tier0, ...m.tier1, ...m.tier2]);
89
+ for (const dim of ALL_DREAMER_DIMENSIONS) {
90
+ const path = `dreamer.summary.${dim}`;
91
+ if (DIMENSION_COVERAGE_POLICY[dim] === 'excluded') {
92
+ // excluded dims must NOT be injected (design §6.6.1).
93
+ expect(allPaths.has(path), `${m.manifestId} must not inject excluded ${path}`).toBe(false);
94
+ }
95
+ else {
96
+ expect(allPaths.has(path), `${m.manifestId} must inject ${path}`).toBe(true);
97
+ }
98
+ }
99
+ }
100
+ });
101
+ it('promoting an excluded dim to required without adding its path fails alignment', () => {
102
+ // Simulate the regression: take STAGE1 (valid), drop dreamer.summary.riskLevel,
103
+ // and check alignment catches it.
104
+ const tampered = {
105
+ ...EVALUATOR_STAGE1_MANIFEST,
106
+ tier1: EVALUATOR_STAGE1_MANIFEST.tier1.filter((p) => p !== 'dreamer.summary.riskLevel'),
107
+ };
108
+ const err = checkManifestCriterionAlignment(tampered, true);
109
+ expect(err).not.toBeNull();
110
+ expect(err?.kind).toBe('manifest_criterion_misaligned');
111
+ if (err && err.kind === 'manifest_criterion_misaligned') {
112
+ expect(err.detail).toContain('riskLevel');
113
+ }
114
+ });
115
+ it('non-evaluator manifests skip the alignment check (not adjudicators)', () => {
116
+ for (const m of [DREAMER_MANIFEST, SCRIBE_MANIFEST, ARTIFICER_MANIFEST]) {
117
+ expect(checkManifestCriterionAlignment(m, true)).toBeNull();
118
+ }
119
+ });
120
+ it('validateManifest flags misaligned adjudicator when isAdjudicator=true', () => {
121
+ const tampered = {
122
+ ...EVALUATOR_STAGE1_MANIFEST,
123
+ tier1: EVALUATOR_STAGE1_MANIFEST.tier1.filter((p) => p !== 'dreamer.summary.betterDecision'),
124
+ };
125
+ const result = validateManifest(tampered, { isAdjudicator: true });
126
+ expect(result.ok).toBe(false);
127
+ if (!result.ok)
128
+ expect(result.error.kind).toBe('manifest_criterion_misaligned');
129
+ });
130
+ });
131
+ // ── CP-13: unlisted fields sort last ─────────────────────────────────────────
132
+ describe('CP-13 — unlisted fields sort last via rankOf', () => {
133
+ it('rankOf(listed field) === its index in priority', () => {
134
+ for (const m of BUILTIN_MANIFESTS) {
135
+ m.priority.forEach((path, idx) => {
136
+ expect(rankOf(path, m)).toBe(idx);
137
+ });
138
+ }
139
+ });
140
+ it('rankOf(unlisted declared field) is strictly greater than every listed field rank', () => {
141
+ fc.assert(fc.property(fc.constantFrom(...BUILTIN_MANIFESTS), fc.string({ minLength: 1, maxLength: 12 }).map((s) => `extra.${s}`), (m, extraPath) => {
142
+ fc.pre(!m.priority.includes(extraPath));
143
+ // Add extraPath to tier1 so it's "declared" but unlisted.
144
+ const tier1WithExtra = [...m.tier1, extraPath];
145
+ const manifest = { ...m, tier1: tier1WithExtra };
146
+ const extraRank = rankOf(extraPath, manifest);
147
+ for (const listed of m.priority) {
148
+ expect(extraRank).toBeGreaterThan(rankOf(listed, manifest));
149
+ }
150
+ }), { numRuns: 80 });
151
+ });
152
+ it('rankOf is deterministic: same input → same rank', () => {
153
+ for (const m of BUILTIN_MANIFESTS) {
154
+ for (const path of declaredFields(m)) {
155
+ expect(rankOf(path, m)).toBe(rankOf(path, m));
156
+ }
157
+ }
158
+ });
159
+ });
160
+ // ── dimension coverage policy sanity ─────────────────────────────────────────
161
+ describe('DIMENSION_COVERAGE_POLICY — single source of truth', () => {
162
+ it('covers all 5 dreamer dimensions', () => {
163
+ for (const dim of ALL_DREAMER_DIMENSIONS) {
164
+ expect(Object.hasOwn(DIMENSION_COVERAGE_POLICY, dim)).toBe(true);
165
+ }
166
+ expect(Object.keys(DIMENSION_COVERAGE_POLICY)).toHaveLength(5);
167
+ });
168
+ it('REQUIRED_FIDELITY_DIMENSIONS = exactly the required ones', () => {
169
+ expect(REQUIRED_FIDELITY_DIMENSIONS).toEqual(['betterDecision', 'rationale', 'riskLevel']);
170
+ });
171
+ it('strategicPerspective is the only excluded dimension', () => {
172
+ const excluded = ALL_DREAMER_DIMENSIONS.filter((d) => DIMENSION_COVERAGE_POLICY[d] === 'excluded');
173
+ expect(excluded).toEqual(['strategicPerspective']);
174
+ });
175
+ });
176
+ //# sourceMappingURL=context-manifest.property.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-manifest.property.test.js","sourceRoot":"","sources":["../../../../src/runtime-v2/internalization/__tests__/context-manifest.property.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Property tests for the progressive evaluator (design §6.5, tasks 9.2–9.3).
3
+ *
4
+ * CP-21: flagged criteria equivalence (flagged ⟺ reasons non-empty; missing
5
+ * fields → undetermined; required-only filter on missingDimensions)
6
+ * CP-22: deterministic forced sampling (fnv1a32, no Math.random)
7
+ *
8
+ * @see .kiro/specs/internalization-progressive-disclosure/design.md §6.5
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=progressive-evaluator.property.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progressive-evaluator.property.test.d.ts","sourceRoot":"","sources":["../../../../src/runtime-v2/internalization/__tests__/progressive-evaluator.property.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
@@ -0,0 +1,154 @@
1
+ /**
2
+ * Property tests for the progressive evaluator (design §6.5, tasks 9.2–9.3).
3
+ *
4
+ * CP-21: flagged criteria equivalence (flagged ⟺ reasons non-empty; missing
5
+ * fields → undetermined; required-only filter on missingDimensions)
6
+ * CP-22: deterministic forced sampling (fnv1a32, no Math.random)
7
+ *
8
+ * @see .kiro/specs/internalization-progressive-disclosure/design.md §6.5
9
+ */
10
+ import { describe, it, expect } from 'vitest';
11
+ import fc from 'fast-check';
12
+ import { evaluateFlaggedCriteria, isForcedStage2, fnv1a32, IMPLEMENTATION_FIDELITY_THRESHOLD, } from '../progressive-evaluator.js';
13
+ // ── CP-21: flagged criteria equivalence ──────────────────────────────────────
14
+ describe('CP-21 — flagged criteria equivalence', () => {
15
+ it('flagged === true iff reasons is non-empty', () => {
16
+ // A clearly flagged output: required dim missing.
17
+ const flagged = evaluateFlaggedCriteria({
18
+ compressionFidelity: { missingDimensions: ['riskLevel'], optionalUncovered: [], explanation: '' },
19
+ painCoverage: { fullyCovered: true, uncoveredAspects: [], explanation: '' },
20
+ implementationFidelity: { score: 0.9 },
21
+ });
22
+ expect(flagged.flagged).toBe(true);
23
+ expect(flagged.reasons).toHaveLength(1);
24
+ expect(flagged.reasons).toContain('missing_dimensions');
25
+ // A clean output: all pass.
26
+ const clean = evaluateFlaggedCriteria({
27
+ compressionFidelity: { missingDimensions: [], optionalUncovered: [], explanation: '' },
28
+ painCoverage: { fullyCovered: true, uncoveredAspects: [], explanation: '' },
29
+ implementationFidelity: { score: 0.9 },
30
+ });
31
+ expect(clean.flagged).toBe(false);
32
+ expect(clean.reasons).toHaveLength(0);
33
+ });
34
+ it('optional/excluded dims in missingDimensions do NOT trigger flag (required-only)', () => {
35
+ const result = evaluateFlaggedCriteria({
36
+ compressionFidelity: { missingDimensions: ['badDecision', 'strategicPerspective', 'unknownDim'], optionalUncovered: ['badDecision'], explanation: '' },
37
+ painCoverage: { fullyCovered: true, uncoveredAspects: [], explanation: '' },
38
+ implementationFidelity: { score: 0.9 },
39
+ });
40
+ expect(result.flagged).toBe(false);
41
+ expect(result.reasons).not.toContain('missing_dimensions');
42
+ });
43
+ it('painCoverage.fullyCovered === false triggers flag', () => {
44
+ const result = evaluateFlaggedCriteria({
45
+ compressionFidelity: { missingDimensions: [], optionalUncovered: [], explanation: '' },
46
+ painCoverage: { fullyCovered: false, uncoveredAspects: ['x'], explanation: '' },
47
+ implementationFidelity: { score: 0.9 },
48
+ });
49
+ expect(result.flagged).toBe(true);
50
+ expect(result.reasons).toContain('pain_not_fully_covered');
51
+ });
52
+ it('implementationFidelity.score < threshold triggers flag', () => {
53
+ const result = evaluateFlaggedCriteria({
54
+ compressionFidelity: { missingDimensions: [], optionalUncovered: [], explanation: '' },
55
+ painCoverage: { fullyCovered: true, uncoveredAspects: [], explanation: '' },
56
+ implementationFidelity: { score: IMPLEMENTATION_FIDELITY_THRESHOLD - 0.01 },
57
+ });
58
+ expect(result.flagged).toBe(true);
59
+ expect(result.reasons).toContain('implementation_fidelity_below_threshold');
60
+ });
61
+ it('score exactly at threshold does NOT trigger flag (boundary)', () => {
62
+ const result = evaluateFlaggedCriteria({
63
+ compressionFidelity: { missingDimensions: [], optionalUncovered: [], explanation: '' },
64
+ painCoverage: { fullyCovered: true, uncoveredAspects: [], explanation: '' },
65
+ implementationFidelity: { score: IMPLEMENTATION_FIDELITY_THRESHOLD },
66
+ });
67
+ expect(result.flagged).toBe(false);
68
+ });
69
+ it('missing fields → undetermined (never silent pass, rc-3)', () => {
70
+ const result = evaluateFlaggedCriteria({});
71
+ expect(result.flagged).toBe(false);
72
+ expect(result.undetermined.length).toBeGreaterThan(0);
73
+ expect(result.undetermined).toContain('compressionFidelity');
74
+ expect(result.undetermined).toContain('painCoverage');
75
+ expect(result.undetermined).toContain('implementationFidelity');
76
+ });
77
+ it('non-object input → all undetermined', () => {
78
+ const result = evaluateFlaggedCriteria(null);
79
+ expect(result.flagged).toBe(false);
80
+ expect(result.undetermined).toContain('output_not_object');
81
+ });
82
+ it('property: flagged ⟺ reasons non-empty across random inputs', () => {
83
+ const scoreGen = fc.float({ min: 0, max: 1, noNaN: true });
84
+ const fullyCoveredGen = fc.boolean();
85
+ const missingDimsGen = fc.array(fc.constantFrom('betterDecision', 'rationale', 'riskLevel', 'badDecision', 'strategicPerspective', 'unknownX'));
86
+ fc.assert(fc.property(scoreGen, fullyCoveredGen, missingDimsGen, (score, fullyCovered, missingDims) => {
87
+ const result = evaluateFlaggedCriteria({
88
+ compressionFidelity: { missingDimensions: missingDims, optionalUncovered: [], explanation: '' },
89
+ painCoverage: { fullyCovered, uncoveredAspects: [], explanation: '' },
90
+ implementationFidelity: { score },
91
+ });
92
+ // flagged MUST equal reasons.length > 0.
93
+ expect(result.flagged).toBe(result.reasons.length > 0);
94
+ }), { numRuns: 200 });
95
+ });
96
+ it('property: adversarial unknown input never throws, always returns a Result', () => {
97
+ const adversarial = fc.oneof(fc.constant(null), fc.constant(undefined), fc.string(), fc.integer(), fc.constant({}), fc.array(fc.anything()), fc.constant({ __proto__: { polluted: true } }));
98
+ fc.assert(fc.property(adversarial, (input) => {
99
+ const result = evaluateFlaggedCriteria(input);
100
+ expect(typeof result.flagged).toBe('boolean');
101
+ expect(Array.isArray(result.reasons)).toBe(true);
102
+ expect(Array.isArray(result.undetermined)).toBe(true);
103
+ }), { numRuns: 100 });
104
+ });
105
+ });
106
+ // ── CP-22: deterministic forced sampling ─────────────────────────────────────
107
+ describe('CP-22 — deterministic forced sampling', () => {
108
+ it('fnv1a32 is deterministic: same input → same output', () => {
109
+ fc.assert(fc.property(fc.string(), (s) => {
110
+ expect(fnv1a32(s)).toBe(fnv1a32(s));
111
+ }), { numRuns: 100 });
112
+ });
113
+ it('isForcedStage2 is deterministic: same taskId → same result', () => {
114
+ fc.assert(fc.property(fc.string(), (taskId) => {
115
+ expect(isForcedStage2(taskId)).toBe(isForcedStage2(taskId));
116
+ }), { numRuns: 100 });
117
+ });
118
+ it('Math.random is NOT used (replacing it with a throwing impl does not affect isForcedStage2)', () => {
119
+ const original = Math.random;
120
+ Math.random = () => { throw new Error('Math.random should not be called'); };
121
+ try {
122
+ for (const taskId of ['', 'a', 'test-123', '🎨', 'x'.repeat(1000)]) {
123
+ expect(() => isForcedStage2(taskId)).not.toThrow();
124
+ }
125
+ }
126
+ finally {
127
+ Math.random = original;
128
+ }
129
+ });
130
+ it('modulus=1 forces every task; modulus<=0 forces none', () => {
131
+ expect(isForcedStage2('any-task', 1)).toBe(true);
132
+ expect(isForcedStage2('any-task', 0)).toBe(false);
133
+ expect(isForcedStage2('any-task', -1)).toBe(false);
134
+ });
135
+ it('~5% hit rate with default modulus (statistical sanity)', () => {
136
+ let hits = 0;
137
+ const total = 1000;
138
+ for (let i = 0; i < total; i++) {
139
+ if (isForcedStage2(`task-${i}`))
140
+ hits++;
141
+ }
142
+ // ~5% ± 3% tolerance for randomness-free deterministic distribution.
143
+ expect(hits).toBeGreaterThan(20);
144
+ expect(hits).toBeLessThan(80);
145
+ });
146
+ it('empty string / Unicode / super-long all produce finite results', () => {
147
+ for (const s of ['', '🎨', 'x'.repeat(10000)]) {
148
+ const hash = fnv1a32(s);
149
+ expect(Number.isFinite(hash)).toBe(true);
150
+ expect(hash).toBeGreaterThanOrEqual(0);
151
+ }
152
+ });
153
+ });
154
+ //# sourceMappingURL=progressive-evaluator.property.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progressive-evaluator.property.test.js","sourceRoot":"","sources":["../../../../src/runtime-v2/internalization/__tests__/progressive-evaluator.property.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Property tests for PromptBudgetManager (design §6.3, tasks 5.6–5.8).
3
+ *
4
+ * CP-14: allocation determinism + total order
5
+ * CP-15: field conservation + budget accounting
6
+ * CP-16: bounded-safe preview serialization
7
+ *
8
+ * @see .kiro/specs/internalization-progressive-disclosure/design.md §6.3
9
+ * @see .kiro/specs/internalization-progressive-disclosure/requirements.md Requirement 5
10
+ */
11
+ export {};
12
+ //# sourceMappingURL=prompt-budget-manager.property.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-budget-manager.property.test.d.ts","sourceRoot":"","sources":["../../../../src/runtime-v2/internalization/__tests__/prompt-budget-manager.property.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}