@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.
- package/dist/runtime-v2/diagnostician/__tests__/diag-distiller-output.test.js +46 -0
- package/dist/runtime-v2/diagnostician/__tests__/diag-distiller-output.test.js.map +1 -1
- package/dist/runtime-v2/diagnostician/diag-distiller-output.d.ts +2 -0
- package/dist/runtime-v2/diagnostician/diag-distiller-output.d.ts.map +1 -1
- package/dist/runtime-v2/diagnostician/diag-distiller-output.js +29 -2
- package/dist/runtime-v2/diagnostician/diag-distiller-output.js.map +1 -1
- package/dist/runtime-v2/feature-flags/__tests__/artifact-summary-redundancy-flag.test.d.ts +15 -0
- package/dist/runtime-v2/feature-flags/__tests__/artifact-summary-redundancy-flag.test.d.ts.map +1 -0
- package/dist/runtime-v2/feature-flags/__tests__/artifact-summary-redundancy-flag.test.js +90 -0
- package/dist/runtime-v2/feature-flags/__tests__/artifact-summary-redundancy-flag.test.js.map +1 -0
- package/dist/runtime-v2/feature-flags/feature-flag-contract.d.ts.map +1 -1
- package/dist/runtime-v2/feature-flags/feature-flag-contract.js +6 -0
- package/dist/runtime-v2/feature-flags/feature-flag-contract.js.map +1 -1
- package/dist/runtime-v2/internalization/__tests__/artifact-content-hash.property.test.d.ts +11 -0
- package/dist/runtime-v2/internalization/__tests__/artifact-content-hash.property.test.d.ts.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/artifact-content-hash.property.test.js +124 -0
- package/dist/runtime-v2/internalization/__tests__/artifact-content-hash.property.test.js.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/artifact-summary.property.test.d.ts +12 -0
- package/dist/runtime-v2/internalization/__tests__/artifact-summary.property.test.d.ts.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/artifact-summary.property.test.js +253 -0
- package/dist/runtime-v2/internalization/__tests__/artifact-summary.property.test.js.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/philosopher-toggle-characterization.test.d.ts +2 -0
- package/dist/runtime-v2/internalization/__tests__/philosopher-toggle-characterization.test.d.ts.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/philosopher-toggle-characterization.test.js +279 -0
- package/dist/runtime-v2/internalization/__tests__/philosopher-toggle-characterization.test.js.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/progressive-disclosure-scope-regression.test.d.ts +22 -0
- package/dist/runtime-v2/internalization/__tests__/progressive-disclosure-scope-regression.test.d.ts.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/progressive-disclosure-scope-regression.test.js +92 -0
- package/dist/runtime-v2/internalization/__tests__/progressive-disclosure-scope-regression.test.js.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/progressive-disclosure-spike-fixtures.d.ts +165 -0
- package/dist/runtime-v2/internalization/__tests__/progressive-disclosure-spike-fixtures.d.ts.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/progressive-disclosure-spike-fixtures.js +657 -0
- package/dist/runtime-v2/internalization/__tests__/progressive-disclosure-spike-fixtures.js.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/progressive-disclosure-spike-fixtures.test.d.ts +22 -0
- package/dist/runtime-v2/internalization/__tests__/progressive-disclosure-spike-fixtures.test.d.ts.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/progressive-disclosure-spike-fixtures.test.js +229 -0
- package/dist/runtime-v2/internalization/__tests__/progressive-disclosure-spike-fixtures.test.js.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/progressive-disclosure-spike.test.d.ts +2 -0
- package/dist/runtime-v2/internalization/__tests__/progressive-disclosure-spike.test.d.ts.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/progressive-disclosure-spike.test.js +1039 -0
- package/dist/runtime-v2/internalization/__tests__/progressive-disclosure-spike.test.js.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/summary-chain-flow.property.test.d.ts +22 -0
- package/dist/runtime-v2/internalization/__tests__/summary-chain-flow.property.test.d.ts.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/summary-chain-flow.property.test.js +280 -0
- package/dist/runtime-v2/internalization/__tests__/summary-chain-flow.property.test.js.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/summary-envelope-writer.property.test.d.ts +25 -0
- package/dist/runtime-v2/internalization/__tests__/summary-envelope-writer.property.test.d.ts.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/summary-envelope-writer.property.test.js +413 -0
- package/dist/runtime-v2/internalization/__tests__/summary-envelope-writer.property.test.js.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/summary-freshness.property.test.d.ts +12 -0
- package/dist/runtime-v2/internalization/__tests__/summary-freshness.property.test.d.ts.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/summary-freshness.property.test.js +176 -0
- package/dist/runtime-v2/internalization/__tests__/summary-freshness.property.test.js.map +1 -0
- package/dist/runtime-v2/internalization/artifact-content-hash.d.ts +19 -0
- package/dist/runtime-v2/internalization/artifact-content-hash.d.ts.map +1 -0
- package/dist/runtime-v2/internalization/artifact-content-hash.js +116 -0
- package/dist/runtime-v2/internalization/artifact-content-hash.js.map +1 -0
- package/dist/runtime-v2/internalization/artifact-summary.d.ts +106 -0
- package/dist/runtime-v2/internalization/artifact-summary.d.ts.map +1 -0
- package/dist/runtime-v2/internalization/artifact-summary.js +331 -0
- package/dist/runtime-v2/internalization/artifact-summary.js.map +1 -0
- package/dist/runtime-v2/internalization/artificer-runner.d.ts.map +1 -1
- package/dist/runtime-v2/internalization/artificer-runner.js +29 -1
- package/dist/runtime-v2/internalization/artificer-runner.js.map +1 -1
- package/dist/runtime-v2/internalization/attach-summary-envelope.d.ts +60 -0
- package/dist/runtime-v2/internalization/attach-summary-envelope.d.ts.map +1 -0
- package/dist/runtime-v2/internalization/attach-summary-envelope.js +126 -0
- package/dist/runtime-v2/internalization/attach-summary-envelope.js.map +1 -0
- package/dist/runtime-v2/internalization/diag-distiller-runner.d.ts +1 -1
- package/dist/runtime-v2/internalization/diag-distiller-runner.d.ts.map +1 -1
- package/dist/runtime-v2/internalization/diag-distiller-runner.js +20 -2
- package/dist/runtime-v2/internalization/diag-distiller-runner.js.map +1 -1
- package/dist/runtime-v2/internalization/diag-rootcause-runner.d.ts.map +1 -1
- package/dist/runtime-v2/internalization/diag-rootcause-runner.js +6 -1
- package/dist/runtime-v2/internalization/diag-rootcause-runner.js.map +1 -1
- package/dist/runtime-v2/internalization/diag-router-runner.d.ts +1 -1
- package/dist/runtime-v2/internalization/diag-router-runner.d.ts.map +1 -1
- package/dist/runtime-v2/internalization/diag-router-runner.js +25 -1
- package/dist/runtime-v2/internalization/diag-router-runner.js.map +1 -1
- package/dist/runtime-v2/internalization/dreamer-runner.d.ts +9 -1
- package/dist/runtime-v2/internalization/dreamer-runner.d.ts.map +1 -1
- package/dist/runtime-v2/internalization/dreamer-runner.js +28 -6
- package/dist/runtime-v2/internalization/dreamer-runner.js.map +1 -1
- package/dist/runtime-v2/internalization/evaluator-runner.d.ts.map +1 -1
- package/dist/runtime-v2/internalization/evaluator-runner.js +35 -2
- package/dist/runtime-v2/internalization/evaluator-runner.js.map +1 -1
- package/dist/runtime-v2/internalization/philosopher-runner.d.ts.map +1 -1
- package/dist/runtime-v2/internalization/philosopher-runner.js +25 -1
- package/dist/runtime-v2/internalization/philosopher-runner.js.map +1 -1
- package/dist/runtime-v2/internalization/scribe-runner.d.ts.map +1 -1
- package/dist/runtime-v2/internalization/scribe-runner.js +23 -1
- package/dist/runtime-v2/internalization/scribe-runner.js.map +1 -1
- package/dist/runtime-v2/runner/base-peer-runner.d.ts +30 -0
- package/dist/runtime-v2/runner/base-peer-runner.d.ts.map +1 -1
- package/dist/runtime-v2/runner/base-peer-runner.js +106 -0
- package/dist/runtime-v2/runner/base-peer-runner.js.map +1 -1
- package/dist/runtime-v2/runner/peer-runner-types.d.ts +19 -0
- package/dist/runtime-v2/runner/peer-runner-types.d.ts.map +1 -1
- package/dist/runtime-v2/store/commit/diagnostician-committer.d.ts +15 -0
- package/dist/runtime-v2/store/commit/diagnostician-committer.d.ts.map +1 -1
- package/dist/runtime-v2/store/commit/diagnostician-committer.js +19 -1
- package/dist/runtime-v2/store/commit/diagnostician-committer.js.map +1 -1
- 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":"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"}
|
package/dist/runtime-v2/internalization/__tests__/philosopher-toggle-characterization.test.d.ts.map
ADDED
|
@@ -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
|
package/dist/runtime-v2/internalization/__tests__/philosopher-toggle-characterization.test.js.map
ADDED
|
@@ -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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"}
|
package/dist/runtime-v2/internalization/__tests__/progressive-disclosure-scope-regression.test.d.ts
ADDED
|
@@ -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"}
|