@principles/core 1.241.0 → 1.242.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.
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Property tests for CandidateLineage (design §6.4, tasks 7.3–7.6).
3
+ *
4
+ * CP-17: stage attribution is determined solely by taskKind (not artifactKind)
5
+ * CP-18: lineage cache idempotency (each artifactId fetched at most once)
6
+ * CP-19: lineage error classification (corruption vs expected-absence)
7
+ * CP-20: lineage failures are never swallowed (caller must surface them)
8
+ *
9
+ * Uses stub artifact store + task reader (no real I/O).
10
+ *
11
+ * @see .kiro/specs/internalization-progressive-disclosure/design.md §6.4
12
+ * @see .kiro/specs/internalization-progressive-disclosure/requirements.md Requirement 6
13
+ */
14
+ export {};
15
+ //# sourceMappingURL=candidate-lineage.property.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"candidate-lineage.property.test.d.ts","sourceRoot":"","sources":["../../../../src/runtime-v2/internalization/__tests__/candidate-lineage.property.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG"}
@@ -0,0 +1,301 @@
1
+ /**
2
+ * Property tests for CandidateLineage (design §6.4, tasks 7.3–7.6).
3
+ *
4
+ * CP-17: stage attribution is determined solely by taskKind (not artifactKind)
5
+ * CP-18: lineage cache idempotency (each artifactId fetched at most once)
6
+ * CP-19: lineage error classification (corruption vs expected-absence)
7
+ * CP-20: lineage failures are never swallowed (caller must surface them)
8
+ *
9
+ * Uses stub artifact store + task reader (no real I/O).
10
+ *
11
+ * @see .kiro/specs/internalization-progressive-disclosure/design.md §6.4
12
+ * @see .kiro/specs/internalization-progressive-disclosure/requirements.md Requirement 6
13
+ */
14
+ import { describe, it, expect } from 'vitest';
15
+ import fc from 'fast-check';
16
+ import { CandidateLineage, } from '../candidate-lineage.js';
17
+ function makeStub(artifacts, tasks) {
18
+ const artifactMap = new Map(artifacts.map((a) => [a.artifactId, a]));
19
+ const taskMap = new Map(tasks.map((t) => [t.taskId, t]));
20
+ const artifactReads = new Map();
21
+ const taskReads = new Map();
22
+ const events = [];
23
+ return { artifacts: artifactMap, tasks: taskMap, artifactReads, taskReads, events };
24
+ }
25
+ function makeArtifact(artifactId, sourceTaskId, lineageArtifactIds = [], contentJson = { data: 'test' }, artifactKind = 'principle') {
26
+ return {
27
+ artifactId,
28
+ artifactKind,
29
+ sourceTaskId,
30
+ lineageArtifactIds,
31
+ validationStatus: 'validated',
32
+ contentJson: typeof contentJson === 'string' ? contentJson : JSON.stringify(contentJson),
33
+ createdAt: '2026-01-01T00:00:00Z',
34
+ updatedAt: '2026-01-01T00:00:00Z',
35
+ };
36
+ }
37
+ function makeLineage(deps, maxDepth) {
38
+ const artifactStore = {
39
+ getArtifactById: async (id) => {
40
+ deps.artifactReads.set(id, (deps.artifactReads.get(id) ?? 0) + 1);
41
+ return deps.artifacts.get(id) ?? null;
42
+ },
43
+ };
44
+ const taskReader = {
45
+ getTaskById: async (id) => {
46
+ deps.taskReads.set(id, (deps.taskReads.get(id) ?? 0) + 1);
47
+ return deps.tasks.get(id) ?? null;
48
+ },
49
+ };
50
+ return new CandidateLineage({
51
+ artifacts: artifactStore,
52
+ tasks: taskReader,
53
+ maxDepth,
54
+ emit: (e) => deps.events.push(e),
55
+ });
56
+ }
57
+ // ── CP-17: stage by taskKind only ────────────────────────────────────────────
58
+ describe('CP-17 — stage attribution determined solely by taskKind (F1)', () => {
59
+ it('artifactKind is irrelevant: same taskKind → same runnerKind regardless of artifactKind', async () => {
60
+ const artifactKinds = ['principle', 'rule', 'skill', 'patch'];
61
+ for (const kind of artifactKinds) {
62
+ const deps = makeStub([makeArtifact('art-1', 'task-1', [], { x: 1 }, kind)], [{ taskId: 'task-1', taskKind: 'dreamer' }]);
63
+ const lineage = makeLineage(deps);
64
+ const result = await lineage.resolve('art-1');
65
+ expect(result.ok).toBe(true);
66
+ if (result.ok) {
67
+ expect(result.value.nodes[0]?.runnerKind).toBe('dreamer');
68
+ expect(result.value.nodes[0]?.taskKind).toBe('dreamer');
69
+ }
70
+ }
71
+ });
72
+ it('property: artifactKind randomly mismatched with real stage → runnerKind still follows taskKind', async () => {
73
+ await fc.assert(fc.asyncProperty(fc.constantFrom('principle', 'rule', 'skill', 'patch'), fc.constantFrom('dreamer', 'scribe', 'artificer', 'evaluator', 'diag_router'), async (artifactKind, taskKind) => {
74
+ const deps = makeStub([makeArtifact('art-prop', 'task-prop', [], { v: 1 }, artifactKind)], [{ taskId: 'task-prop', taskKind }]);
75
+ const lineage = makeLineage(deps);
76
+ const result = await lineage.resolve('art-prop');
77
+ if (result.ok) {
78
+ expect(result.value.nodes[0]?.taskKind).toBe(taskKind);
79
+ }
80
+ }), { numRuns: 40 });
81
+ });
82
+ });
83
+ // ── CP-18: cache idempotency ─────────────────────────────────────────────────
84
+ describe('CP-18 — lineage cache idempotency', () => {
85
+ it('each artifactId is fetched from the store at most once', async () => {
86
+ // Diamond: A → B, A → C, B → D, C → D (D reachable via two paths).
87
+ const artifacts = [
88
+ makeArtifact('A', 'task-A', ['B', 'C']),
89
+ makeArtifact('B', 'task-B', ['D']),
90
+ makeArtifact('C', 'task-C', ['D']),
91
+ makeArtifact('D', 'task-D', []),
92
+ ];
93
+ const tasks = ['A', 'B', 'C', 'D'].map((t) => ({ taskId: `task-${t}`, taskKind: 'dreamer' }));
94
+ const deps = makeStub(artifacts, tasks);
95
+ const lineage = makeLineage(deps);
96
+ const r1 = await lineage.resolve('A');
97
+ const r2 = await lineage.resolve('A');
98
+ expect(r1.ok).toBe(true);
99
+ expect(r2.ok).toBe(true);
100
+ // Each artifact fetched exactly once across both resolve calls (cached).
101
+ for (const id of ['A', 'B', 'C', 'D']) {
102
+ expect(deps.artifactReads.get(id) ?? 0).toBe(1);
103
+ }
104
+ });
105
+ it('repeated resolve returns identical results', async () => {
106
+ const artifacts = [
107
+ makeArtifact('X', 'task-X', ['Y']),
108
+ makeArtifact('Y', 'task-Y', []),
109
+ ];
110
+ const tasks = [{ taskId: 'task-X', taskKind: 'dreamer' }, { taskId: 'task-Y', taskKind: 'scribe' }];
111
+ const deps = makeStub(artifacts, tasks);
112
+ const lineage = makeLineage(deps);
113
+ const r1 = await lineage.resolve('X');
114
+ const r2 = await lineage.resolve('X');
115
+ expect(JSON.stringify(r1)).toBe(JSON.stringify(r2));
116
+ });
117
+ it('findAncestorByTaskKind also uses the cache (no extra store reads)', async () => {
118
+ const artifacts = [
119
+ makeArtifact('P', 'task-P', ['Q']),
120
+ makeArtifact('Q', 'task-Q', []),
121
+ ];
122
+ const tasks = [
123
+ { taskId: 'task-P', taskKind: 'evaluator' },
124
+ { taskId: 'task-Q', taskKind: 'dreamer' },
125
+ ];
126
+ const deps = makeStub(artifacts, tasks);
127
+ const lineage = makeLineage(deps);
128
+ await lineage.resolve('P');
129
+ await lineage.findAncestorByTaskKind('P', 'dreamer');
130
+ for (const id of ['P', 'Q']) {
131
+ expect(deps.artifactReads.get(id) ?? 0).toBe(1);
132
+ }
133
+ });
134
+ });
135
+ // ── CP-19: error classification ──────────────────────────────────────────────
136
+ describe('CP-19 — lineage error classification', () => {
137
+ it('contentJson unparseable → ok:false + content_json_unparseable + lineage_data_corrupt', async () => {
138
+ const deps = makeStub([makeArtifact('bad', 'task-1', [], '{not valid json')], [{ taskId: 'task-1', taskKind: 'dreamer' }]);
139
+ const lineage = makeLineage(deps);
140
+ const result = await lineage.resolve('bad');
141
+ expect(result.ok).toBe(false);
142
+ if (!result.ok)
143
+ expect(result.error.kind).toBe('content_json_unparseable');
144
+ expect(deps.events.some((e) => e.type === 'lineage_data_corrupt')).toBe(true);
145
+ });
146
+ it('artifact missing sourceTaskId → ok:false + artifact_shape_invalid', async () => {
147
+ const badArtifact = {
148
+ ...makeArtifact('shapeless', 'task-1', []),
149
+ sourceTaskId: '',
150
+ };
151
+ const deps = makeStub([badArtifact], [{ taskId: 'task-1', taskKind: 'dreamer' }]);
152
+ const lineage = makeLineage(deps);
153
+ const result = await lineage.resolve('shapeless');
154
+ expect(result.ok).toBe(false);
155
+ if (!result.ok)
156
+ expect(result.error.kind).toBe('artifact_shape_invalid');
157
+ });
158
+ it('store throws → ok:false + store_failure + lineage_store_failure', async () => {
159
+ const deps = makeStub([], []);
160
+ const failingStore = {
161
+ getArtifactById: async () => { throw new Error('db connection lost'); },
162
+ };
163
+ const lineage = new CandidateLineage({
164
+ artifacts: failingStore,
165
+ tasks: { getTaskById: async () => null },
166
+ emit: (e) => deps.events.push(e),
167
+ });
168
+ const result = await lineage.resolve('any');
169
+ expect(result.ok).toBe(false);
170
+ if (!result.ok)
171
+ expect(result.error.kind).toBe('store_failure');
172
+ expect(deps.events.some((e) => e.type === 'lineage_store_failure')).toBe(true);
173
+ });
174
+ it('ancestor pruned (referenced but absent) → ok:true + partial + ancestor_pruned note', async () => {
175
+ const deps = makeStub([makeArtifact('start', 'task-1', ['ghost'])], // 'ghost' not in store
176
+ [{ taskId: 'task-1', taskKind: 'dreamer' }]);
177
+ const lineage = makeLineage(deps);
178
+ const result = await lineage.resolve('start');
179
+ expect(result.ok).toBe(true);
180
+ if (result.ok) {
181
+ expect(result.value.complete).toBe(false);
182
+ expect(result.value.notes.some((n) => n.code === 'ancestor_pruned')).toBe(true);
183
+ }
184
+ });
185
+ it('task missing → ok:true + partial + task_missing note + runnerKind unknown', async () => {
186
+ const deps = makeStub([makeArtifact('orphan', 'task-gone', [])], []);
187
+ const lineage = makeLineage(deps);
188
+ const result = await lineage.resolve('orphan');
189
+ expect(result.ok).toBe(true);
190
+ if (result.ok) {
191
+ expect(result.value.complete).toBe(false);
192
+ expect(result.value.nodes[0]?.runnerKind).toBe('unknown');
193
+ expect(result.value.notes.some((n) => n.code === 'task_missing')).toBe(true);
194
+ }
195
+ });
196
+ it('depth limit → ok:true + partial + depth_limit_reached note', async () => {
197
+ // Chain longer than maxDepth=2.
198
+ const artifacts = [
199
+ makeArtifact('n0', 't0', ['n1']),
200
+ makeArtifact('n1', 't1', ['n2']),
201
+ makeArtifact('n2', 't2', ['n3']),
202
+ makeArtifact('n3', 't3', []),
203
+ ];
204
+ const tasks = [0, 1, 2, 3].map((i) => ({ taskId: `t${i}`, taskKind: 'dreamer' }));
205
+ const deps = makeStub(artifacts, tasks);
206
+ const lineage = makeLineage(deps, 2);
207
+ const result = await lineage.resolve('n0');
208
+ expect(result.ok).toBe(true);
209
+ if (result.ok) {
210
+ expect(result.value.complete).toBe(false);
211
+ expect(result.value.notes.some((n) => n.code === 'depth_limit_reached')).toBe(true);
212
+ }
213
+ });
214
+ it('cycle → ok:true + partial + cycle_detected note', async () => {
215
+ // A → B → A (cycle).
216
+ const artifacts = [
217
+ makeArtifact('cyc-A', 't-A', ['cyc-B']),
218
+ makeArtifact('cyc-B', 't-B', ['cyc-A']),
219
+ ];
220
+ const tasks = [{ taskId: 't-A', taskKind: 'dreamer' }, { taskId: 't-B', taskKind: 'scribe' }];
221
+ const deps = makeStub(artifacts, tasks);
222
+ const lineage = makeLineage(deps);
223
+ const result = await lineage.resolve('cyc-A');
224
+ expect(result.ok).toBe(true);
225
+ if (result.ok) {
226
+ expect(result.value.notes.some((n) => n.code === 'cycle_detected')).toBe(true);
227
+ }
228
+ });
229
+ it('complete chain (no issues) → ok:true + complete + empty notes', async () => {
230
+ const artifacts = [
231
+ makeArtifact('ok-1', 't-1', ['ok-2']),
232
+ makeArtifact('ok-2', 't-2', []),
233
+ ];
234
+ const tasks = [{ taskId: 't-1', taskKind: 'dreamer' }, { taskId: 't-2', taskKind: 'scribe' }];
235
+ const deps = makeStub(artifacts, tasks);
236
+ const lineage = makeLineage(deps);
237
+ const result = await lineage.resolve('ok-1');
238
+ expect(result.ok).toBe(true);
239
+ if (result.ok) {
240
+ expect(result.value.complete).toBe(true);
241
+ expect(result.value.notes).toHaveLength(0);
242
+ expect(result.value.nodes).toHaveLength(2);
243
+ }
244
+ });
245
+ it('findAncestorByTaskKind miss → ok:true + node null', async () => {
246
+ const artifacts = [makeArtifact('solo', 't-1', [])];
247
+ const tasks = [{ taskId: 't-1', taskKind: 'dreamer' }];
248
+ const deps = makeStub(artifacts, tasks);
249
+ const lineage = makeLineage(deps);
250
+ const result = await lineage.findAncestorByTaskKind('solo', 'evaluator');
251
+ expect(result.ok).toBe(true);
252
+ if (result.ok)
253
+ expect(result.node).toBeNull();
254
+ });
255
+ it('contentJson stays unknown (not narrowed) on the returned node', async () => {
256
+ const deps = makeStub([makeArtifact('unk', 't-1', [], { complex: { nested: [1, 2] } })], [{ taskId: 't-1', taskKind: 'dreamer' }]);
257
+ const lineage = makeLineage(deps);
258
+ const result = await lineage.resolve('unk');
259
+ if (result.ok) {
260
+ // contentJson is typed `unknown` — we verify it's an object but the type
261
+ // system guarantees it was never cast to a specific shape.
262
+ expect(typeof result.value.nodes[0]?.contentJson).toBe('object');
263
+ }
264
+ });
265
+ });
266
+ // ── CP-20: failures never swallowed ──────────────────────────────────────────
267
+ describe('CP-20 — lineage failures never swallowed', () => {
268
+ it('all three LineageError kinds produce ok:false (never a silent ok:true)', async () => {
269
+ // content_json_unparseable
270
+ const r1 = await makeLineage(makeStub([makeArtifact('a', 't', [], 'bad{json')], [{ taskId: 't', taskKind: 'dreamer' }])).resolve('a');
271
+ expect(r1.ok).toBe(false);
272
+ // artifact_shape_invalid
273
+ const r2 = await makeLineage(makeStub([{ ...makeArtifact('b', 't', []), sourceTaskId: '' }], [{ taskId: 't', taskKind: 'dreamer' }])).resolve('b');
274
+ expect(r2.ok).toBe(false);
275
+ // store_failure
276
+ const r3 = await new CandidateLineage({
277
+ artifacts: { getArtifactById: async () => { throw new Error('boom'); } },
278
+ tasks: { getTaskById: async () => null },
279
+ }).resolve('c');
280
+ expect(r3.ok).toBe(false);
281
+ });
282
+ it('every ok:false result has a non-empty error.kind (no generic "unknown" failure)', async () => {
283
+ const results = [];
284
+ // Run all three failure modes.
285
+ for (const setup of [
286
+ { art: makeArtifact('x', 't', [], 'bad'), task: { taskId: 't', taskKind: 'dreamer' } },
287
+ { art: { ...makeArtifact('y', 't', []), sourceTaskId: '' }, task: { taskId: 't', taskKind: 'dreamer' } },
288
+ ]) {
289
+ const r = await makeLineage(makeStub([setup.art], [setup.task])).resolve(setup.art.artifactId);
290
+ results.push(r);
291
+ }
292
+ for (const r of results) {
293
+ expect(r.ok).toBe(false);
294
+ if (!r.ok) {
295
+ // error.kind is one of the three known kinds — never empty or undefined.
296
+ expect(['content_json_unparseable', 'artifact_shape_invalid', 'store_failure']).toContain(r.error.kind);
297
+ }
298
+ }
299
+ });
300
+ });
301
+ //# sourceMappingURL=candidate-lineage.property.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"candidate-lineage.property.test.js","sourceRoot":"","sources":["../../../../src/runtime-v2/internalization/__tests__/candidate-lineage.property.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,136 @@
1
+ /**
2
+ * Layer 2 — CandidateLineage: on-demand ancestry traversal (design §6.4).
3
+ *
4
+ * Pure logic with **injected** I/O (artifact store + task reader). Walks an
5
+ * artifact's ancestry via `lineageArtifactIds`, determining each node's stage
6
+ * by the two-hop `artifact.sourceTaskId → task.taskKind` (F1 — never by
7
+ * `artifactKind`, which is ambiguous: all internalization artifacts are
8
+ * `principle`).
9
+ *
10
+ * Result contract (rc-9, design §6.4 error table):
11
+ * - data corruption (unparseable / shape-invalid / store-throw) → `ok: false`
12
+ * + a `LineageError`; the caller MUST surface it as an explicit failure or
13
+ * structured degradation — never silently fall through.
14
+ * - expected absence (no lineage ids / ancestor pruned / task missing / depth
15
+ * limit / cycle) → `ok: true` with a partial chain + notes; `complete` is
16
+ * false and `notes` is non-empty.
17
+ *
18
+ * Request-scoped cache: a single `CandidateLineage` instance lives for one
19
+ * `buildContext`; repeated `getArtifactById` calls for the same id hit the
20
+ * cache, not the store (CP-18).
21
+ *
22
+ * rc-1: every `contentJson` stays `unknown` — it is never narrowed or cast.
23
+ */
24
+ import type { PIArtifactStore } from './pi-artifact.js';
25
+ import type { ArtifactSummary, SummaryRunnerKind } from './artifact-summary.js';
26
+ export interface LineageNode {
27
+ readonly artifactId: string;
28
+ readonly taskId: string;
29
+ /** Stage determined by the two-hop sourceTaskId → task.taskKind (F1). */
30
+ readonly taskKind: string;
31
+ readonly runnerKind: SummaryRunnerKind | 'unknown';
32
+ /** rc-1: remains `unknown`; the caller narrows it. */
33
+ readonly contentJson: unknown;
34
+ readonly summary?: ArtifactSummary;
35
+ }
36
+ export type LineageNoteCode = 'source_trace_missing' | 'ancestor_pruned' | 'task_missing' | 'depth_limit_reached' | 'cycle_detected';
37
+ export interface LineageNote {
38
+ readonly code: LineageNoteCode;
39
+ readonly artifactId: string;
40
+ readonly detail: string;
41
+ }
42
+ export interface LineageChain {
43
+ /** From start node upstream, in traversal order. */
44
+ readonly nodes: readonly LineageNode[];
45
+ /** false when notes is non-empty (partial chain). */
46
+ readonly complete: boolean;
47
+ readonly notes: readonly LineageNote[];
48
+ }
49
+ export type LineageError = {
50
+ readonly kind: 'content_json_unparseable';
51
+ readonly artifactId: string;
52
+ readonly detail: string;
53
+ } | {
54
+ readonly kind: 'artifact_shape_invalid';
55
+ readonly artifactId: string;
56
+ readonly detail: string;
57
+ } | {
58
+ readonly kind: 'store_failure';
59
+ readonly detail: string;
60
+ };
61
+ export type LineageResult = {
62
+ readonly ok: true;
63
+ readonly value: LineageChain;
64
+ } | {
65
+ readonly ok: false;
66
+ readonly error: LineageError;
67
+ };
68
+ /** Lineage telemetry event (forwarded to the caller's emit, if provided). */
69
+ export type LineageEvent = {
70
+ readonly type: 'lineage_data_corrupt';
71
+ readonly artifactId: string;
72
+ readonly detail: string;
73
+ readonly errorKind: LineageError['kind'];
74
+ } | {
75
+ readonly type: 'lineage_store_failure';
76
+ readonly detail: string;
77
+ } | {
78
+ readonly type: 'lineage_partial';
79
+ readonly artifactId: string;
80
+ readonly noteCode: LineageNoteCode;
81
+ readonly detail: string;
82
+ };
83
+ /** Two-hop task reader (F1) — resolves taskKind from a taskId. */
84
+ export interface LineageTaskReader {
85
+ getTaskById(taskId: string): Promise<{
86
+ readonly taskId: string;
87
+ readonly taskKind: string;
88
+ } | null>;
89
+ }
90
+ export interface CandidateLineageDeps {
91
+ readonly artifacts: Pick<PIArtifactStore, 'getArtifactById'>;
92
+ readonly tasks: LineageTaskReader;
93
+ /** Default 6 (longest pipeline chain + 1). */
94
+ readonly maxDepth?: number;
95
+ readonly emit?: (event: LineageEvent) => void;
96
+ }
97
+ export declare class CandidateLineage {
98
+ private readonly artifacts;
99
+ private readonly tasks;
100
+ private readonly maxDepth;
101
+ private readonly emit;
102
+ /** request-scoped: artifactId → resolved record (or null if known-absent). */
103
+ private readonly cache;
104
+ /** request-scoped: taskId → resolved taskKind (or null). */
105
+ private readonly taskCache;
106
+ constructor(deps: CandidateLineageDeps);
107
+ /**
108
+ * Resolve the full ancestry chain starting from `startArtifactId`.
109
+ * Walks `lineageArtifactIds` upstream, building an ordered node list.
110
+ */
111
+ resolve(startArtifactId: string): Promise<LineageResult>;
112
+ /**
113
+ * Find the nearest ancestor node with a given `taskKind` (F1 — never by
114
+ * `artifactKind`). Returns `{ ok: true, node: null }` when no ancestor
115
+ * matches (a valid result, not an error).
116
+ */
117
+ findAncestorByTaskKind(startArtifactId: string, taskKind: string): Promise<{
118
+ readonly ok: true;
119
+ readonly node: LineageNode | null;
120
+ readonly notes: readonly LineageNote[];
121
+ } | {
122
+ readonly ok: false;
123
+ readonly error: LineageError;
124
+ }>;
125
+ /**
126
+ * Iterative BFS resolution with cycle detection (via `visited`) and depth
127
+ * limiting. `visited` carries artifactIds already resolved (prevents cycles
128
+ * and redundant fetches across the whole traversal, not just one path).
129
+ */
130
+ private resolveChain;
131
+ /** Cached artifact fetch. Returns `ok:false` on store failure or corruption. */
132
+ private getArtifactCached;
133
+ /** Cached task fetch (two-hop). Returns `ok:false` only on reader failure (treated as store_failure). */
134
+ private getTaskCached;
135
+ }
136
+ //# sourceMappingURL=candidate-lineage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"candidate-lineage.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/internalization/candidate-lineage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,230 @@
1
+ /**
2
+ * Layer 2 — CandidateLineage: on-demand ancestry traversal (design §6.4).
3
+ *
4
+ * Pure logic with **injected** I/O (artifact store + task reader). Walks an
5
+ * artifact's ancestry via `lineageArtifactIds`, determining each node's stage
6
+ * by the two-hop `artifact.sourceTaskId → task.taskKind` (F1 — never by
7
+ * `artifactKind`, which is ambiguous: all internalization artifacts are
8
+ * `principle`).
9
+ *
10
+ * Result contract (rc-9, design §6.4 error table):
11
+ * - data corruption (unparseable / shape-invalid / store-throw) → `ok: false`
12
+ * + a `LineageError`; the caller MUST surface it as an explicit failure or
13
+ * structured degradation — never silently fall through.
14
+ * - expected absence (no lineage ids / ancestor pruned / task missing / depth
15
+ * limit / cycle) → `ok: true` with a partial chain + notes; `complete` is
16
+ * false and `notes` is non-empty.
17
+ *
18
+ * Request-scoped cache: a single `CandidateLineage` instance lives for one
19
+ * `buildContext`; repeated `getArtifactById` calls for the same id hit the
20
+ * cache, not the store (CP-18).
21
+ *
22
+ * rc-1: every `contentJson` stays `unknown` — it is never narrowed or cast.
23
+ */
24
+ import { SUMMARY_RUNNER_KINDS } from './artifact-summary.js';
25
+ // ── Helpers ──────────────────────────────────────────────────────────────────
26
+ const DEFAULT_MAX_DEPTH = 6;
27
+ function isRecord(value) {
28
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
29
+ }
30
+ /**
31
+ * Read an existing ArtifactSummary off a contentJson (Layer 0 envelope), with
32
+ * full value-type validation (rc-2). Returns null when absent or malformed —
33
+ * the node simply carries no `summary`, which is a valid partial state.
34
+ */
35
+ function readSummary(contentJson) {
36
+ if (!isRecord(contentJson) || !Object.hasOwn(contentJson, 'summary'))
37
+ return undefined;
38
+ const { summary } = contentJson;
39
+ if (!isRecord(summary))
40
+ return undefined;
41
+ // rc-2: full value-type validation, then construct a typed object (no as cast).
42
+ if (Object.hasOwn(summary, 'schemaVersion') && summary.schemaVersion === 1
43
+ && Object.hasOwn(summary, 'runnerKind') && typeof summary.runnerKind === 'string'
44
+ && SUMMARY_RUNNER_KINDS.includes(summary.runnerKind)
45
+ && Object.hasOwn(summary, 'headline') && typeof summary.headline === 'string'
46
+ && Object.hasOwn(summary, 'fields') && isRecord(summary.fields)
47
+ && Object.values(summary.fields).every((v) => typeof v === 'string')
48
+ && Object.hasOwn(summary, 'derivedFrom') && summary.derivedFrom === 'structured_output'
49
+ && Object.hasOwn(summary, 'omittedFields') && Array.isArray(summary.omittedFields)
50
+ && summary.omittedFields.every((v) => typeof v === 'string')) {
51
+ // runtime-contract-exempt: ERR-001 narrowing after full value-type validation: runnerKind checked against SUMMARY_RUNNER_KINDS, fields checked via Object.values().every(typeof string), omittedFields checked via Array.isArray + every. The casts are type-only — the values are already validated at runtime above.
52
+ return {
53
+ schemaVersion: 1,
54
+ runnerKind: summary.runnerKind, // runtime-contract-exempt: ERR-001 validated via SUMMARY_RUNNER_KINDS.includes above
55
+ headline: summary.headline,
56
+ fields: summary.fields, // runtime-contract-exempt: ERR-001 validated via Object.values().every(typeof===string) above
57
+ derivedFrom: 'structured_output',
58
+ omittedFields: summary.omittedFields, // runtime-contract-exempt: ERR-001 validated via Array.isArray + every(typeof===string) above
59
+ };
60
+ }
61
+ return undefined;
62
+ }
63
+ // ── CandidateLineage ─────────────────────────────────────────────────────────
64
+ export class CandidateLineage {
65
+ artifacts;
66
+ tasks;
67
+ maxDepth;
68
+ emit;
69
+ /** request-scoped: artifactId → resolved record (or null if known-absent). */
70
+ cache = new Map();
71
+ /** request-scoped: taskId → resolved taskKind (or null). */
72
+ taskCache = new Map();
73
+ constructor(deps) {
74
+ this.artifacts = deps.artifacts;
75
+ this.tasks = deps.tasks;
76
+ this.maxDepth = deps.maxDepth ?? DEFAULT_MAX_DEPTH;
77
+ this.emit = deps.emit ?? (() => undefined);
78
+ }
79
+ /**
80
+ * Resolve the full ancestry chain starting from `startArtifactId`.
81
+ * Walks `lineageArtifactIds` upstream, building an ordered node list.
82
+ */
83
+ async resolve(startArtifactId) {
84
+ return this.resolveChain(startArtifactId, new Set());
85
+ }
86
+ /**
87
+ * Find the nearest ancestor node with a given `taskKind` (F1 — never by
88
+ * `artifactKind`). Returns `{ ok: true, node: null }` when no ancestor
89
+ * matches (a valid result, not an error).
90
+ */
91
+ async findAncestorByTaskKind(startArtifactId, taskKind) {
92
+ const result = await this.resolve(startArtifactId);
93
+ if (!result.ok)
94
+ return { ok: false, error: result.error };
95
+ const node = result.value.nodes.find((n) => n.taskKind === taskKind) ?? null;
96
+ return { ok: true, node, notes: result.value.notes };
97
+ }
98
+ // ── Internal traversal ─────────────────────────────────────────────────────
99
+ /**
100
+ * Iterative BFS resolution with cycle detection (via `visited`) and depth
101
+ * limiting. `visited` carries artifactIds already resolved (prevents cycles
102
+ * and redundant fetches across the whole traversal, not just one path).
103
+ */
104
+ async resolveChain(startArtifactId, visited) {
105
+ const nodes = [];
106
+ const notes = [];
107
+ // BFS-style frontier of artifact ids to resolve, seeded with the start.
108
+ // We process in order; each node's lineageArtifactIds extend the frontier.
109
+ const queue = [startArtifactId];
110
+ let depth = 0;
111
+ while (queue.length > 0) {
112
+ if (depth >= this.maxDepth) {
113
+ const [last] = queue;
114
+ notes.push({ code: 'depth_limit_reached', artifactId: last ?? startArtifactId, detail: `maxDepth (${this.maxDepth}) reached; remaining ${queue.length} ancestor(s) not traversed` });
115
+ this.emit({ type: 'lineage_partial', artifactId: last ?? startArtifactId, noteCode: 'depth_limit_reached', detail: `maxDepth ${this.maxDepth}` });
116
+ break;
117
+ }
118
+ const artifactId = queue.shift();
119
+ if (artifactId === undefined)
120
+ break;
121
+ // Cycle detection.
122
+ if (visited.has(artifactId)) {
123
+ notes.push({ code: 'cycle_detected', artifactId, detail: `artifact ${artifactId} already on the resolution path` });
124
+ this.emit({ type: 'lineage_partial', artifactId, noteCode: 'cycle_detected', detail: 'cycle detected' });
125
+ continue;
126
+ }
127
+ visited.add(artifactId);
128
+ // Fetch artifact (cached).
129
+ const artifactResult = await this.getArtifactCached(artifactId);
130
+ if (!artifactResult.ok)
131
+ return artifactResult; // propagate corruption / store failure
132
+ const artifact = artifactResult.value;
133
+ if (artifact === null) {
134
+ // Ancestor referenced but pruned — expected, partial.
135
+ notes.push({ code: 'ancestor_pruned', artifactId, detail: `ancestor artifact ${artifactId} not found (pruned)` });
136
+ this.emit({ type: 'lineage_partial', artifactId, noteCode: 'ancestor_pruned', detail: 'artifact not found' });
137
+ continue;
138
+ }
139
+ // Parse contentJson (rc-1: stays unknown on success; unparseable = corruption).
140
+ let contentJson;
141
+ try {
142
+ contentJson = JSON.parse(artifact.contentJson);
143
+ }
144
+ catch {
145
+ const err = { kind: 'content_json_unparseable', artifactId, detail: `contentJson of ${artifactId} is not valid JSON` };
146
+ this.emit({ type: 'lineage_data_corrupt', artifactId, detail: err.detail, errorKind: 'content_json_unparseable' });
147
+ return { ok: false, error: err };
148
+ }
149
+ // Shape check: must have sourceTaskId (rc-3 fail loud on corruption).
150
+ if (typeof artifact.sourceTaskId !== 'string' || artifact.sourceTaskId === '') {
151
+ const err = { kind: 'artifact_shape_invalid', artifactId, detail: `artifact ${artifactId} missing required sourceTaskId` };
152
+ this.emit({ type: 'lineage_data_corrupt', artifactId, detail: err.detail, errorKind: 'artifact_shape_invalid' });
153
+ return { ok: false, error: err };
154
+ }
155
+ // Two-hop: sourceTaskId → task.taskKind (F1).
156
+ const taskResult = await this.getTaskCached(artifact.sourceTaskId);
157
+ if (!taskResult.ok)
158
+ return taskResult;
159
+ const task = taskResult.value;
160
+ let taskKind;
161
+ let runnerKind;
162
+ if (task === null) {
163
+ taskKind = 'unknown';
164
+ runnerKind = 'unknown';
165
+ notes.push({ code: 'task_missing', artifactId, detail: `task ${artifact.sourceTaskId} not found; cannot determine stage via two-hop` });
166
+ this.emit({ type: 'lineage_partial', artifactId, noteCode: 'task_missing', detail: `task ${artifact.sourceTaskId} missing` });
167
+ }
168
+ else {
169
+ ({ taskKind } = task);
170
+ runnerKind = SUMMARY_RUNNER_KINDS.includes(taskKind)
171
+ ? taskKind
172
+ : 'unknown';
173
+ }
174
+ const node = {
175
+ artifactId,
176
+ taskId: artifact.sourceTaskId,
177
+ taskKind,
178
+ runnerKind,
179
+ contentJson,
180
+ summary: readSummary(contentJson),
181
+ };
182
+ nodes.push(node);
183
+ // Extend frontier with lineage ids (ancestry).
184
+ const lineageIds = Array.isArray(artifact.lineageArtifactIds) ? artifact.lineageArtifactIds : [];
185
+ if (lineageIds.length === 0 && nodes.length === 1) {
186
+ // The start node has no ancestry — not an error, just a short chain.
187
+ }
188
+ for (const id of lineageIds) {
189
+ if (typeof id === 'string' && id !== '') {
190
+ queue.push(id);
191
+ }
192
+ }
193
+ depth++;
194
+ }
195
+ return { ok: true, value: { nodes, complete: notes.length === 0, notes } };
196
+ }
197
+ /** Cached artifact fetch. Returns `ok:false` on store failure or corruption. */
198
+ async getArtifactCached(artifactId) {
199
+ if (this.cache.has(artifactId)) {
200
+ return { ok: true, value: this.cache.get(artifactId) ?? null };
201
+ }
202
+ try {
203
+ const record = await this.artifacts.getArtifactById(artifactId);
204
+ this.cache.set(artifactId, record);
205
+ return { ok: true, value: record };
206
+ }
207
+ catch (storeErr) {
208
+ const err = { kind: 'store_failure', detail: storeErr instanceof Error ? storeErr.message : String(storeErr) };
209
+ this.emit({ type: 'lineage_store_failure', detail: err.detail });
210
+ return { ok: false, error: err };
211
+ }
212
+ }
213
+ /** Cached task fetch (two-hop). Returns `ok:false` only on reader failure (treated as store_failure). */
214
+ async getTaskCached(taskId) {
215
+ if (this.taskCache.has(taskId)) {
216
+ return { ok: true, value: this.taskCache.get(taskId) ?? null };
217
+ }
218
+ try {
219
+ const task = await this.tasks.getTaskById(taskId);
220
+ this.taskCache.set(taskId, task);
221
+ return { ok: true, value: task };
222
+ }
223
+ catch (readerErr) {
224
+ const err = { kind: 'store_failure', detail: readerErr instanceof Error ? readerErr.message : String(readerErr) };
225
+ this.emit({ type: 'lineage_store_failure', detail: err.detail });
226
+ return { ok: false, error: err };
227
+ }
228
+ }
229
+ }
230
+ //# sourceMappingURL=candidate-lineage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"candidate-lineage.js","sourceRoot":"","sources":["../../../src/runtime-v2/internalization/candidate-lineage.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@principles/core",
3
- "version": "1.241.0",
3
+ "version": "1.242.0",
4
4
  "description": "Universal Evolution SDK - framework-agnostic pain signal capture and principle injection",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",