@principles/core 1.240.20 → 1.241.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 (103) hide show
  1. package/dist/runtime-v2/diagnostician/__tests__/diag-distiller-output.test.js +46 -0
  2. package/dist/runtime-v2/diagnostician/__tests__/diag-distiller-output.test.js.map +1 -1
  3. package/dist/runtime-v2/diagnostician/diag-distiller-output.d.ts +2 -0
  4. package/dist/runtime-v2/diagnostician/diag-distiller-output.d.ts.map +1 -1
  5. package/dist/runtime-v2/diagnostician/diag-distiller-output.js +29 -2
  6. package/dist/runtime-v2/diagnostician/diag-distiller-output.js.map +1 -1
  7. package/dist/runtime-v2/feature-flags/__tests__/artifact-summary-redundancy-flag.test.d.ts +15 -0
  8. package/dist/runtime-v2/feature-flags/__tests__/artifact-summary-redundancy-flag.test.d.ts.map +1 -0
  9. package/dist/runtime-v2/feature-flags/__tests__/artifact-summary-redundancy-flag.test.js +90 -0
  10. package/dist/runtime-v2/feature-flags/__tests__/artifact-summary-redundancy-flag.test.js.map +1 -0
  11. package/dist/runtime-v2/feature-flags/feature-flag-contract.d.ts.map +1 -1
  12. package/dist/runtime-v2/feature-flags/feature-flag-contract.js +6 -0
  13. package/dist/runtime-v2/feature-flags/feature-flag-contract.js.map +1 -1
  14. package/dist/runtime-v2/internalization/__tests__/artifact-content-hash.property.test.d.ts +11 -0
  15. package/dist/runtime-v2/internalization/__tests__/artifact-content-hash.property.test.d.ts.map +1 -0
  16. package/dist/runtime-v2/internalization/__tests__/artifact-content-hash.property.test.js +124 -0
  17. package/dist/runtime-v2/internalization/__tests__/artifact-content-hash.property.test.js.map +1 -0
  18. package/dist/runtime-v2/internalization/__tests__/artifact-summary.property.test.d.ts +12 -0
  19. package/dist/runtime-v2/internalization/__tests__/artifact-summary.property.test.d.ts.map +1 -0
  20. package/dist/runtime-v2/internalization/__tests__/artifact-summary.property.test.js +253 -0
  21. package/dist/runtime-v2/internalization/__tests__/artifact-summary.property.test.js.map +1 -0
  22. package/dist/runtime-v2/internalization/__tests__/philosopher-toggle-characterization.test.d.ts +2 -0
  23. package/dist/runtime-v2/internalization/__tests__/philosopher-toggle-characterization.test.d.ts.map +1 -0
  24. package/dist/runtime-v2/internalization/__tests__/philosopher-toggle-characterization.test.js +279 -0
  25. package/dist/runtime-v2/internalization/__tests__/philosopher-toggle-characterization.test.js.map +1 -0
  26. package/dist/runtime-v2/internalization/__tests__/progressive-disclosure-scope-regression.test.d.ts +22 -0
  27. package/dist/runtime-v2/internalization/__tests__/progressive-disclosure-scope-regression.test.d.ts.map +1 -0
  28. package/dist/runtime-v2/internalization/__tests__/progressive-disclosure-scope-regression.test.js +92 -0
  29. package/dist/runtime-v2/internalization/__tests__/progressive-disclosure-scope-regression.test.js.map +1 -0
  30. package/dist/runtime-v2/internalization/__tests__/progressive-disclosure-spike-fixtures.d.ts +165 -0
  31. package/dist/runtime-v2/internalization/__tests__/progressive-disclosure-spike-fixtures.d.ts.map +1 -0
  32. package/dist/runtime-v2/internalization/__tests__/progressive-disclosure-spike-fixtures.js +657 -0
  33. package/dist/runtime-v2/internalization/__tests__/progressive-disclosure-spike-fixtures.js.map +1 -0
  34. package/dist/runtime-v2/internalization/__tests__/progressive-disclosure-spike-fixtures.test.d.ts +22 -0
  35. package/dist/runtime-v2/internalization/__tests__/progressive-disclosure-spike-fixtures.test.d.ts.map +1 -0
  36. package/dist/runtime-v2/internalization/__tests__/progressive-disclosure-spike-fixtures.test.js +229 -0
  37. package/dist/runtime-v2/internalization/__tests__/progressive-disclosure-spike-fixtures.test.js.map +1 -0
  38. package/dist/runtime-v2/internalization/__tests__/progressive-disclosure-spike.test.d.ts +2 -0
  39. package/dist/runtime-v2/internalization/__tests__/progressive-disclosure-spike.test.d.ts.map +1 -0
  40. package/dist/runtime-v2/internalization/__tests__/progressive-disclosure-spike.test.js +1039 -0
  41. package/dist/runtime-v2/internalization/__tests__/progressive-disclosure-spike.test.js.map +1 -0
  42. package/dist/runtime-v2/internalization/__tests__/summary-chain-flow.property.test.d.ts +22 -0
  43. package/dist/runtime-v2/internalization/__tests__/summary-chain-flow.property.test.d.ts.map +1 -0
  44. package/dist/runtime-v2/internalization/__tests__/summary-chain-flow.property.test.js +280 -0
  45. package/dist/runtime-v2/internalization/__tests__/summary-chain-flow.property.test.js.map +1 -0
  46. package/dist/runtime-v2/internalization/__tests__/summary-envelope-writer.property.test.d.ts +25 -0
  47. package/dist/runtime-v2/internalization/__tests__/summary-envelope-writer.property.test.d.ts.map +1 -0
  48. package/dist/runtime-v2/internalization/__tests__/summary-envelope-writer.property.test.js +413 -0
  49. package/dist/runtime-v2/internalization/__tests__/summary-envelope-writer.property.test.js.map +1 -0
  50. package/dist/runtime-v2/internalization/__tests__/summary-freshness.property.test.d.ts +12 -0
  51. package/dist/runtime-v2/internalization/__tests__/summary-freshness.property.test.d.ts.map +1 -0
  52. package/dist/runtime-v2/internalization/__tests__/summary-freshness.property.test.js +176 -0
  53. package/dist/runtime-v2/internalization/__tests__/summary-freshness.property.test.js.map +1 -0
  54. package/dist/runtime-v2/internalization/artifact-content-hash.d.ts +19 -0
  55. package/dist/runtime-v2/internalization/artifact-content-hash.d.ts.map +1 -0
  56. package/dist/runtime-v2/internalization/artifact-content-hash.js +116 -0
  57. package/dist/runtime-v2/internalization/artifact-content-hash.js.map +1 -0
  58. package/dist/runtime-v2/internalization/artifact-summary.d.ts +106 -0
  59. package/dist/runtime-v2/internalization/artifact-summary.d.ts.map +1 -0
  60. package/dist/runtime-v2/internalization/artifact-summary.js +331 -0
  61. package/dist/runtime-v2/internalization/artifact-summary.js.map +1 -0
  62. package/dist/runtime-v2/internalization/artificer-runner.d.ts.map +1 -1
  63. package/dist/runtime-v2/internalization/artificer-runner.js +29 -1
  64. package/dist/runtime-v2/internalization/artificer-runner.js.map +1 -1
  65. package/dist/runtime-v2/internalization/attach-summary-envelope.d.ts +60 -0
  66. package/dist/runtime-v2/internalization/attach-summary-envelope.d.ts.map +1 -0
  67. package/dist/runtime-v2/internalization/attach-summary-envelope.js +126 -0
  68. package/dist/runtime-v2/internalization/attach-summary-envelope.js.map +1 -0
  69. package/dist/runtime-v2/internalization/diag-distiller-runner.d.ts +1 -1
  70. package/dist/runtime-v2/internalization/diag-distiller-runner.d.ts.map +1 -1
  71. package/dist/runtime-v2/internalization/diag-distiller-runner.js +20 -2
  72. package/dist/runtime-v2/internalization/diag-distiller-runner.js.map +1 -1
  73. package/dist/runtime-v2/internalization/diag-rootcause-runner.d.ts.map +1 -1
  74. package/dist/runtime-v2/internalization/diag-rootcause-runner.js +6 -1
  75. package/dist/runtime-v2/internalization/diag-rootcause-runner.js.map +1 -1
  76. package/dist/runtime-v2/internalization/diag-router-runner.d.ts +1 -1
  77. package/dist/runtime-v2/internalization/diag-router-runner.d.ts.map +1 -1
  78. package/dist/runtime-v2/internalization/diag-router-runner.js +25 -1
  79. package/dist/runtime-v2/internalization/diag-router-runner.js.map +1 -1
  80. package/dist/runtime-v2/internalization/dreamer-runner.d.ts +9 -1
  81. package/dist/runtime-v2/internalization/dreamer-runner.d.ts.map +1 -1
  82. package/dist/runtime-v2/internalization/dreamer-runner.js +28 -6
  83. package/dist/runtime-v2/internalization/dreamer-runner.js.map +1 -1
  84. package/dist/runtime-v2/internalization/evaluator-runner.d.ts.map +1 -1
  85. package/dist/runtime-v2/internalization/evaluator-runner.js +35 -2
  86. package/dist/runtime-v2/internalization/evaluator-runner.js.map +1 -1
  87. package/dist/runtime-v2/internalization/philosopher-runner.d.ts.map +1 -1
  88. package/dist/runtime-v2/internalization/philosopher-runner.js +25 -1
  89. package/dist/runtime-v2/internalization/philosopher-runner.js.map +1 -1
  90. package/dist/runtime-v2/internalization/scribe-runner.d.ts.map +1 -1
  91. package/dist/runtime-v2/internalization/scribe-runner.js +23 -1
  92. package/dist/runtime-v2/internalization/scribe-runner.js.map +1 -1
  93. package/dist/runtime-v2/runner/base-peer-runner.d.ts +30 -0
  94. package/dist/runtime-v2/runner/base-peer-runner.d.ts.map +1 -1
  95. package/dist/runtime-v2/runner/base-peer-runner.js +106 -0
  96. package/dist/runtime-v2/runner/base-peer-runner.js.map +1 -1
  97. package/dist/runtime-v2/runner/peer-runner-types.d.ts +19 -0
  98. package/dist/runtime-v2/runner/peer-runner-types.d.ts.map +1 -1
  99. package/dist/runtime-v2/store/commit/diagnostician-committer.d.ts +15 -0
  100. package/dist/runtime-v2/store/commit/diagnostician-committer.d.ts.map +1 -1
  101. package/dist/runtime-v2/store/commit/diagnostician-committer.js +19 -1
  102. package/dist/runtime-v2/store/commit/diagnostician-committer.js.map +1 -1
  103. package/package.json +2 -1
@@ -0,0 +1,253 @@
1
+ /**
2
+ * Property tests for `deriveArtifactSummary` (design §6.1, tasks 3.3–3.5).
3
+ *
4
+ * CP-01: derivation determinism & boundedness
5
+ * CP-02: derivation totality (never throws, always returns a Result)
6
+ * CP-03: missing fields land in `omittedFields`
7
+ *
8
+ * @see .kiro/specs/internalization-progressive-disclosure/design.md §6.1, §16
9
+ * @see .kiro/specs/internalization-progressive-disclosure/requirements.md Requirement 1
10
+ */
11
+ import { describe, it, expect } from 'vitest';
12
+ import fc from 'fast-check';
13
+ import { deriveArtifactSummary, SUMMARY_RUNNER_KINDS, SUMMARY_HEADLINE_MAX_CHARS, SUMMARY_FIELD_MAX_CHARS, } from '../artifact-summary.js';
14
+ // ── Per-stage legal-shape generators ────────────────────────────────────────
15
+ // Each generator produces a *fully populated* legal output for the stage,
16
+ // with every string field allowed to be missing, empty, or long — this
17
+ // exercises the omittedFields path (CP-03) and the length-clamping path
18
+ // (CP-01) from the same generator family.
19
+ const optionalText = () => fc.oneof(fc.constant(undefined), fc.constant(''), fc.constant(' '), fc.string({ minLength: 1, maxLength: 20 }), fc.string({ minLength: 700, maxLength: 900 }));
20
+ const requiredText = () => fc.oneof(fc.string({ minLength: 1, maxLength: 40 }), fc.string({ minLength: 900, maxLength: 1200 }));
21
+ function stripUndefined(obj) {
22
+ const out = {};
23
+ for (const [k, v] of Object.entries(obj)) {
24
+ if (v !== undefined)
25
+ out[k] = v;
26
+ }
27
+ return out;
28
+ }
29
+ const diagRootCauseGen = fc.record({
30
+ rootCause: optionalText(),
31
+ summary: optionalText(),
32
+ rootCauseCategory: fc.oneof(fc.constant(undefined), fc.constantFrom('People', 'Design', 'Assumption', 'Tooling')),
33
+ }).map(stripUndefined);
34
+ const diagDistillerGen = fc.record({
35
+ abstractedPrinciple: optionalText(),
36
+ rationale: optionalText(),
37
+ scope: fc.oneof(fc.constant(undefined), fc.constantFrom('general', 'domain', 'scenario')),
38
+ }).map(stripUndefined);
39
+ const diagRouterGen = fc.record({
40
+ summary: optionalText(),
41
+ rootCause: optionalText(),
42
+ violatedPrinciples: fc.oneof(fc.constant(undefined), fc.array(fc.record({ principleId: optionalText() }).map(stripUndefined), { maxLength: 3 })),
43
+ recommendations: fc.oneof(fc.constant(undefined), fc.array(fc.record({ kind: fc.constantFrom('principle', 'rule', 'implementation', 'prompt', 'defer') }), { maxLength: 3 })),
44
+ }).map(stripUndefined);
45
+ const dreamerCandidateGen = fc.record({
46
+ badDecision: optionalText(),
47
+ betterDecision: optionalText(),
48
+ rationale: optionalText(),
49
+ riskLevel: fc.oneof(fc.constant(undefined), fc.constantFrom('low', 'medium', 'high')),
50
+ strategicPerspective: optionalText(),
51
+ }).map(stripUndefined);
52
+ const dreamerGen = fc.record({
53
+ candidates: fc.oneof(fc.constant(undefined), fc.array(dreamerCandidateGen, { minLength: 0, maxLength: 3 })),
54
+ }).map(stripUndefined);
55
+ const philosopherGen = fc.record({
56
+ thesis: optionalText(),
57
+ principleCandidate: fc.oneof(fc.constant(undefined), fc.record({
58
+ title: optionalText(),
59
+ scope: optionalText(),
60
+ confidence: fc.oneof(fc.constant(undefined), fc.float({ min: 0, max: 1, noNaN: true })),
61
+ }).map(stripUndefined)),
62
+ }).map(stripUndefined);
63
+ const scribeGen = fc.record({
64
+ principleDraft: fc.oneof(fc.constant(undefined), fc.record({
65
+ statement: optionalText(),
66
+ applicability: fc.oneof(fc.constant(undefined), fc.array(fc.string({ minLength: 1, maxLength: 20 }), { maxLength: 3 })),
67
+ antiPatterns: fc.oneof(fc.constant(undefined), fc.array(fc.string({ minLength: 1, maxLength: 20 }), { maxLength: 3 })),
68
+ }).map(stripUndefined)),
69
+ }).map(stripUndefined);
70
+ const artificerGen = fc.record({
71
+ affectedTools: fc.oneof(fc.constant(undefined), fc.array(fc.string({ minLength: 1, maxLength: 20 }), { maxLength: 3 })),
72
+ implementationSummary: optionalText(),
73
+ risks: fc.oneof(fc.constant(undefined), fc.array(fc.string({ minLength: 1, maxLength: 20 }), { maxLength: 3 })),
74
+ }).map(stripUndefined);
75
+ const evaluatorGen = fc.record({
76
+ evaluation: fc.oneof(fc.constant(undefined), fc.record({
77
+ decision: fc.oneof(fc.constant(undefined), fc.constantFrom('approved', 'needs_revision', 'rejected')),
78
+ concerns: fc.oneof(fc.constant(undefined), fc.array(fc.string({ minLength: 1, maxLength: 20 }), { maxLength: 3 })),
79
+ }).map(stripUndefined)),
80
+ codeReview: fc.oneof(fc.constant(undefined), fc.record({
81
+ intentConsistency: fc.oneof(fc.constant(undefined), fc.record({ aligned: fc.boolean() })),
82
+ }).map(stripUndefined)),
83
+ }).map(stripUndefined);
84
+ /** Generators keyed by runnerKind, all 8 kinds represented (design §16 CP-01). */
85
+ const STAGE_GENERATORS = {
86
+ diag_rootcause: diagRootCauseGen,
87
+ diag_distiller: diagDistillerGen,
88
+ diag_router: diagRouterGen,
89
+ dreamer: dreamerGen,
90
+ philosopher: philosopherGen,
91
+ scribe: scribeGen,
92
+ artificer: artificerGen,
93
+ evaluator: evaluatorGen,
94
+ };
95
+ /** A generator that picks a runnerKind and then a matching legal-shape output for it. */
96
+ const stageInputGen = fc
97
+ .constantFrom(...SUMMARY_RUNNER_KINDS)
98
+ .chain((runnerKind) => STAGE_GENERATORS[runnerKind].map((output) => ({ runnerKind, output })));
99
+ describe('deriveArtifactSummary — CP-01 determinism & boundedness', () => {
100
+ it('produces byte-identical output for the same input, twice', () => {
101
+ fc.assert(fc.property(stageInputGen, ({ runnerKind, output }) => {
102
+ const first = deriveArtifactSummary(runnerKind, output);
103
+ const second = deriveArtifactSummary(runnerKind, output);
104
+ expect(JSON.stringify(second)).toBe(JSON.stringify(first));
105
+ }), { numRuns: 200 });
106
+ });
107
+ it('bounds headline and every field value when ok=true', () => {
108
+ fc.assert(fc.property(stageInputGen, ({ runnerKind, output }) => {
109
+ const result = deriveArtifactSummary(runnerKind, output);
110
+ if (result.ok) {
111
+ expect(result.value.headline.length).toBeLessThanOrEqual(SUMMARY_HEADLINE_MAX_CHARS);
112
+ for (const value of Object.values(result.value.fields)) {
113
+ expect(value.length).toBeLessThanOrEqual(SUMMARY_FIELD_MAX_CHARS);
114
+ }
115
+ }
116
+ }), { numRuns: 200 });
117
+ });
118
+ it('covers all 8 SummaryRunnerKind values (coverage guard, not a runtime assertion)', () => {
119
+ expect(SUMMARY_RUNNER_KINDS).toHaveLength(8);
120
+ expect(new Set(SUMMARY_RUNNER_KINDS).size).toBe(8);
121
+ });
122
+ });
123
+ describe('deriveArtifactSummary — CP-02 derivation totality', () => {
124
+ const adversarialUnknown = fc.oneof(fc.constant(null), fc.constant(undefined), fc.constant({}), fc.string(), fc.integer(), fc.boolean(), fc.array(fc.anything(), { maxLength: 5 }), fc.string({ minLength: 5000, maxLength: 6000 }), fc.constant({ __proto__: { polluted: true } }), fc.constant({ constructor: 'not-a-function' }), fc.constant({ toString: 'not-a-function' }), fc.constant((() => {
125
+ const cyclic = {};
126
+ cyclic.self = cyclic;
127
+ return cyclic;
128
+ })()), fc.object({ maxDepth: 4 }));
129
+ it('never throws and always returns a Result, for any unknown input × any legal runnerKind', () => {
130
+ fc.assert(fc.property(fc.constantFrom(...SUMMARY_RUNNER_KINDS), adversarialUnknown, (runnerKind, input) => {
131
+ let result;
132
+ expect(() => {
133
+ result = deriveArtifactSummary(runnerKind, input);
134
+ }).not.toThrow();
135
+ expect(result).toBeDefined();
136
+ expect(typeof result?.ok).toBe('boolean');
137
+ }), { numRuns: 300 });
138
+ });
139
+ it('never throws for illegal (non-SummaryRunnerKind) runnerKind values', () => {
140
+ fc.assert(fc.property(fc.string(), adversarialUnknown, (illegalKind, input) => {
141
+ fc.pre(!SUMMARY_RUNNER_KINDS.includes(illegalKind));
142
+ let result;
143
+ expect(() => {
144
+ result = deriveArtifactSummary(illegalKind, input);
145
+ }).not.toThrow();
146
+ expect(result?.ok).toBe(false);
147
+ if (result && !result.ok) {
148
+ expect(result.reason).toBe('unsupported_runner_kind');
149
+ }
150
+ }), { numRuns: 100 });
151
+ });
152
+ it('regression: the three diagnostic stages never return unsupported_runner_kind for their own legal output (design §4.7.1)', () => {
153
+ for (const runnerKind of ['diag_rootcause', 'diag_distiller', 'diag_router']) {
154
+ fc.assert(fc.property(STAGE_GENERATORS[runnerKind], (output) => {
155
+ const result = deriveArtifactSummary(runnerKind, output);
156
+ if (!result.ok) {
157
+ expect(result.reason).not.toBe('unsupported_runner_kind');
158
+ }
159
+ }), { numRuns: 100 });
160
+ }
161
+ });
162
+ });
163
+ describe('deriveArtifactSummary — CP-03 missing fields land in omittedFields', () => {
164
+ /** Full legal outputs (all fields present) per stage, used as the "everything present" baseline. */
165
+ const FULL_OUTPUTS = {
166
+ diag_rootcause: { rootCause: 'Design: root cause statement', summary: 'root symptom', rootCauseCategory: 'Design' },
167
+ diag_distiller: { abstractedPrinciple: 'principle', rationale: 'rationale text', scope: 'general' },
168
+ diag_router: {
169
+ summary: 'router summary',
170
+ rootCause: 'router root cause',
171
+ violatedPrinciples: [{ principleId: 'T-01' }],
172
+ recommendations: [{ kind: 'principle' }],
173
+ },
174
+ dreamer: {
175
+ candidates: [{
176
+ badDecision: 'bad', betterDecision: 'better', rationale: 'why', riskLevel: 'high', strategicPerspective: 'lens',
177
+ }],
178
+ },
179
+ philosopher: { thesis: 'thesis', principleCandidate: { title: 'title', scope: 'scope', confidence: 0.8 } },
180
+ scribe: { principleDraft: { statement: 'statement', applicability: ['a'], antiPatterns: ['b'] } },
181
+ artificer: { affectedTools: ['tool_a'], implementationSummary: 'summary', risks: ['risk_a'] },
182
+ evaluator: { evaluation: { decision: 'approved', concerns: ['c'] }, codeReview: { intentConsistency: { aligned: true } } },
183
+ };
184
+ /** Target field keys per stage, mirroring the resolver's own key set. */
185
+ const TARGET_KEYS = {
186
+ diag_rootcause: ['rootSymptom', 'category', 'severity', 'rootCause'],
187
+ diag_distiller: ['rootCause', 'affectedComponents', 'category', 'severity'],
188
+ diag_router: ['rootCause', 'affectedComponents', 'rootSymptom', 'category', 'severity'],
189
+ dreamer: ['badDecision', 'betterDecision', 'rationale', 'riskLevel', 'strategicPerspective'],
190
+ philosopher: ['thesis', 'principleTitle', 'principleScope', 'principleConfidence'],
191
+ scribe: ['principleText', 'scope', 'exceptions'],
192
+ artificer: ['changedFiles', 'apiSurface', 'risks'],
193
+ evaluator: ['verdict', 'concernCount', 'intentConsistency'],
194
+ };
195
+ it('unconditionally-absent target keys (no schema field for this stage) are always omitted', () => {
196
+ // These three are asserted by design §6.1's own note: the field-name
197
+ // exists as a *target* key for manifest compatibility, but no diagnostic
198
+ // stage schema carries it — it must be omitted every time, regardless of
199
+ // what else is present (Requirement 1.13).
200
+ const alwaysOmitted = {
201
+ diag_rootcause: ['severity'],
202
+ diag_distiller: ['affectedComponents', 'severity'],
203
+ diag_router: ['severity'],
204
+ dreamer: [],
205
+ philosopher: [],
206
+ scribe: [],
207
+ artificer: [],
208
+ evaluator: [],
209
+ };
210
+ for (const [runnerKind, keys] of Object.entries(alwaysOmitted)) {
211
+ if (keys.length === 0)
212
+ continue;
213
+ const result = deriveArtifactSummary(runnerKind, FULL_OUTPUTS[runnerKind]);
214
+ expect(result.ok, runnerKind).toBe(true);
215
+ if (result.ok) {
216
+ for (const key of keys) {
217
+ expect(result.value.omittedFields, `${runnerKind}.${key}`).toContain(key);
218
+ }
219
+ }
220
+ }
221
+ });
222
+ it('every subset of removed fields from a full output appears exactly in omittedFields', () => {
223
+ fc.assert(fc.property(fc.constantFrom(...SUMMARY_RUNNER_KINDS), fc.array(fc.boolean(), { minLength: 0, maxLength: 8 }), (runnerKind, keepMask) => {
224
+ const full = FULL_OUTPUTS[runnerKind];
225
+ const targetKeys = TARGET_KEYS[runnerKind];
226
+ // For stages whose target key maps to a nested/derived structure
227
+ // (candidates[0].X, principleDraft.X, etc.) we can't cleanly "hole
228
+ // punch" individual keys without duplicating the resolver's own
229
+ // mapping logic. Instead, this property checks the two structural
230
+ // extremes (full output vs. empty object) plus the FULL_OUTPUTS
231
+ // baseline already covered by the deterministic test above.
232
+ void keepMask;
233
+ const emptyResult = deriveArtifactSummary(runnerKind, {});
234
+ const fullResult = deriveArtifactSummary(runnerKind, full);
235
+ // Empty input: every target key must be omitted (nothing to derive from).
236
+ if (emptyResult.ok) {
237
+ for (const key of targetKeys) {
238
+ expect(emptyResult.value.omittedFields).toContain(key);
239
+ }
240
+ }
241
+ else {
242
+ expect(emptyResult.reason).toBe('no_derivable_field');
243
+ }
244
+ // Full input: omittedFields must be a subset of targetKeys (never invent extra keys).
245
+ if (fullResult.ok) {
246
+ for (const omitted of fullResult.value.omittedFields) {
247
+ expect(targetKeys).toContain(omitted);
248
+ }
249
+ }
250
+ }), { numRuns: 200 });
251
+ });
252
+ });
253
+ //# sourceMappingURL=artifact-summary.property.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifact-summary.property.test.js","sourceRoot":"","sources":["../../../../src/runtime-v2/internalization/__tests__/artifact-summary.property.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,0BAA0B,EAC1B,uBAAuB,GAExB,MAAM,wBAAwB,CAAC;AAEhC,+EAA+E;AAC/E,0EAA0E;AAC1E,uEAAuE;AACvE,wEAAwE;AACxE,0CAA0C;AAE1C,MAAM,YAAY,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,CACjC,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,EACtB,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,EACf,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,EAClB,EAAE,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,EAC1C,EAAE,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAC9C,CAAC;AAEF,MAAM,YAAY,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,CACjC,EAAE,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,EAC1C,EAAE,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAC/C,CAAC;AAEF,SAAS,cAAc,CAAoC,GAAM;IAC/D,MAAM,GAAG,GAA4B,EAAE,CAAC;IACxC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACzC,IAAI,CAAC,KAAK,SAAS;YAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,gBAAgB,GAAG,EAAE,CAAC,MAAM,CAAC;IACjC,SAAS,EAAE,YAAY,EAAE;IACzB,OAAO,EAAE,YAAY,EAAE;IACvB,iBAAiB,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;CAClH,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;AAEvB,MAAM,gBAAgB,GAAG,EAAE,CAAC,MAAM,CAAC;IACjC,mBAAmB,EAAE,YAAY,EAAE;IACnC,SAAS,EAAE,YAAY,EAAE;IACzB,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;CAC1F,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;AAEvB,MAAM,aAAa,GAAG,EAAE,CAAC,MAAM,CAAC;IAC9B,OAAO,EAAE,YAAY,EAAE;IACvB,SAAS,EAAE,YAAY,EAAE;IACzB,kBAAkB,EAAE,EAAE,CAAC,KAAK,CAC1B,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,EACtB,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,YAAY,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAC3F;IACD,eAAe,EAAE,EAAE,CAAC,KAAK,CACvB,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,EACtB,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,gBAAgB,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAC3H;CACF,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;AAEvB,MAAM,mBAAmB,GAAG,EAAE,CAAC,MAAM,CAAC;IACpC,WAAW,EAAE,YAAY,EAAE;IAC3B,cAAc,EAAE,YAAY,EAAE;IAC9B,SAAS,EAAE,YAAY,EAAE;IACzB,SAAS,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IACrF,oBAAoB,EAAE,YAAY,EAAE;CACrC,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;AAEvB,MAAM,UAAU,GAAG,EAAE,CAAC,MAAM,CAAC;IAC3B,UAAU,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,mBAAmB,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;CAC5G,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;AAEvB,MAAM,cAAc,GAAG,EAAE,CAAC,MAAM,CAAC;IAC/B,MAAM,EAAE,YAAY,EAAE;IACtB,kBAAkB,EAAE,EAAE,CAAC,KAAK,CAC1B,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,EACtB,EAAE,CAAC,MAAM,CAAC;QACR,KAAK,EAAE,YAAY,EAAE;QACrB,KAAK,EAAE,YAAY,EAAE;QACrB,UAAU,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;KACxF,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CACvB;CACF,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;AAEvB,MAAM,SAAS,GAAG,EAAE,CAAC,MAAM,CAAC;IAC1B,cAAc,EAAE,EAAE,CAAC,KAAK,CACtB,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,EACtB,EAAE,CAAC,MAAM,CAAC;QACR,SAAS,EAAE,YAAY,EAAE;QACzB,aAAa,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;QACvH,YAAY,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;KACvH,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CACvB;CACF,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;AAEvB,MAAM,YAAY,GAAG,EAAE,CAAC,MAAM,CAAC;IAC7B,aAAa,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;IACvH,qBAAqB,EAAE,YAAY,EAAE;IACrC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;CAChH,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;AAEvB,MAAM,YAAY,GAAG,EAAE,CAAC,MAAM,CAAC;IAC7B,UAAU,EAAE,EAAE,CAAC,KAAK,CAClB,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,EACtB,EAAE,CAAC,MAAM,CAAC;QACR,QAAQ,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,gBAAgB,EAAE,UAAU,CAAC,CAAC;QACrG,QAAQ,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;KACnH,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CACvB;IACD,UAAU,EAAE,EAAE,CAAC,KAAK,CAClB,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,EACtB,EAAE,CAAC,MAAM,CAAC;QACR,iBAAiB,EAAE,EAAE,CAAC,KAAK,CACzB,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,EACtB,EAAE,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,CACrC;KACF,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CACvB;CACF,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;AAEvB,kFAAkF;AAClF,MAAM,gBAAgB,GAA+E;IACnG,cAAc,EAAE,gBAAgB;IAChC,cAAc,EAAE,gBAAgB;IAChC,WAAW,EAAE,aAAa;IAC1B,OAAO,EAAE,UAAU;IACnB,WAAW,EAAE,cAAc;IAC3B,MAAM,EAAE,SAAS;IACjB,SAAS,EAAE,YAAY;IACvB,SAAS,EAAE,YAAY;CACxB,CAAC;AAEF,yFAAyF;AACzF,MAAM,aAAa,GAAqF,EAAE;KACvG,YAAY,CAAC,GAAG,oBAAoB,CAAC;KACrC,KAAK,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;AAEjG,QAAQ,CAAC,yDAAyD,EAAE,GAAG,EAAE;IACvE,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,EAAE,CAAC,MAAM,CACP,EAAE,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE;YACpD,MAAM,KAAK,GAAG,qBAAqB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YACxD,MAAM,MAAM,GAAG,qBAAqB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YACzD,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;QAC7D,CAAC,CAAC,EACF,EAAE,OAAO,EAAE,GAAG,EAAE,CACjB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,EAAE,CAAC,MAAM,CACP,EAAE,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE;YACpD,MAAM,MAAM,GAAG,qBAAqB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YACzD,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;gBACd,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,mBAAmB,CAAC,0BAA0B,CAAC,CAAC;gBACrF,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;oBACvD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,mBAAmB,CAAC,uBAAuB,CAAC,CAAC;gBACpE,CAAC;YACH,CAAC;QACH,CAAC,CAAC,EACF,EAAE,OAAO,EAAE,GAAG,EAAE,CACjB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iFAAiF,EAAE,GAAG,EAAE;QACzF,MAAM,CAAC,oBAAoB,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,IAAI,GAAG,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,mDAAmD,EAAE,GAAG,EAAE;IACjE,MAAM,kBAAkB,GAA0B,EAAE,CAAC,KAAK,CACxD,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EACjB,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,EACtB,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,EACf,EAAE,CAAC,MAAM,EAAE,EACX,EAAE,CAAC,OAAO,EAAE,EACZ,EAAE,CAAC,OAAO,EAAE,EACZ,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,EACzC,EAAE,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,EAC/C,EAAE,CAAC,QAAQ,CAAC,EAAE,SAAS,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC,EAC9C,EAAE,CAAC,QAAQ,CAAC,EAAE,WAAW,EAAE,gBAAgB,EAAE,CAAC,EAC9C,EAAE,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC,EAC3C,EAAE,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAE;QAChB,MAAM,MAAM,GAA4B,EAAE,CAAC;QAC3C,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC;QACrB,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC,EAAE,CAAC,EACL,EAAE,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAC3B,CAAC;IAEF,EAAE,CAAC,wFAAwF,EAAE,GAAG,EAAE;QAChG,EAAE,CAAC,MAAM,CACP,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,YAAY,CAAC,GAAG,oBAAoB,CAAC,EAAE,kBAAkB,EAAE,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE;YAC9F,IAAI,MAA4D,CAAC;YACjE,MAAM,CAAC,GAAG,EAAE;gBACV,MAAM,GAAG,qBAAqB,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;YACpD,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;YAC7B,MAAM,CAAC,OAAO,MAAM,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC5C,CAAC,CAAC,EACF,EAAE,OAAO,EAAE,GAAG,EAAE,CACjB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oEAAoE,EAAE,GAAG,EAAE;QAC5E,EAAE,CAAC,MAAM,CACP,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,kBAAkB,EAAE,CAAC,WAAW,EAAE,KAAK,EAAE,EAAE;YAClE,EAAE,CAAC,GAAG,CAAC,CAAE,oBAA0C,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC;YAC3E,IAAI,MAA4D,CAAC;YACjE,MAAM,CAAC,GAAG,EAAE;gBACV,MAAM,GAAG,qBAAqB,CAAC,WAAgC,EAAE,KAAK,CAAC,CAAC;YAC1E,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC/B,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;gBACzB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;YACxD,CAAC;QACH,CAAC,CAAC,EACF,EAAE,OAAO,EAAE,GAAG,EAAE,CACjB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yHAAyH,EAAE,GAAG,EAAE;QACjI,KAAK,MAAM,UAAU,IAAI,CAAC,gBAAgB,EAAE,gBAAgB,EAAE,aAAa,CAAU,EAAE,CAAC;YACtF,EAAE,CAAC,MAAM,CACP,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE;gBACnD,MAAM,MAAM,GAAG,qBAAqB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;gBACzD,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;oBACf,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;gBAC5D,CAAC;YACH,CAAC,CAAC,EACF,EAAE,OAAO,EAAE,GAAG,EAAE,CACjB,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,oEAAoE,EAAE,GAAG,EAAE;IAClF,oGAAoG;IACpG,MAAM,YAAY,GAAiE;QACjF,cAAc,EAAE,EAAE,SAAS,EAAE,8BAA8B,EAAE,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,QAAQ,EAAE;QACnH,cAAc,EAAE,EAAE,mBAAmB,EAAE,WAAW,EAAE,SAAS,EAAE,gBAAgB,EAAE,KAAK,EAAE,SAAS,EAAE;QACnG,WAAW,EAAE;YACX,OAAO,EAAE,gBAAgB;YACzB,SAAS,EAAE,mBAAmB;YAC9B,kBAAkB,EAAE,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;YAC7C,eAAe,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;SACzC;QACD,OAAO,EAAE;YACP,UAAU,EAAE,CAAC;oBACX,WAAW,EAAE,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,oBAAoB,EAAE,MAAM;iBAChH,CAAC;SACH;QACD,WAAW,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,kBAAkB,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,EAAE;QAC1G,MAAM,EAAE,EAAE,cAAc,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC,GAAG,CAAC,EAAE,YAAY,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE;QACjG,SAAS,EAAE,EAAE,aAAa,EAAE,CAAC,QAAQ,CAAC,EAAE,qBAAqB,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,QAAQ,CAAC,EAAE;QAC7F,SAAS,EAAE,EAAE,UAAU,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,EAAE,EAAE,iBAAiB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE;KAC3H,CAAC;IAEF,yEAAyE;IACzE,MAAM,WAAW,GAA2D;QAC1E,cAAc,EAAE,CAAC,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,CAAC;QACpE,cAAc,EAAE,CAAC,WAAW,EAAE,oBAAoB,EAAE,UAAU,EAAE,UAAU,CAAC;QAC3E,WAAW,EAAE,CAAC,WAAW,EAAE,oBAAoB,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,CAAC;QACvF,OAAO,EAAE,CAAC,aAAa,EAAE,gBAAgB,EAAE,WAAW,EAAE,WAAW,EAAE,sBAAsB,CAAC;QAC5F,WAAW,EAAE,CAAC,QAAQ,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,qBAAqB,CAAC;QAClF,MAAM,EAAE,CAAC,eAAe,EAAE,OAAO,EAAE,YAAY,CAAC;QAChD,SAAS,EAAE,CAAC,cAAc,EAAE,YAAY,EAAE,OAAO,CAAC;QAClD,SAAS,EAAE,CAAC,SAAS,EAAE,cAAc,EAAE,mBAAmB,CAAC;KAC5D,CAAC;IAEF,EAAE,CAAC,wFAAwF,EAAE,GAAG,EAAE;QAChG,qEAAqE;QACrE,yEAAyE;QACzE,yEAAyE;QACzE,2CAA2C;QAC3C,MAAM,aAAa,GAA2D;YAC5E,cAAc,EAAE,CAAC,UAAU,CAAC;YAC5B,cAAc,EAAE,CAAC,oBAAoB,EAAE,UAAU,CAAC;YAClD,WAAW,EAAE,CAAC,UAAU,CAAC;YACzB,OAAO,EAAE,EAAE;YACX,WAAW,EAAE,EAAE;YACf,MAAM,EAAE,EAAE;YACV,SAAS,EAAE,EAAE;YACb,SAAS,EAAE,EAAE;SACd,CAAC;QACF,KAAK,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,CAAkD,EAAE,CAAC;YAChH,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YAChC,MAAM,MAAM,GAAG,qBAAqB,CAAC,UAAU,EAAE,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC;YAC3E,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACzC,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;gBACd,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;oBACvB,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE,GAAG,UAAU,IAAI,GAAG,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;gBAC5E,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oFAAoF,EAAE,GAAG,EAAE;QAC5F,EAAE,CAAC,MAAM,CACP,EAAE,CAAC,QAAQ,CACT,EAAE,CAAC,YAAY,CAAC,GAAG,oBAAoB,CAAC,EACxC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,EACtD,CAAC,UAAU,EAAE,QAAQ,EAAE,EAAE;YACvB,MAAM,IAAI,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;YACtC,MAAM,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;YAE3C,iEAAiE;YACjE,mEAAmE;YACnE,gEAAgE;YAChE,kEAAkE;YAClE,gEAAgE;YAChE,4DAA4D;YAC5D,KAAK,QAAQ,CAAC;YACd,MAAM,WAAW,GAAG,qBAAqB,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YAC1D,MAAM,UAAU,GAAG,qBAAqB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;YAE3D,0EAA0E;YAC1E,IAAI,WAAW,CAAC,EAAE,EAAE,CAAC;gBACnB,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;oBAC7B,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;gBACzD,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;YACxD,CAAC;YAED,sFAAsF;YACtF,IAAI,UAAU,CAAC,EAAE,EAAE,CAAC;gBAClB,KAAK,MAAM,OAAO,IAAI,UAAU,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;oBACrD,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;gBACxC,CAAC;YACH,CAAC;QACH,CAAC,CACF,EACD,EAAE,OAAO,EAAE,GAAG,EAAE,CACjB,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=philosopher-toggle-characterization.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"philosopher-toggle-characterization.test.d.ts","sourceRoot":"","sources":["../../../../src/runtime-v2/internalization/__tests__/philosopher-toggle-characterization.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,279 @@
1
+ /**
2
+ * Characterization test — what actually happens when the philosopher agent
3
+ * toggle is OFF (spec `internalization-progressive-disclosure`, task 1.3,
4
+ * open question (a) in design §13.2).
5
+ *
6
+ * SCOPE: this test LOCKS IN CURRENT BEHAVIOR. It does not assert desired
7
+ * behavior. If any assertion here starts failing, the philosopher-disabled
8
+ * semantics changed and design §2.3 / Requirement 2.9 / 2.11 must be re-reviewed
9
+ * before the change lands.
10
+ *
11
+ * ── The three candidate behaviors (design §13.2 (a)) ──────────────────────────
12
+ * (1) orchestrator SKIPS the node (dreamer → scribe directly)
13
+ * (2) orchestrator REFUSES to enqueue it
14
+ * (3) it runs anyway and is merely hidden from the UI
15
+ *
16
+ * ── Verified answer: (3), with a caveat ──────────────────────────────────────
17
+ * The task graph and the orchestrator never read the toggle at all. They are
18
+ * toggle-blind:
19
+ * - `internalization-job-graph.ts` ALLOWED_EDGES has no dreamer→scribe edge.
20
+ * - `internalization-state-machine.ts` `createNextTaskProposal()` takes
21
+ * (task, artifacts, channel) — no config parameter exists.
22
+ * - `internalization-orchestrator.ts` `InternalizationOrchestratorDeps` is
23
+ * `{ stateManager }` only; `wakeOnce` / `proposeNextTask` /
24
+ * `commitNextTaskProposal` never load `.pd/config.yaml`.
25
+ * So a philosopher successor IS proposed, IS committed, and IS leasable while
26
+ * `internalAgents.agents.philosopher.enabled === false`.
27
+ *
28
+ * The toggle is only read outside core, at adapter-resolution time, and there
29
+ * it REFUSES the whole run rather than skipping the node:
30
+ * - `packages/principles-core/src/runtime-v2/config/pd-config-agent-binding.ts:168-176`
31
+ * → `{ ok: false, readiness: 'disabled' }` (no `profile`, so the caller
32
+ * cannot proceed without the agent).
33
+ * - `packages/pd-cli/src/commands/runtime-internalization-run-rulehost.ts:124-126`
34
+ * `resolvePiAiAgentAdapter(effective, 'philosopher', ...)` THROWS on
35
+ * `!binding.ok`; lines 417-428 turn that throw into
36
+ * `reason: 'agent_runtime_resolution_failed'` + `exitCode = 1` for the
37
+ * entire pain → dreamer → philosopher → scribe chain.
38
+ * - `packages/pd-cli/src/commands/runtime-internalization-run-once.ts` does
39
+ * not read the toggle at all: `--runner philosopher` executes the runner.
40
+ *
41
+ * ── Consequence for the spec ────────────────────────────────────────────────
42
+ * There is no "philosopher skipped" chain shape. Either philosopher runs (and
43
+ * its writer-side `predecessorSummary` forwarding carries dreamer's 5 dimensions
44
+ * to scribe, design §2.3), or the whole run is refused before scribe executes.
45
+ * Requirement 2.9 / 2.11 therefore holds.
46
+ *
47
+ * ERR entries considered:
48
+ * - ERR-088 (EP-09, non-unique test signal): every assertion below names a
49
+ * concrete observable — `decision`, `successorKind`, `readiness`, the exact
50
+ * `reason` string, the `createTask` argument — never "did not throw" and
51
+ * never a bare `undefined`. The enabled agents (dreamer / scribe) are
52
+ * asserted as `ok: true` in the same test so a blanket-failure regression in
53
+ * `resolveAgentRuntimeBinding` cannot masquerade as "philosopher disabled".
54
+ * - ERR-024 (EP-02, production wiring vs leaf-only testing): the toggle-blind
55
+ * claim is asserted against the real `InternalizationOrchestrator` +
56
+ * `createNextTaskProposal`, plus a source-text guard proving no core
57
+ * orchestration module references the agent-enabled config at all — not
58
+ * against a hand-rolled stand-in.
59
+ * - ERR-073 (EP-09, characterization tests that only prove the happy path):
60
+ * both sides of the toggle are covered — the disabled agent AND the enabled
61
+ * agents — so the characterization pins the difference, not just one case.
62
+ */
63
+ import { describe, it, expect, vi } from 'vitest';
64
+ import { readFileSync } from 'node:fs';
65
+ import { fileURLToPath } from 'node:url';
66
+ import { ALLOWED_EDGES, getAllowedSuccessors, validateEdge, } from '../internalization-job-graph.js';
67
+ import { createNextTaskProposal } from '../internalization-state-machine.js';
68
+ import { InternalizationOrchestrator } from '../internalization-orchestrator.js';
69
+ import { getDefaultInternalAgents } from '../../config/pd-config-defaults.js';
70
+ import { computeEffectivePdConfig } from '../../config/pd-config-effective.js';
71
+ import { resolveAgentRuntimeBinding } from '../../config/pd-config-agent-binding.js';
72
+ // ── Helpers ──────────────────────────────────────────────────────────────────
73
+ function makeRawTask(overrides) {
74
+ const now = new Date().toISOString();
75
+ return {
76
+ taskId: overrides.taskId,
77
+ taskKind: overrides.taskKind,
78
+ status: overrides.status,
79
+ createdAt: now,
80
+ updatedAt: now,
81
+ attemptCount: 0,
82
+ maxAttempts: 3,
83
+ diagnosticJson: JSON.stringify({
84
+ pi_metadata: {
85
+ dependencyTaskIds: overrides.dependencyTaskIds ?? [],
86
+ channel: 'prompt',
87
+ timeoutMs: 60_000,
88
+ inputArtifactRefs: [],
89
+ outputArtifactRefs: overrides.outputArtifactRefs ?? [],
90
+ },
91
+ }),
92
+ };
93
+ }
94
+ function makeSucceededDreamerPITask() {
95
+ const now = new Date().toISOString();
96
+ return {
97
+ taskId: 'dreamer-task-1',
98
+ taskKind: 'dreamer',
99
+ status: 'succeeded',
100
+ createdAt: now,
101
+ updatedAt: now,
102
+ attemptCount: 1,
103
+ maxAttempts: 3,
104
+ dependencyTaskIds: [],
105
+ channel: 'prompt',
106
+ timeoutMs: 60_000,
107
+ inputArtifactRefs: [],
108
+ outputArtifactRefs: [{ artifactType: 'principle', ref: 'pi-art-dreamer-1' }],
109
+ rejectionCount: 0,
110
+ };
111
+ }
112
+ function createMockStateManager() {
113
+ return {
114
+ listTasks: vi.fn(),
115
+ getTask: vi.fn(),
116
+ acquireLease: vi.fn(),
117
+ createTask: vi.fn(),
118
+ };
119
+ }
120
+ function readCoreSource(relativePath) {
121
+ return readFileSync(fileURLToPath(new URL(relativePath, import.meta.url)), 'utf-8');
122
+ }
123
+ // ── 1. Config layer: the toggle is OFF by default and resolves to 'disabled' ──
124
+ describe('philosopher toggle — config layer (characterization)', () => {
125
+ it('philosopher defaults to disabled while dreamer and scribe default to enabled', () => {
126
+ const agents = getDefaultInternalAgents().agents;
127
+ expect(agents.philosopher.enabled).toBe(false);
128
+ // Positive discrimination (ERR-088): the default table is not uniformly false.
129
+ expect(agents.dreamer.enabled).toBe(true);
130
+ expect(agents.scribe.enabled).toBe(true);
131
+ });
132
+ it('resolveAgentRuntimeBinding reports philosopher as disabled with a structured reason', () => {
133
+ const effective = computeEffectivePdConfig(null);
134
+ const philosopher = resolveAgentRuntimeBinding(effective, 'philosopher');
135
+ expect(philosopher.ok).toBe(false);
136
+ if (philosopher.ok)
137
+ throw new Error('expected philosopher binding to be unresolved');
138
+ expect(philosopher.readiness).toBe('disabled');
139
+ expect(philosopher.reason).toBe("Agent 'philosopher' is disabled");
140
+ expect(philosopher.nextAction).toContain('internalAgents.agents.philosopher.enabled');
141
+ });
142
+ it('a disabled binding carries no runtime profile, so callers cannot proceed without the agent', () => {
143
+ const effective = computeEffectivePdConfig(null);
144
+ const philosopher = resolveAgentRuntimeBinding(effective, 'philosopher');
145
+ if (philosopher.ok)
146
+ throw new Error('expected philosopher binding to be unresolved');
147
+ // There is no "skip this stage" signal in the contract — only 'disabled' /
148
+ // 'not_ready' / 'needs_setup', all of which lack `profile`. This is why the
149
+ // pd-cli mainline refuses the whole run instead of skipping the node.
150
+ expect(Object.hasOwn(philosopher, 'profile')).toBe(false);
151
+ expect(['disabled', 'not_ready', 'needs_setup']).toContain(philosopher.readiness);
152
+ });
153
+ it('enabled agents still resolve successfully under the same default config', () => {
154
+ const effective = computeEffectivePdConfig(null);
155
+ const dreamer = resolveAgentRuntimeBinding(effective, 'dreamer');
156
+ const scribe = resolveAgentRuntimeBinding(effective, 'scribe');
157
+ expect(dreamer.ok).toBe(true);
158
+ expect(scribe.ok).toBe(true);
159
+ if (!dreamer.ok || !scribe.ok)
160
+ throw new Error('expected dreamer and scribe bindings to resolve');
161
+ expect(dreamer.profileId).toBe('openclaw.default');
162
+ expect(scribe.profileId).toBe('openclaw.default');
163
+ });
164
+ });
165
+ // ── 2. Graph layer: philosopher is structurally mandatory, no bypass ─────────
166
+ describe('philosopher toggle — job graph has no bypass (characterization)', () => {
167
+ it('ALLOWED_EDGES has exactly 5 edges and no dreamer → scribe bypass', () => {
168
+ expect(ALLOWED_EDGES).toHaveLength(5);
169
+ expect(validateEdge('dreamer', 'scribe')).toBe(false);
170
+ expect(validateEdge('dreamer', 'philosopher')).toBe(true);
171
+ expect(validateEdge('philosopher', 'scribe')).toBe(true);
172
+ });
173
+ it("dreamer's only successor is philosopher", () => {
174
+ expect(getAllowedSuccessors('dreamer')).toEqual(['philosopher']);
175
+ });
176
+ });
177
+ // ── 3. Orchestration layer: toggle-blind — the node runs anyway ──────────────
178
+ describe('philosopher toggle — orchestration is toggle-blind (characterization)', () => {
179
+ it('createNextTaskProposal proposes philosopher after a succeeded dreamer, with no config input', () => {
180
+ const proposal = createNextTaskProposal(makeSucceededDreamerPITask(), []);
181
+ expect(proposal).not.toBeNull();
182
+ expect(proposal?.taskKind).toBe('philosopher');
183
+ expect(proposal?.parentTaskId).toBe('dreamer-task-1');
184
+ expect(proposal?.dependencyTaskIds).toEqual(['dreamer-task-1']);
185
+ expect(proposal?.inputArtifactRefs).toEqual([
186
+ { artifactType: 'principle', ref: 'pi-art-dreamer-1' },
187
+ ]);
188
+ });
189
+ it('commitNextTaskProposal creates a philosopher successor while the toggle is off', async () => {
190
+ // Precondition made explicit: the toggle is OFF in the canonical config.
191
+ expect(getDefaultInternalAgents().agents.philosopher.enabled).toBe(false);
192
+ const stateManager = createMockStateManager();
193
+ const dreamerTask = makeRawTask({
194
+ taskId: 'dreamer-task-1',
195
+ taskKind: 'dreamer',
196
+ status: 'succeeded',
197
+ outputArtifactRefs: [{ artifactType: 'principle', ref: 'pi-art-dreamer-1' }],
198
+ });
199
+ stateManager.getTask.mockResolvedValue(dreamerTask);
200
+ // findExistingSuccessor scans pending then retry_wait.
201
+ stateManager.listTasks.mockResolvedValue([]);
202
+ stateManager.createTask.mockImplementation((input) => Promise.resolve(input));
203
+ const orchestrator = new InternalizationOrchestrator({ stateManager: stateManager }, { owner: 'characterization-owner', runtimeKind: 'local-worker' });
204
+ const result = await orchestrator.commitNextTaskProposal('dreamer-task-1');
205
+ expect(result.decision).toBe('successor_created');
206
+ expect(result).toMatchObject({
207
+ decision: 'successor_created',
208
+ sourceTaskId: 'dreamer-task-1',
209
+ successorKind: 'philosopher',
210
+ successorTaskId: 'philosopher-dreamer-task-1-prompt',
211
+ });
212
+ // Side-effect assertion (ERR-088): the successor actually reached the store
213
+ // as a philosopher task — not merely "no error was returned".
214
+ expect(stateManager.createTask).toHaveBeenCalledOnce();
215
+ expect(stateManager.createTask.mock.calls[0]?.[0]).toMatchObject({
216
+ taskId: 'philosopher-dreamer-task-1-prompt',
217
+ taskKind: 'philosopher',
218
+ status: 'pending',
219
+ });
220
+ });
221
+ it('wakeOnce leases a pending philosopher task while the toggle is off', async () => {
222
+ expect(getDefaultInternalAgents().agents.philosopher.enabled).toBe(false);
223
+ const stateManager = createMockStateManager();
224
+ const philosopherTask = makeRawTask({
225
+ taskId: 'philosopher-task-1',
226
+ taskKind: 'philosopher',
227
+ status: 'pending',
228
+ });
229
+ stateManager.listTasks
230
+ .mockResolvedValueOnce([philosopherTask]) // pending
231
+ .mockResolvedValueOnce([]); // retry_wait
232
+ stateManager.acquireLease.mockResolvedValue({
233
+ ...philosopherTask,
234
+ status: 'leased',
235
+ attemptCount: 1,
236
+ });
237
+ const orchestrator = new InternalizationOrchestrator({ stateManager: stateManager }, { owner: 'characterization-owner', runtimeKind: 'local-worker' });
238
+ const result = await orchestrator.wakeOnce();
239
+ expect(result).toMatchObject({
240
+ decision: 'leased',
241
+ taskId: 'philosopher-task-1',
242
+ taskKind: 'philosopher',
243
+ attemptCount: 1,
244
+ });
245
+ expect(stateManager.acquireLease).toHaveBeenCalledWith({
246
+ taskId: 'philosopher-task-1',
247
+ owner: 'characterization-owner',
248
+ runtimeKind: 'local-worker',
249
+ });
250
+ });
251
+ it('no core orchestration module reads the agent-enabled config (source guard)', () => {
252
+ const modules = [
253
+ '../internalization-orchestrator.ts',
254
+ '../internalization-state-machine.ts',
255
+ '../internalization-task-guards.ts',
256
+ '../internalization-job-graph.ts',
257
+ ];
258
+ const forbidden = [
259
+ 'internalAgents',
260
+ 'resolveAgentRuntimeBinding',
261
+ 'checkAgentRuntimeReadiness',
262
+ 'InternalAgentName',
263
+ 'EffectivePdConfig',
264
+ ];
265
+ const hits = [];
266
+ for (const modulePath of modules) {
267
+ const src = readCoreSource(modulePath);
268
+ for (const token of forbidden) {
269
+ if (src.includes(token))
270
+ hits.push(`${modulePath} references ${token}`);
271
+ }
272
+ }
273
+ // Empty means: the toggle cannot influence enqueueing, leasing, or successor
274
+ // proposal. If this list becomes non-empty, behavior (2) "refuse to enqueue"
275
+ // or (1) "skip the node" was introduced and Requirement 2 must be re-reviewed.
276
+ expect(hits).toEqual([]);
277
+ });
278
+ });
279
+ //# sourceMappingURL=philosopher-toggle-characterization.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"philosopher-toggle-characterization.test.js","sourceRoot":"","sources":["../../../../src/runtime-v2/internalization/__tests__/philosopher-toggle-characterization.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Scope regression test (design §4.7.1, task 3.21).
3
+ *
4
+ * Guards the Layer 0 scope boundary: the three diagnostic stages
5
+ * (`diag_rootcause` / `diag_distiller` / `diag_router`) and `philosopher`
6
+ * participate in Layer 0 ONLY as writer-side summary producers/forwarders.
7
+ * They MUST NOT:
8
+ * - own a ContextManifest (manifests are exactly 4: dreamer / scribe /
9
+ * artificer / evaluator)
10
+ * - widen their export surface (philosopher stays de-surfaced from the
11
+ * internal barrel — PRI-458)
12
+ * - change their output schema or prompt text (Requirement 1.7)
13
+ *
14
+ * PR 1 has no manifest table yet (that lands in PR 2). This test asserts the
15
+ * negative today ("no diagnostic stage owns a manifest") and will be re-run
16
+ * unchanged once PR 2 introduces the manifest registry.
17
+ *
18
+ * @see .kiro/specs/internalization-progressive-disclosure/design.md §4.7, §4.7.1
19
+ * @see .kiro/specs/internalization-progressive-disclosure/requirements.md Requirements 1.7, 2.14
20
+ */
21
+ export {};
22
+ //# sourceMappingURL=progressive-disclosure-scope-regression.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progressive-disclosure-scope-regression.test.d.ts","sourceRoot":"","sources":["../../../../src/runtime-v2/internalization/__tests__/progressive-disclosure-scope-regression.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG"}