eklavya 1.67.1 → 1.68.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,290 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The deterministic half of the explainer eval.
|
|
3
|
+
*
|
|
4
|
+
* `agents/explainer.md` makes a dozen precise promises about the page it
|
|
5
|
+
* writes: the sections and their order, every option restated verbatim with
|
|
6
|
+
* the pick and the right one marked, a captioned inline-SVG figure, the
|
|
7
|
+
* template left alone, the missed attempt linked, role tokens only. Nobody
|
|
8
|
+
* reads the agent's transcript, so the page is the only evidence; this module
|
|
9
|
+
* checks those promises against it. Whether the page is *clear* is left to the
|
|
10
|
+
* judge in the harness, and to the metrics returned beside the gates.
|
|
11
|
+
*
|
|
12
|
+
* Pure like `conversation-score.ts`: no model, no files, no clock. Regex rather
|
|
13
|
+
* than an HTML parser, because every page starts from one known template.
|
|
14
|
+
*/
|
|
15
|
+
/** The home paths `agents/explainer.md` names, which the harness points at one trial's copies. */
|
|
16
|
+
export const SKILL_PATH = '~/.claude/skills/eklavya-artifacts/SKILL.md';
|
|
17
|
+
export const RUNTIME_BIN = '$HOME/.eklavya/runtime/node_modules/.bin/eklavya';
|
|
18
|
+
const letter = (i) => String.fromCharCode(65 + i);
|
|
19
|
+
/** The brief, in the shape of the tutor's handoff block (`agents/tutor.md`), plus the code. */
|
|
20
|
+
export function brief(c) {
|
|
21
|
+
if (c.request) {
|
|
22
|
+
return [`The developer asked: "${c.request}"`, `concept: ${c.concept.slug} (${c.concept.name})`, '', 'The code it is about:', c.code ?? ''].join('\n');
|
|
23
|
+
}
|
|
24
|
+
const opts = c.options ?? [];
|
|
25
|
+
const answer = c.dont_know ? "I don't know" : c.typed !== undefined ? c.typed : `${letter(c.pick)}. ${opts[c.pick]}`;
|
|
26
|
+
const right = typeof c.right === 'number' ? `${letter(c.right)}. ${opts[c.right]}` : String(c.right ?? '');
|
|
27
|
+
return [
|
|
28
|
+
'Write the explainer page for this missed question.',
|
|
29
|
+
'',
|
|
30
|
+
'[Eklavya explainer handoff]',
|
|
31
|
+
`concept: ${c.concept.slug} (${c.concept.name})`,
|
|
32
|
+
`question: ${c.stem}`,
|
|
33
|
+
`options: ${opts.length ? opts.map((o, i) => `${letter(i)}. ${o}`).join(' | ') : 'none (typed answer)'}`,
|
|
34
|
+
`option_notes: ${c.notes ? c.notes.map((n) => n ?? 'none').join(' | ') : 'none'}`,
|
|
35
|
+
`learner answer: ${answer}`,
|
|
36
|
+
`right answer: ${right}`,
|
|
37
|
+
`attempt_id: ${c.attempt_id ?? 'none'}`,
|
|
38
|
+
'context: none',
|
|
39
|
+
'',
|
|
40
|
+
'The code it came from:',
|
|
41
|
+
c.code ?? '',
|
|
42
|
+
].join('\n');
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Points the home paths a prompt names at one trial's copies. Claude Code
|
|
46
|
+
* cannot run under a throwaway HOME, so this is how a trial gets its own skill
|
|
47
|
+
* and runtime binary. `strict` (the agent file) throws when a path is no longer
|
|
48
|
+
* named, so a reworded prompt cannot run against the real home unnoticed.
|
|
49
|
+
*/
|
|
50
|
+
export function pointHome(text, to, strict) {
|
|
51
|
+
const pairs = [[SKILL_PATH, to.skill], [RUNTIME_BIN, to.runtimeBin]];
|
|
52
|
+
let out = text;
|
|
53
|
+
for (const [from, dest] of pairs) {
|
|
54
|
+
if (dest === undefined)
|
|
55
|
+
continue;
|
|
56
|
+
if (strict && !out.includes(from))
|
|
57
|
+
throw new Error(`the prompt no longer names ${from}; update pointHome`);
|
|
58
|
+
out = out.split(from).join(dest);
|
|
59
|
+
}
|
|
60
|
+
return out;
|
|
61
|
+
}
|
|
62
|
+
const CONTENT = /<!--\s*CONTENT[\s\S]*?-->/;
|
|
63
|
+
const LEDE = /<p class="lede">[\s\S]*?<\/p>/;
|
|
64
|
+
const STYLE = /<style>([\s\S]*?)<\/style>/g;
|
|
65
|
+
const ENTITIES = { amp: '&', lt: '<', gt: '>', quot: '"', '#39': "'", apos: "'", nbsp: ' ' };
|
|
66
|
+
function decode(s) {
|
|
67
|
+
return s.replace(/&(#x[\da-f]+|#\d+|[a-z]+\d*);/gi, (m, e) => {
|
|
68
|
+
if (e[0] === '#')
|
|
69
|
+
return String.fromCodePoint(e[1] === 'x' || e[1] === 'X' ? parseInt(e.slice(2), 16) : Number(e.slice(1)));
|
|
70
|
+
return ENTITIES[e.toLowerCase()] ?? m;
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
/** Visible text, whitespace collapsed and quotes straightened, so "verbatim" survives escaping. */
|
|
74
|
+
export function text(html) {
|
|
75
|
+
return decode(html.replace(/<[^>]+>/g, ' '))
|
|
76
|
+
.replace(/[‘’]/g, "'")
|
|
77
|
+
.replace(/[“”]/g, '"')
|
|
78
|
+
.replace(/\s+/g, ' ')
|
|
79
|
+
.trim();
|
|
80
|
+
}
|
|
81
|
+
function meta(page, name) {
|
|
82
|
+
const m = new RegExp(`<meta\\s+name="eklavya:${name}"\\s+content="([^"]*)"`).exec(page);
|
|
83
|
+
return m ? decode(m[1]) : null;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* The page minus everything the agent may legitimately change -- the lede, and
|
|
87
|
+
* CSS it adds -- so what is left must equal the template around the content.
|
|
88
|
+
*/
|
|
89
|
+
function frame(html) {
|
|
90
|
+
return html.replace(LEDE, '<p class="lede"></p>').replace(STYLE, '<style></style>');
|
|
91
|
+
}
|
|
92
|
+
/** The content the agent wrote, or null when the frame around it was touched. */
|
|
93
|
+
export function contentOf(page, template) {
|
|
94
|
+
const t = frame(template);
|
|
95
|
+
const m = CONTENT.exec(t);
|
|
96
|
+
if (!m)
|
|
97
|
+
return null;
|
|
98
|
+
const pre = t.slice(0, m.index);
|
|
99
|
+
const post = t.slice(m.index + m[0].length);
|
|
100
|
+
const p = frame(page);
|
|
101
|
+
if (CONTENT.test(p) || p.length < pre.length + post.length || !p.startsWith(pre) || !p.endsWith(post))
|
|
102
|
+
return null;
|
|
103
|
+
return p.slice(pre.length, p.length - post.length);
|
|
104
|
+
}
|
|
105
|
+
/** CSS lines in the page's `<style>` blocks that the template did not have. */
|
|
106
|
+
function addedCss(page, template) {
|
|
107
|
+
const had = new Set([...template.matchAll(STYLE)].flatMap((m) => m[1].split('\n').map((l) => l.trim())));
|
|
108
|
+
return [...page.matchAll(STYLE)].flatMap((m) => m[1].split('\n').map((l) => l.trim()).filter((l) => l && !had.has(l))).join('\n');
|
|
109
|
+
}
|
|
110
|
+
// Order matters: "Where the answer went wrong" must not read as the question.
|
|
111
|
+
const HEADINGS = [
|
|
112
|
+
['short', /short answer|in short|short version|the gist|in one sentence|in a sentence/i],
|
|
113
|
+
['wrong', /wrong|misconception|tripped|tempting|mix-?up/i],
|
|
114
|
+
['how', /how .*works?\b|mechanism|under the hood|what actually happens/i],
|
|
115
|
+
['example', /example/i],
|
|
116
|
+
['rule', /rule|transfer|takeaway|gotcha|elsewhere|carry|next time|watch for/i],
|
|
117
|
+
['question', /question/i],
|
|
118
|
+
];
|
|
119
|
+
export function sectionOf(heading) {
|
|
120
|
+
for (const [s, re] of HEADINGS)
|
|
121
|
+
if (re.test(heading))
|
|
122
|
+
return s;
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
const v = (id, ok, detail = '') => ({ id, ok, detail });
|
|
126
|
+
function checkSections(found, c) {
|
|
127
|
+
const want = [];
|
|
128
|
+
if (c.stem)
|
|
129
|
+
want.push('question');
|
|
130
|
+
want.push('short');
|
|
131
|
+
const answered = !c.dont_know && (c.pick !== undefined || c.typed !== undefined);
|
|
132
|
+
if (answered)
|
|
133
|
+
want.push('wrong');
|
|
134
|
+
want.push('how', 'example', 'rule');
|
|
135
|
+
const at = want.map((s) => found.indexOf(s));
|
|
136
|
+
const missing = want.filter((_, i) => at[i] < 0);
|
|
137
|
+
if (missing.length)
|
|
138
|
+
return v('sections_in_order', false, `missing ${missing.join(', ')}`);
|
|
139
|
+
for (let i = 1; i < at.length; i++)
|
|
140
|
+
if (at[i] < at[i - 1])
|
|
141
|
+
return v('sections_in_order', false, `${want[i]} before ${want[i - 1]}`);
|
|
142
|
+
if (!c.stem && found.includes('question'))
|
|
143
|
+
return v('sections_in_order', false, 'a question section on a page nobody asked a question for');
|
|
144
|
+
if (!answered && found.includes('wrong'))
|
|
145
|
+
return v('sections_in_order', false, 'a "went wrong" section with no answer given');
|
|
146
|
+
return v('sections_in_order', true);
|
|
147
|
+
}
|
|
148
|
+
function items(content) {
|
|
149
|
+
const ol = /<ol\s+class="options"[^>]*>([\s\S]*?)<\/ol>/.exec(content);
|
|
150
|
+
if (!ol)
|
|
151
|
+
return null;
|
|
152
|
+
return [...ol[1].matchAll(/<li([^>]*)>([\s\S]*?)<\/li>/g)].map((m) => {
|
|
153
|
+
const cls = /class="([^"]*)"/.exec(m[1])?.[1] ?? '';
|
|
154
|
+
const note = /<span\s+class="note"[^>]*>([\s\S]*?)<\/span>/.exec(m[2]);
|
|
155
|
+
return { cls, body: text(m[2].replace(/<span\s+class="note"[^>]*>[\s\S]*?<\/span>/, '')), note: note ? text(note[1]) : null };
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
const has = (it, c) => !!it && it.cls.split(/\s+/).includes(c);
|
|
159
|
+
function checkOptions(content, c) {
|
|
160
|
+
if (!c.stem)
|
|
161
|
+
return [];
|
|
162
|
+
const list = items(content);
|
|
163
|
+
if (!list)
|
|
164
|
+
return [v('options_verbatim', false, 'no <ol class="options">'), v('option_classes', false, 'no list')];
|
|
165
|
+
const opts = c.options ?? [];
|
|
166
|
+
const out = [];
|
|
167
|
+
const picked = list.flatMap((it, i) => (has(it, 'picked') ? [i] : []));
|
|
168
|
+
const right = list.flatMap((it, i) => (has(it, 'right') ? [i] : []));
|
|
169
|
+
if (!opts.length) {
|
|
170
|
+
// A typed answer to an open question: their words and the right answer, in one list.
|
|
171
|
+
const typed = text(c.typed ?? '');
|
|
172
|
+
const r = text(String(c.right));
|
|
173
|
+
const p = list[picked[0] ?? -1];
|
|
174
|
+
const ok = picked.length === 1 && right.length === 1 && !!p && p.body.includes(typed) && list[right[0]].body.includes(r);
|
|
175
|
+
return [v('options_verbatim', list.length >= 2, `${list.length} items`), v('option_classes', ok, ok ? '' : `picked ${picked}, right ${right}`)];
|
|
176
|
+
}
|
|
177
|
+
// Every option in order, verbatim, then their own words when they typed instead.
|
|
178
|
+
const extra = c.typed !== undefined ? 1 : 0;
|
|
179
|
+
const wrongText = opts.flatMap((o, i) => (list[i]?.body === text(o) ? [] : [`${String.fromCharCode(65 + i)}: ${JSON.stringify(list[i]?.body ?? null)}`]));
|
|
180
|
+
const countOk = list.length === opts.length + extra || (c.dont_know && list.length === opts.length + 1);
|
|
181
|
+
const notesBad = (c.notes ?? []).flatMap((n, i) => (n && list[i]?.note !== text(n) ? [String.fromCharCode(65 + i)] : []));
|
|
182
|
+
const detail = [!countOk && `${list.length} items for ${opts.length + extra}`, wrongText.length && `not verbatim ${wrongText.join('; ')}`, notesBad.length && `note missing or changed on ${notesBad.join(',')}`].filter(Boolean).join('; ');
|
|
183
|
+
out.push(v('options_verbatim', !!countOk && !wrongText.length && !notesBad.length, detail));
|
|
184
|
+
let wantPick = c.pick ?? null;
|
|
185
|
+
if (c.typed !== undefined)
|
|
186
|
+
wantPick = opts.length;
|
|
187
|
+
const pickOk = c.dont_know ? picked.length === 0 || (picked.length === 1 && picked[0] === opts.length) : picked.length === 1 && picked[0] === wantPick;
|
|
188
|
+
const typedOk = c.typed === undefined || list[opts.length]?.body.includes(text(c.typed)) === true;
|
|
189
|
+
const rightOk = right.length === 1 && right[0] === c.right;
|
|
190
|
+
out.push(v('option_classes', pickOk && rightOk && typedOk, pickOk && rightOk && typedOk ? '' : `picked ${JSON.stringify(picked)} want ${wantPick}, right ${JSON.stringify(right)} want ${c.right}${typedOk ? '' : ', typed answer not the extra item'}`));
|
|
191
|
+
return out;
|
|
192
|
+
}
|
|
193
|
+
/** A raw colour where a role token belongs: hex, rgb/hsl, a `--vd-*` step, or a named fill. */
|
|
194
|
+
function rawColours(content, css) {
|
|
195
|
+
const bad = [];
|
|
196
|
+
const styleAttrs = [...content.matchAll(/\sstyle="([^"]*)"/g)].map((m) => m[1]).join('\n');
|
|
197
|
+
for (const m of `${css}\n${styleAttrs}`.matchAll(/#[0-9a-fA-F]{3,8}\b|\b(?:rgba?|hsla?)\(|--vd-[\w-]*/g))
|
|
198
|
+
bad.push(m[0]);
|
|
199
|
+
for (const m of content.matchAll(/\s(?:fill|stroke|stop-color|color)="([^"]*)"/g)) {
|
|
200
|
+
if (!/^(none|currentColor|transparent|inherit|var\(--[\w-]+\)|url\(#[\w-]+\))$/.test(m[1].trim()))
|
|
201
|
+
bad.push(m[0].trim());
|
|
202
|
+
}
|
|
203
|
+
return bad;
|
|
204
|
+
}
|
|
205
|
+
/** Sentences end in . ! or ? before a space or the end; "Go 1.22" and "e.g." do not end one. */
|
|
206
|
+
export function sentenceCount(s) {
|
|
207
|
+
const t = s.replace(/\b(?:e\.g|i\.e|etc|vs)\./gi, '_').trim();
|
|
208
|
+
return t ? t.split(/[.!?]["')\]]?(?:\s+|$)/).filter((x) => /\w/.test(x)).length : 0;
|
|
209
|
+
}
|
|
210
|
+
const EMOJI = /\p{Extended_Pictographic}/u;
|
|
211
|
+
const words = (s) => (s.match(/\S+/g) ?? []).length;
|
|
212
|
+
export function scorePage(input) {
|
|
213
|
+
const { page, template, case: c } = input;
|
|
214
|
+
const gates = [];
|
|
215
|
+
gates.push(v('one_file', input.files === 1, `${input.files} pages`));
|
|
216
|
+
const content = contentOf(page, template);
|
|
217
|
+
gates.push(v('template_intact', content !== null, content === null ? 'the frame around <!-- CONTENT --> changed, or the comment is still there' : ''));
|
|
218
|
+
const body = content ?? '';
|
|
219
|
+
gates.push(v('no_script_added', !/<script\b/i.test(body), ''));
|
|
220
|
+
const kind = meta(page, 'kind');
|
|
221
|
+
const concept = meta(page, 'concept');
|
|
222
|
+
const attempt = meta(page, 'attempt');
|
|
223
|
+
const wantAttempt = c.attempt_id ? String(c.attempt_id) : '';
|
|
224
|
+
gates.push(v('metadata', kind === 'explainer' && concept === c.concept.slug, `kind ${kind}, concept ${concept}`));
|
|
225
|
+
gates.push(v('attempt_linked', attempt === wantAttempt, `attempt "${attempt}", want "${wantAttempt}"`));
|
|
226
|
+
const headings = [...body.matchAll(/<h2[^>]*>([\s\S]*?)<\/h2>/g)].map((m) => text(m[1]));
|
|
227
|
+
const found = headings.map(sectionOf);
|
|
228
|
+
gates.push(checkSections(found, c));
|
|
229
|
+
gates.push(...checkOptions(body, c));
|
|
230
|
+
// "Two or three sentences a newcomer could repeat": countable, so counted.
|
|
231
|
+
const short = sectionText(page, template).short ?? '';
|
|
232
|
+
const sentences = sentenceCount(short);
|
|
233
|
+
gates.push(v('short_answer_brief', sentences >= 1 && sentences <= 3, `${sentences} sentences`));
|
|
234
|
+
const figures = [...body.matchAll(/<figure[^>]*>([\s\S]*?)<\/figure>/g)].map((m) => m[1]);
|
|
235
|
+
const good = figures.filter((f) => /<svg\b/.test(f) && /<figcaption[^>]*>[\s\S]*?\S[\s\S]*?<\/figcaption>/.test(f) && /class="[^"]*\bsvg-/.test(f));
|
|
236
|
+
gates.push(v('figure_svg', good.length > 0 && /<svg\b/.test(figures[0]), `${good.length}/${figures.length} figures with svg, caption and .svg-* classes`));
|
|
237
|
+
const langs = [...body.matchAll(/<pre\s[^>]*data-lang="([^"]*)"/g)].map((m) => m[1]);
|
|
238
|
+
const langOk = langs.length > 0 && (!c.lang || langs.some((l) => new RegExp(`^(?:${c.lang})$`, 'i').test(l)));
|
|
239
|
+
gates.push(v('example_labelled', langOk, `data-lang ${JSON.stringify(langs)}${c.lang ? `, want ${c.lang}` : ''}`));
|
|
240
|
+
const bad = rawColours(body, addedCss(page, template));
|
|
241
|
+
gates.push(v('tokens_only', bad.length === 0, bad.slice(0, 4).join(' ')));
|
|
242
|
+
gates.push(v('no_emoji', !EMOJI.test(text(body)), ''));
|
|
243
|
+
gates.push(v('opened', input.opened.includes(input.path), `opened ${JSON.stringify(input.opened)}`));
|
|
244
|
+
const reply = input.reply.trim();
|
|
245
|
+
gates.push(v('path_reply', reply.includes(input.path) && reply.split('\n').length <= 2, reply.slice(0, 120)));
|
|
246
|
+
const plain = text(body.replace(/<svg[\s\S]*?<\/svg>/g, ' '));
|
|
247
|
+
const used = (c.identifiers ?? []).filter((id) => body.includes(id));
|
|
248
|
+
return {
|
|
249
|
+
gates,
|
|
250
|
+
metrics: { words: words(plain), figures: figures.length, sections: headings, identifiers_used: used.length, identifiers_offered: c.identifiers?.length ?? 0 },
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
/** The text under each `<h2>`, by section, for the judge. */
|
|
254
|
+
export function sectionText(page, template) {
|
|
255
|
+
const body = contentOf(page, template) ?? '';
|
|
256
|
+
const out = {};
|
|
257
|
+
const parts = body.split(/(?=<h2[^>]*>)/);
|
|
258
|
+
for (const part of parts) {
|
|
259
|
+
const h = /<h2[^>]*>([\s\S]*?)<\/h2>/.exec(part);
|
|
260
|
+
if (!h)
|
|
261
|
+
continue;
|
|
262
|
+
const s = sectionOf(text(h[1]));
|
|
263
|
+
if (s && !out[s])
|
|
264
|
+
out[s] = text(part.slice(h.index + h[0].length).replace(/<svg[\s\S]*?<\/svg>/g, ' '));
|
|
265
|
+
}
|
|
266
|
+
return out;
|
|
267
|
+
}
|
|
268
|
+
export function summarise(results) {
|
|
269
|
+
const failed = {};
|
|
270
|
+
let clean = 0;
|
|
271
|
+
let errored = 0;
|
|
272
|
+
const byCase = {};
|
|
273
|
+
for (const r of results) {
|
|
274
|
+
const row = (byCase[r.case] ??= { trials: 0, clean: 0 });
|
|
275
|
+
row.trials += 1;
|
|
276
|
+
if (r.error) {
|
|
277
|
+
errored += 1;
|
|
278
|
+
continue;
|
|
279
|
+
}
|
|
280
|
+
const bad = r.gates.filter((g) => !g.ok);
|
|
281
|
+
for (const g of bad)
|
|
282
|
+
failed[g.id] = (failed[g.id] ?? 0) + 1;
|
|
283
|
+
if (!bad.length) {
|
|
284
|
+
clean += 1;
|
|
285
|
+
row.clean += 1;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
return { trials: results.length, clean, errored, failed, byCase };
|
|
289
|
+
}
|
|
290
|
+
//# sourceMappingURL=explainer-score.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"explainer-score.js","sourceRoot":"","sources":["../../src/eval/explainer-score.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "eklavya",
|
|
3
3
|
"displayName": "Eklavya",
|
|
4
|
-
"version": "1.
|
|
4
|
+
"version": "1.68.0",
|
|
5
5
|
"description": "Learn while your agent works. Turns coding-agent generation time into adaptive, Socratic learning grounded in the code being written.",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "Ajay Kumar"
|
|
@@ -49,8 +49,11 @@ In this order, each under its own `<h2>`:
|
|
|
49
49
|
the same list. When they typed their own answer although options were
|
|
50
50
|
offered, list every option, then their words as one more item with
|
|
51
51
|
`class="picked"`. Skip this section for a page someone asked for.
|
|
52
|
-
- **The short answer.**
|
|
53
|
-
thing *does*,
|
|
52
|
+
- **The short answer.** At most three sentences a newcomer could repeat. The
|
|
53
|
+
first says what the thing *does*, in plain words; the second says what that
|
|
54
|
+
means for the code in the question (the right answer, and why); a third, if
|
|
55
|
+
needed, gives its name. Use no term the reader would have to look up. Every
|
|
56
|
+
further detail, caveat and name belongs under "How it works".
|
|
54
57
|
- **Where the answer went wrong.** Name the misconception in the answer given
|
|
55
58
|
— kindly, specifically — and why it is tempting. If there was no answer
|
|
56
59
|
("I don't know"), skip this and start from the mechanism.
|
|
@@ -63,9 +66,13 @@ In this order, each under its own `<h2>`:
|
|
|
63
66
|
ideally in the language the developer was working in, as
|
|
64
67
|
`<pre data-lang="…"><code>` so the template labels and colours it.
|
|
65
68
|
- **The rule that transfers.** When this applies in a different codebase, and
|
|
66
|
-
the one gotcha to watch for.
|
|
69
|
+
the one gotcha to watch for. Compare with another language or library only
|
|
70
|
+
when you are sure it behaves that way: a wrong comparison teaches the wrong
|
|
71
|
+
thing.
|
|
67
72
|
|
|
68
|
-
Plain English, short sentences, no jargon without a gloss.
|
|
73
|
+
Plain English, short sentences, no jargon without a gloss. State a claim no
|
|
74
|
+
more strongly than the page later supports: a guarantee the gotcha qualifies
|
|
75
|
+
is stated as qualified the first time. Any CSS you add
|
|
69
76
|
follows the design rules in the `eklavya-artifacts` skill: role tokens only
|
|
70
77
|
(`--ink --dim --faint --line --spot …`, never a raw hex or `--vd-*` step), one
|
|
71
78
|
verdigris accent, square corners, hairlines instead of shadows, the three font
|
package/package.json
CHANGED