proposal-enrich-llm.test.mjs
87 lines 3.8 KB
Raw
sha256:65ccb454656ea5acdea0a10e559b78bcde1eb6ff753ecc2911bc99d1c3d7cadd feat(calendar): enforce agent context tiers in retrieval AP… Human minor ⚠ breaking 1 day ago
1 import { describe, it } from 'node:test';
2 import assert from 'node:assert';
3 import {
4 parseEnrichModelOutput,
5 validateAndNormalizeSuggestedFrontmatter,
6 validateAndNormalizeEnrichResult,
7 normalizeSuggestedLabels,
8 serializeSuggestedFrontmatterJson,
9 buildEnrichMessages,
10 } from '../lib/proposal-enrich-llm.mjs';
11
12 describe('proposal-enrich-llm', () => {
13 it('parseEnrichModelOutput parses envelope and strips fences', () => {
14 const raw = '```json\n{"enrich_version":2,"summary":"Hi","suggested_labels":["a","b"],"suggested_frontmatter":{"project":"Foo-Bar"}}\n```';
15 const p = parseEnrichModelOutput(raw);
16 assert.strictEqual(p.enrich_version, 2);
17 assert.strictEqual(p.summary, 'Hi');
18 assert.deepStrictEqual(p.suggested_labels, ['a', 'b']);
19 assert.strictEqual(p.suggested_frontmatter.project, 'Foo-Bar');
20 assert.strictEqual(p.parseOk, true);
21 });
22
23 it('validateAndNormalizeSuggestedFrontmatter normalizes slugs and strips forbidden keys', () => {
24 const out = validateAndNormalizeSuggestedFrontmatter({
25 project: 'My Project!',
26 causal_chain_id: 'Chain One',
27 entity: ['Alice B', 'bob'],
28 knowtation_editor: 'x',
29 network: 'eth',
30 tags: ['A', 'b'],
31 follows: 'inbox/../escape.md',
32 good: 'ignored-unknown-key',
33 });
34 assert.strictEqual(out.project, 'my-project');
35 assert.strictEqual(out.causal_chain_id, 'chain-one');
36 assert.deepStrictEqual(out.entity, ['alice-b', 'bob']);
37 assert.deepStrictEqual(out.tags, ['a', 'b']);
38 assert.strictEqual(out.knowtation_editor, undefined);
39 assert.strictEqual(out.network, undefined);
40 assert.strictEqual(out.good, undefined);
41 assert.strictEqual(out.follows, undefined);
42 });
43
44 it('validateAndNormalizeSuggestedFrontmatter accepts safe follows path', () => {
45 const out = validateAndNormalizeSuggestedFrontmatter({
46 follows: 'projects/foo/note.md',
47 });
48 assert.strictEqual(out.follows, 'projects/foo/note.md');
49 });
50
51 it('normalizeSuggestedLabels dedupes and caps', () => {
52 const out = normalizeSuggestedLabels(['a', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']);
53 assert.strictEqual(out.length, 8);
54 });
55
56 it('validateAndNormalizeEnrichResult end-to-end', () => {
57 const raw =
58 '{"enrich_version":2,"summary":"S","suggested_labels":["tag-one"],"suggested_frontmatter":{"title":"T","episode_id":"Ep_1","entity":["Alice B","Core API"],"causal_chain_id":"Launch Rollout","state_snapshot":"true"}}';
59 const r = validateAndNormalizeEnrichResult(raw);
60 assert.strictEqual(r.summary, 'S');
61 assert.deepStrictEqual(r.suggested_labels, ['tag-one']);
62 assert.strictEqual(r.suggested_frontmatter.title, 'T');
63 assert.strictEqual(r.suggested_frontmatter.episode_id, 'ep-1');
64 assert.deepStrictEqual(r.suggested_frontmatter.entity, ['alice-b', 'core-api']);
65 assert.strictEqual(r.suggested_frontmatter.causal_chain_id, 'launch-rollout');
66 assert.strictEqual(r.suggested_frontmatter.state_snapshot, true);
67 });
68
69 it('serializeSuggestedFrontmatterJson returns bounded object', () => {
70 const s = serializeSuggestedFrontmatterJson({ project: 'x' });
71 assert(s.includes('project'));
72 const empty = serializeSuggestedFrontmatterJson({});
73 assert.strictEqual(empty, '{}');
74 });
75
76 it('buildEnrichMessages includes allow-list and path', () => {
77 const { system, user } = buildEnrichMessages({ path: 'inbox/x.md', intent: 'fix', body: 'hello' });
78 assert(system.includes('enrich_version'));
79 assert(system.includes('Prefer returning every field'));
80 assert(user.includes('inbox/x.md'));
81 assert(user.includes('fix'));
82 assert(user.includes('hello'));
83 assert(user.includes('Prioritize temporal, causal, entity, and relationship metadata'));
84 assert(user.includes('causal_chain_id'));
85 assert(user.includes('state_snapshot'));
86 });
87 });
File History 2 commits
sha256:65ccb454656ea5acdea0a10e559b78bcde1eb6ff753ecc2911bc99d1c3d7cadd feat(calendar): enforce agent context tiers in retrieval AP… Human minor 1 day ago
sha256:9103f98c89257ed2b01c237cea895dabb3e85ea337dccb1161c175e4422355b6 docs: accept Calendar Events v0 spec with Phase 0 security … Human 1 day ago