@inerrata-corporation/errata 2.0.22-dev.4130 → 2.0.22-dev.4148
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/consolidate-worker.mjs +551 -1
- package/errata.mjs +668 -99
- package/generalize-worker.mjs +544 -1
- package/package.json +1 -1
- package/pass-worker.mjs +543 -0
- package/resources/context-plugin/.codex-plugin/plugin.json +1 -1
- package/resources/context-plugin/SHA256SUMS +1 -1
package/errata.mjs
CHANGED
|
@@ -18205,6 +18205,603 @@ var init_sqlite_adapter = __esm({
|
|
|
18205
18205
|
}
|
|
18206
18206
|
});
|
|
18207
18207
|
|
|
18208
|
+
// ../../packages/local-shared/src/tag-grammar.ts
|
|
18209
|
+
function tagGrammarCopy() {
|
|
18210
|
+
const copy = [];
|
|
18211
|
+
for (const ref of ["its-handle", "its-id", "h", "id"]) {
|
|
18212
|
+
for (const build of Object.values(TAG_EXAMPLES)) copy.push(build(ref));
|
|
18213
|
+
}
|
|
18214
|
+
for (const v of TAG_VERBS) {
|
|
18215
|
+
copy.push(v.hint);
|
|
18216
|
+
if (v.taughtBy) copy.push(v.taughtBy);
|
|
18217
|
+
for (const q of v.qualifiers ?? []) copy.push(q.note);
|
|
18218
|
+
for (const l of v.lowering) {
|
|
18219
|
+
if (l.note) copy.push(l.note);
|
|
18220
|
+
if (l.knownViolation) copy.push(l.knownViolation.finding);
|
|
18221
|
+
}
|
|
18222
|
+
}
|
|
18223
|
+
for (const f of TAG_FENCES) copy.push(f.hint);
|
|
18224
|
+
return copy;
|
|
18225
|
+
}
|
|
18226
|
+
function normalizeTemplateBody(body2) {
|
|
18227
|
+
return body2.replace(/…|\.{3}/g, " ").replace(/\s+/g, " ").trim().replace(/^[\s,;:—–-]+|[\s,;:.—–-]+$/g, "").toLowerCase();
|
|
18228
|
+
}
|
|
18229
|
+
function deriveTagTemplates(copy) {
|
|
18230
|
+
const bodies = /* @__PURE__ */ new Set();
|
|
18231
|
+
const handles = new Set([...TAG_PLACEHOLDER_HANDLES].map((h) => h.toLowerCase()));
|
|
18232
|
+
for (const text of copy) {
|
|
18233
|
+
for (const m of text.matchAll(BRACKET_TOKEN)) {
|
|
18234
|
+
const token = m[1].trim().toLowerCase();
|
|
18235
|
+
if (!/^[!?]/.test(token) && !REAL_HANDLE_SHAPE.test(token)) handles.add(token);
|
|
18236
|
+
}
|
|
18237
|
+
}
|
|
18238
|
+
for (const text of copy) {
|
|
18239
|
+
for (const m of text.matchAll(TEMPLATE_VERB_GROUP)) {
|
|
18240
|
+
const body2 = normalizeTemplateBody(m[2]);
|
|
18241
|
+
bodies.add(body2);
|
|
18242
|
+
const unthreaded = normalizeTemplateBody(body2.replace(/^#[a-z][\w-]*/i, ""));
|
|
18243
|
+
bodies.add(unthreaded);
|
|
18244
|
+
const rest2 = normalizeTemplateBody(unthreaded.replace(BRACKET_TOKEN, (t, h) => handles.has(h.trim().toLowerCase()) ? " " : t).replace(/,/g, " "));
|
|
18245
|
+
bodies.add(rest2);
|
|
18246
|
+
}
|
|
18247
|
+
}
|
|
18248
|
+
bodies.delete("");
|
|
18249
|
+
return { bodies, handles };
|
|
18250
|
+
}
|
|
18251
|
+
function isTemplateSegment(verb, text, templates) {
|
|
18252
|
+
const t = normalizeTemplateBody(text);
|
|
18253
|
+
if (t === "" || templates.bodies.has(t)) return true;
|
|
18254
|
+
const unthreaded = normalizeTemplateBody(t.replace(/^#[a-z][\w-]*/i, ""));
|
|
18255
|
+
if (unthreaded === "" || templates.bodies.has(unthreaded)) return true;
|
|
18256
|
+
let real = false;
|
|
18257
|
+
let standIn = false;
|
|
18258
|
+
const rest2 = unthreaded.replace(BRACKET_TOKEN, (token, inner) => {
|
|
18259
|
+
const h = inner.trim().toLowerCase();
|
|
18260
|
+
if (/^[!?]/.test(h)) return token;
|
|
18261
|
+
if (templates.handles.has(h) || /…|\.{3}/.test(h) || !REAL_HANDLE_SHAPE.test(h)) standIn = true;
|
|
18262
|
+
else real = true;
|
|
18263
|
+
return " ";
|
|
18264
|
+
});
|
|
18265
|
+
if (standIn || real) return true;
|
|
18266
|
+
const words = normalizeTemplateBody(rest2.replace(ANY_VERB_WORD, " ").replace(/,/g, " "));
|
|
18267
|
+
if (words === "" || templates.bodies.has(words)) return true;
|
|
18268
|
+
const spec = verb ? TAG_VERB_BY_NAME.get(verb) : void 0;
|
|
18269
|
+
if (!spec || spec.handleRequired) return true;
|
|
18270
|
+
return words.length < (spec.minText ?? 2);
|
|
18271
|
+
}
|
|
18272
|
+
function isTemplateTagBody(verb, body2, templates = TAG_TEMPLATES) {
|
|
18273
|
+
const whole = normalizeTemplateBody(body2);
|
|
18274
|
+
if (whole === "" || templates.bodies.has(whole)) return true;
|
|
18275
|
+
const segments = body2.split(JOINED_VERB);
|
|
18276
|
+
return segments.every((seg, i2) => {
|
|
18277
|
+
const lead2 = i2 === 0 ? null : LEADING_VERB.exec(seg);
|
|
18278
|
+
return isTemplateSegment(lead2 ? lead2[1].toLowerCase() : verb, lead2 ? seg.slice(lead2[0].length) : seg, templates);
|
|
18279
|
+
});
|
|
18280
|
+
}
|
|
18281
|
+
function quotesOnlyTemplateTags(span, templates = TAG_TEMPLATES) {
|
|
18282
|
+
let found = false;
|
|
18283
|
+
for (const m of span.matchAll(QUOTED_TAG_OPENER)) {
|
|
18284
|
+
found = true;
|
|
18285
|
+
if (m.index > 0 && /[\w$.\])]/.test(span[m.index - 1])) continue;
|
|
18286
|
+
const bodyStart = m.index + m[0].length;
|
|
18287
|
+
let depth = 1;
|
|
18288
|
+
let close = -1;
|
|
18289
|
+
for (let i2 = bodyStart; i2 < span.length; i2++) {
|
|
18290
|
+
if (span[i2] === "(") depth++;
|
|
18291
|
+
else if (span[i2] === ")" && --depth === 0) {
|
|
18292
|
+
close = i2;
|
|
18293
|
+
break;
|
|
18294
|
+
}
|
|
18295
|
+
}
|
|
18296
|
+
if (close < 0) continue;
|
|
18297
|
+
if (!isTemplateTagBody(m[1]?.toLowerCase() ?? null, span.slice(bodyStart, close), templates)) return false;
|
|
18298
|
+
}
|
|
18299
|
+
return found;
|
|
18300
|
+
}
|
|
18301
|
+
var TAG_CANONICAL_ID_PREFIXES, TAG_HANDLE_SOURCE, TAG_THREAD_SOURCE, TAG_PLACEHOLDER_HANDLES, TAG_EXAMPLES, P, S, RC, CITE_LOWERING, INSTANCE_LOWERING, TRIAGE_TO_RC, TAG_VERBS, TAG_FENCES, TAG_VERB_BY_NAME, TAG_PAREN_VERBS, TAG_GRAMMAR_OPENERS, TAG_QUOTED_PAREN_SOURCE, TAG_QUOTED_RE, TAG_QUOTED_PAREN_RE, TEMPLATE_VERB_GROUP, BRACKET_TOKEN, REAL_HANDLE_SHAPE, TAG_TEMPLATES, VERB_WORDS_SOURCE, JOINED_VERB, LEADING_VERB, ANY_VERB_WORD, QUOTED_TAG_OPENER, TAG_VERDICT_TOKENS;
|
|
18302
|
+
var init_tag_grammar = __esm({
|
|
18303
|
+
"../../packages/local-shared/src/tag-grammar.ts"() {
|
|
18304
|
+
"use strict";
|
|
18305
|
+
TAG_CANONICAL_ID_PREFIXES = ["pat", "sol", "drc", "dcause", "dfix", "dprob", "dvuln", "prob", "claim", "err"];
|
|
18306
|
+
TAG_HANDLE_SOURCE = String.raw`\[([a-z0-9][\w-]{0,80})\]|((?:${TAG_CANONICAL_ID_PREFIXES.join("|")})_[0-9a-f]{6,})`;
|
|
18307
|
+
TAG_THREAD_SOURCE = String.raw`#([a-z][\w-]{0,63})`;
|
|
18308
|
+
TAG_PLACEHOLDER_HANDLES = /* @__PURE__ */ new Set([
|
|
18309
|
+
"handle",
|
|
18310
|
+
"its-handle",
|
|
18311
|
+
"another",
|
|
18312
|
+
"a-third",
|
|
18313
|
+
"h",
|
|
18314
|
+
"h1",
|
|
18315
|
+
"h2",
|
|
18316
|
+
"id",
|
|
18317
|
+
"its-id",
|
|
18318
|
+
"a",
|
|
18319
|
+
"b",
|
|
18320
|
+
"\u2026",
|
|
18321
|
+
"..."
|
|
18322
|
+
]);
|
|
18323
|
+
TAG_EXAMPLES = {
|
|
18324
|
+
prior: (ref) => `([${ref}])`,
|
|
18325
|
+
problem: () => `[!one line on what's wrong]`,
|
|
18326
|
+
vulnerability: () => `[!vuln: who can do what; observed basis @ path:line]`,
|
|
18327
|
+
suspectedVulnerability: () => `[?vuln: consequence; missing check]`,
|
|
18328
|
+
vulnerabilityThread: () => `[!#v vuln: finding here]`,
|
|
18329
|
+
fix: (ref) => `(fix:[${ref}])`,
|
|
18330
|
+
// CONSTRAINT — the native capture path for a DIFFUSE problem (a constraint/tension/
|
|
18331
|
+
// conflict that shaped a decision). Free text, attaches to the decision sentence the
|
|
18332
|
+
// agent is already writing. Full rationale in the constraint note below + prior-tags.ts.
|
|
18333
|
+
constraint: () => `(constraint: the limitation that forced it)`,
|
|
18334
|
+
// TRIAGE — routes the problem/symptom in scope to its cause. `(cause:[handle])`
|
|
18335
|
+
// links to a cited RootCause/Solution node; `(cause: free text)` mints a RootCause
|
|
18336
|
+
// from the text. Harvested in prior-tags.ts → engine.ts (see the triage note below).
|
|
18337
|
+
triage: (ref) => `(cause:[${ref}])`,
|
|
18338
|
+
// Unlike a bare cause citation, this handle names the Problem being explained.
|
|
18339
|
+
triageExplain: (ref) => `(cause:[${ref}] the mechanism)`,
|
|
18340
|
+
// The MINT form — free-text cause that mints a RootCause. Prime-time surfacing
|
|
18341
|
+
// (recallForFile) pastes this next to an open Problem that has no cause yet, so the
|
|
18342
|
+
// diagnostic moment is cued when the agent is looking at the problem. Kept here so
|
|
18343
|
+
// the grammar can't drift from parseInlineTags' `(cause: …)` acceptance.
|
|
18344
|
+
triageMint: () => `(cause: why it happens)`,
|
|
18345
|
+
// THREAD forms — the witness-declared symptom↔cause/fix binding. A `#id` on the
|
|
18346
|
+
// flag names the diagnosis thread; the same `#id` on a later verb binds to it
|
|
18347
|
+
// explicitly (across sentences AND turns), replacing proximity guessing. Adjacent
|
|
18348
|
+
// tags never need one — the id is for diagnoses that unfold over distance.
|
|
18349
|
+
problemThread: () => `[!#slug one line on what's wrong]`,
|
|
18350
|
+
causeThread: () => `(cause:#slug the mechanism)`,
|
|
18351
|
+
fixThread: (thread = "slug") => `(fix:#${thread} what you changed)`,
|
|
18352
|
+
// ATTEMPT arc — what's being tried and what didn't work. A failed attempt is a
|
|
18353
|
+
// witnessed NEGATIVE result: it saves the next agent the same dead end.
|
|
18354
|
+
tried: () => `(tried: the approach you're attempting)`,
|
|
18355
|
+
failed: () => `(failed: what didn't work and the dead end it rules out)`,
|
|
18356
|
+
// `(failed:[h] …)` on a shown SOLUTION — the refute-by-failure form the context render teaches.
|
|
18357
|
+
failedCite: (ref) => `(failed:[${ref}] what came back)`,
|
|
18358
|
+
// LINK verbs (AC epic) — bind the problem in scope to CANONICAL priors and
|
|
18359
|
+
// abstractions. Multi-target by design: single links are weak; ~3 links to 3
|
|
18360
|
+
// DIFFERENT relevant priors is the target shape (see linkBullet).
|
|
18361
|
+
instance: (ref) => `(instance:[${ref}],[another],[a-third])`,
|
|
18362
|
+
pattern: () => `(pattern: name the general shape)`,
|
|
18363
|
+
// DOMAIN — the abstract area a problem is about; the concept layer an
|
|
18364
|
+
// anchor-less problem clusters on. Mints/resolves a Domain by name.
|
|
18365
|
+
domain: () => `(domain: The Area)`,
|
|
18366
|
+
// PACKAGE/COMPONENT — agent-named public anchors (OM-agent-anchors): the
|
|
18367
|
+
// package a problem is ABOUT (even when not a dependency) and the
|
|
18368
|
+
// framework/product-level unit it concerns. Public spine anchors → the
|
|
18369
|
+
// knowledge can cross to the collective.
|
|
18370
|
+
package: () => `(package: the-package-name)`,
|
|
18371
|
+
component: () => `(component: The Component)`,
|
|
18372
|
+
aids: (ref) => `(aids:[${ref}])`,
|
|
18373
|
+
// SOLUTION-STRUCTURE (SS-structure) — taught in the link bullet; Solution→Solution.
|
|
18374
|
+
buildsOn: (ref) => `(builds-on:[${ref}])`,
|
|
18375
|
+
supersedes: (ref) => `(supersedes:[${ref}])`,
|
|
18376
|
+
alternative: (ref) => `(alternative:[${ref}])`,
|
|
18377
|
+
// VERDICT (VS-verdict-tags) — a judgment on a SHOWN prior, distinct from leaning on it.
|
|
18378
|
+
// `confirm` rides the corroborate channel (it held); `refute` the contradict channel
|
|
18379
|
+
// (it's wrong / didn't hold) and REQUIRES a reason. This is the inline producer the
|
|
18380
|
+
// evidence channels lacked — refute sat dead (contradictionPressure 0) until now, while
|
|
18381
|
+
// lean-on corroboration lived, because only corroboration had an inline path. Grammar
|
|
18382
|
+
// single-sourced with parseInlineTags' CONFIRM_PREFIX/REFUTE_PREFIX.
|
|
18383
|
+
confirm: (ref) => `(confirm:[${ref}])`,
|
|
18384
|
+
refute: (ref) => `(refute:[${ref}] one line why)`,
|
|
18385
|
+
// RETRACT — "not a real problem": the errata-resolved block with a disposition
|
|
18386
|
+
// (parseDesignResolutions, turn.ts). No inline form exists; the block is the grammar.
|
|
18387
|
+
retract: (id) => ["```errata-resolved", `id: ${id}`, "disposition: false_positive", "reason: why it was never a real problem", "```"].join("\n")
|
|
18388
|
+
};
|
|
18389
|
+
P = "Problem";
|
|
18390
|
+
S = "Solution";
|
|
18391
|
+
RC = "RootCause";
|
|
18392
|
+
CITE_LOWERING = [
|
|
18393
|
+
{ target: RC, writes: [{ from: P, edge: "CAUSED_BY", to: RC }] },
|
|
18394
|
+
{ target: S, writes: [{ from: P, edge: "SOLVED_BY", to: S }] },
|
|
18395
|
+
{ target: "Pattern", writes: [{ from: P, edge: "INSTANCE_OF", to: "Pattern" }, { from: "Pattern", edge: "ANCHORED_AT", to: "File" }], note: "cite-anchor promotion after 2 sessions", decision: "d", knownViolation: { edge: "ANCHORED_AT", finding: "motif cite-anchor promotion writes a refused ANCHORED_AT" } },
|
|
18396
|
+
{ target: "Package", writes: [{ from: P, edge: "DEPENDS_ON", to: "Package" }] },
|
|
18397
|
+
{ target: "Language", writes: [{ from: P, edge: "OCCURS_IN", to: "Language" }] },
|
|
18398
|
+
{ target: "Tool", writes: [{ from: P, edge: "CONCERNS", to: "Tool" }] },
|
|
18399
|
+
{ target: "Component", writes: [{ from: P, edge: "CONCERNS", to: "Component" }] },
|
|
18400
|
+
{ target: P, writes: [{ from: P, edge: "RELATES_TO", to: P }, { from: P, edge: "ANCHORED_AT", to: "File" }], note: "corroboration witness + cite-anchor promotion" },
|
|
18401
|
+
{ target: "AntiPattern", writes: [{ from: P, edge: "RELATES_TO", to: "AntiPattern" }, { from: "AntiPattern", edge: "ANCHORED_AT", to: "File" }], decision: "e", knownViolation: { edge: "ANCHORED_AT", finding: "motif cite-anchor promotion writes a refused ANCHORED_AT" } },
|
|
18402
|
+
{ target: "Technique", writes: [{ from: P, edge: "RELATES_TO", to: "Technique" }, { from: "Technique", edge: "ANCHORED_AT", to: "File" }], decision: "e", knownViolation: { edge: "ANCHORED_AT", finding: "motif cite-anchor promotion writes a refused ANCHORED_AT" } },
|
|
18403
|
+
{ target: "Weakness", writes: [{ from: P, edge: "RELATES_TO", to: "Weakness" }], decision: "e" },
|
|
18404
|
+
{ target: "Domain", writes: [{ from: P, edge: "RELATES_TO", to: "Domain" }], decision: "e" },
|
|
18405
|
+
{ target: "Claim", writes: [{ from: P, edge: "RELATES_TO", to: "Claim" }, { from: "Claim", edge: "ANCHORED_AT", to: "File" }] }
|
|
18406
|
+
];
|
|
18407
|
+
INSTANCE_LOWERING = [
|
|
18408
|
+
{ target: "Pattern", writes: [{ from: P, edge: "INSTANCE_OF", to: "Pattern" }] },
|
|
18409
|
+
{ target: P, writes: [{ from: P, edge: "RELATES_TO", to: P }] },
|
|
18410
|
+
{ target: S, writes: [{ from: P, edge: "SOLVED_BY", to: S }], note: "an instance cite on a Solution claims the problem is solved by it", decision: "a" },
|
|
18411
|
+
{ target: RC, writes: [{ from: P, edge: "CAUSED_BY", to: RC }] },
|
|
18412
|
+
{ target: "AntiPattern", writes: [{ from: P, edge: "RELATES_TO", to: "AntiPattern" }], decision: "e" },
|
|
18413
|
+
{ target: "Technique", writes: [{ from: P, edge: "RELATES_TO", to: "Technique" }], decision: "e" },
|
|
18414
|
+
{ target: "Weakness", writes: [{ from: P, edge: "RELATES_TO", to: "Weakness" }], decision: "e" },
|
|
18415
|
+
{ target: "Domain", writes: [{ from: P, edge: "RELATES_TO", to: "Domain" }], decision: "e" },
|
|
18416
|
+
{ target: "Package", writes: [{ from: P, edge: "DEPENDS_ON", to: "Package" }] },
|
|
18417
|
+
{ target: "Component", writes: [{ from: P, edge: "CONCERNS", to: "Component" }] }
|
|
18418
|
+
];
|
|
18419
|
+
TRIAGE_TO_RC = [
|
|
18420
|
+
{ from: P, edge: "TRIAGED_BY", to: "Triage" },
|
|
18421
|
+
{ from: "Triage", edge: "INDICATES", to: RC },
|
|
18422
|
+
{ from: P, edge: "CAUSED_BY", to: RC }
|
|
18423
|
+
];
|
|
18424
|
+
TAG_VERBS = [
|
|
18425
|
+
{
|
|
18426
|
+
verb: "cite",
|
|
18427
|
+
form: "citation",
|
|
18428
|
+
opener: "(",
|
|
18429
|
+
kinds: ["prior"],
|
|
18430
|
+
args: "handles",
|
|
18431
|
+
thread: false,
|
|
18432
|
+
handleRequired: true,
|
|
18433
|
+
lowering: CITE_LOWERING,
|
|
18434
|
+
examples: ["prior"],
|
|
18435
|
+
hint: "cite a shown prior you leaned on: ([its-handle]) \u2014 handles only, no prose inside the parens",
|
|
18436
|
+
taught: "taught"
|
|
18437
|
+
},
|
|
18438
|
+
{
|
|
18439
|
+
verb: "!",
|
|
18440
|
+
form: "flag",
|
|
18441
|
+
opener: "[!",
|
|
18442
|
+
kinds: ["problem", "triage", "vulnerability", "fix", "prior"],
|
|
18443
|
+
args: "flag-body",
|
|
18444
|
+
thread: true,
|
|
18445
|
+
minText: 8,
|
|
18446
|
+
qualifiers: [
|
|
18447
|
+
{ name: "vuln", taught: true, note: "[!vuln: \u2026] \u2192 Vulnerability (asserted)" },
|
|
18448
|
+
{ name: "fixed", taught: false, note: "[!fixed: X] \u2192 read as a self-found fix" },
|
|
18449
|
+
{ name: "resolved", taught: false, note: "[!resolved: X] \u2192 read as a self-found fix" }
|
|
18450
|
+
],
|
|
18451
|
+
lowering: [
|
|
18452
|
+
{ target: P, writes: [], note: "mints a Problem; `@ path[:line]` anchors it (ANCHORED_AT to code)" },
|
|
18453
|
+
{ target: RC, writes: [...TRIAGE_TO_RC, { from: RC, edge: "CAUSED_BY", to: RC }], note: "`<-` segments: first \u2192 triage route, later \u2192 RootCause chain" },
|
|
18454
|
+
{ target: "Vulnerability", writes: [], note: "[!vuln: \u2026]; `<-` causes stay on the finding (vulnerabilityCauses)" }
|
|
18455
|
+
],
|
|
18456
|
+
examples: ["problem", "problemThread", "vulnerability", "vulnerabilityThread"],
|
|
18457
|
+
hint: "flag a problem on one line: [!what's wrong @ path:42]; fold causes with <- ; a fix goes in (fix: \u2026), not [!fixed: \u2026]",
|
|
18458
|
+
taught: "taught"
|
|
18459
|
+
},
|
|
18460
|
+
{
|
|
18461
|
+
verb: "?",
|
|
18462
|
+
form: "flag",
|
|
18463
|
+
opener: "[?",
|
|
18464
|
+
kinds: ["todo", "vulnerability"],
|
|
18465
|
+
args: "flag-body",
|
|
18466
|
+
thread: true,
|
|
18467
|
+
minText: 8,
|
|
18468
|
+
qualifiers: [{ name: "vuln", taught: true, note: "[?vuln: \u2026] \u2192 Vulnerability (suspected)" }],
|
|
18469
|
+
lowering: [{ target: P, writes: [], note: "mints a todo Problem; a fix can close it today", decision: "g" }],
|
|
18470
|
+
examples: ["suspectedVulnerability"],
|
|
18471
|
+
hint: "[?\u2026] marks an open question / todo; [?vuln: consequence; missing check] a suspected vulnerability",
|
|
18472
|
+
taught: "untaught",
|
|
18473
|
+
taughtBy: "only the [?vuln:] form is taught; the bare [?todo] form is not",
|
|
18474
|
+
decisions: ["g"]
|
|
18475
|
+
},
|
|
18476
|
+
{
|
|
18477
|
+
verb: "fix",
|
|
18478
|
+
form: "verb",
|
|
18479
|
+
opener: "(fix:",
|
|
18480
|
+
kinds: ["fix"],
|
|
18481
|
+
args: "handles-text",
|
|
18482
|
+
thread: true,
|
|
18483
|
+
minText: 12,
|
|
18484
|
+
lowering: [
|
|
18485
|
+
{ target: P, writes: [{ from: P, edge: "SOLVED_BY", to: S }], note: "closes the Problem; a note \u226512 chars mints the Solution" },
|
|
18486
|
+
{ target: "Vulnerability", writes: [{ from: "Vulnerability", edge: "SOLVED_BY", to: S }] },
|
|
18487
|
+
{ target: RC, writes: [], note: "dropped: 'fix tag went nowhere' (not a Problem); no tag writes FIXED_BY", decision: "f" }
|
|
18488
|
+
],
|
|
18489
|
+
examples: ["fix", "fixThread"],
|
|
18490
|
+
hint: "one fix per tag: (fix:[its-handle]) or (fix:#thread what you changed) \u2014 put the cause in its own (cause: \u2026)",
|
|
18491
|
+
taught: "taught",
|
|
18492
|
+
decisions: ["f"]
|
|
18493
|
+
},
|
|
18494
|
+
{
|
|
18495
|
+
verb: "cause",
|
|
18496
|
+
form: "verb",
|
|
18497
|
+
opener: "(cause:",
|
|
18498
|
+
kinds: ["triage"],
|
|
18499
|
+
args: "handles-text",
|
|
18500
|
+
thread: true,
|
|
18501
|
+
minText: 8,
|
|
18502
|
+
lowering: [
|
|
18503
|
+
{ target: RC, writes: TRIAGE_TO_RC },
|
|
18504
|
+
{ target: P, writes: [{ from: P, edge: "TRIAGED_BY", to: "Triage" }, { from: "Triage", edge: "INDICATES", to: RC }, { from: P, edge: "CAUSED_BY", to: RC }], note: "(cause:[problem] mechanism) \u2014 the cited Problem is the symptom; the mechanism mints the RootCause" },
|
|
18505
|
+
{ target: S, writes: [{ from: P, edge: "TRIAGED_BY", to: "Triage" }, { from: "Triage", edge: "INDICATES", to: S }], decision: "b", knownViolation: { edge: "INDICATES", finding: "(cause:[solution]) writes a refused INDICATES \u2192 Solution" } }
|
|
18506
|
+
],
|
|
18507
|
+
examples: ["triage", "triageExplain", "triageMint", "causeThread"],
|
|
18508
|
+
hint: "(cause: the mechanism you'd change) or (cause:[root-cause-handle]); bind a distant symptom with (cause:#thread \u2026)",
|
|
18509
|
+
taught: "taught",
|
|
18510
|
+
decisions: ["b"]
|
|
18511
|
+
},
|
|
18512
|
+
{
|
|
18513
|
+
verb: "constraint",
|
|
18514
|
+
form: "verb",
|
|
18515
|
+
opener: "(constraint:",
|
|
18516
|
+
kinds: ["constraint"],
|
|
18517
|
+
args: "text",
|
|
18518
|
+
thread: false,
|
|
18519
|
+
minText: 8,
|
|
18520
|
+
textRequired: true,
|
|
18521
|
+
lowering: [{ target: P, writes: [], note: "mints a constraint-kind Problem" }],
|
|
18522
|
+
examples: ["constraint"],
|
|
18523
|
+
hint: "(constraint: the limitation that forced the decision)",
|
|
18524
|
+
taught: "taught"
|
|
18525
|
+
},
|
|
18526
|
+
{
|
|
18527
|
+
verb: "tried",
|
|
18528
|
+
form: "verb",
|
|
18529
|
+
opener: "(tried:",
|
|
18530
|
+
kinds: ["attempt"],
|
|
18531
|
+
args: "text",
|
|
18532
|
+
thread: true,
|
|
18533
|
+
minText: 8,
|
|
18534
|
+
textRequired: true,
|
|
18535
|
+
lowering: [{ target: P, writes: [], note: "journals an attempt on the bound problem" }],
|
|
18536
|
+
examples: ["tried"],
|
|
18537
|
+
hint: "(tried: the approach) \u2014 bind with (tried:#thread \u2026)",
|
|
18538
|
+
taught: "taught"
|
|
18539
|
+
},
|
|
18540
|
+
{
|
|
18541
|
+
verb: "failed",
|
|
18542
|
+
form: "verb",
|
|
18543
|
+
opener: "(failed:",
|
|
18544
|
+
kinds: ["failure"],
|
|
18545
|
+
args: "handles-text",
|
|
18546
|
+
thread: true,
|
|
18547
|
+
minText: 8,
|
|
18548
|
+
textRequired: true,
|
|
18549
|
+
lowering: [
|
|
18550
|
+
{ target: P, writes: [], note: "journals a failed attempt on the bound problem" },
|
|
18551
|
+
{ target: S, writes: [], note: "(failed:[h]) refutes the cited prior (contradictionPressure); skips the label gate today", decision: "j" }
|
|
18552
|
+
],
|
|
18553
|
+
examples: ["failed", "failedCite"],
|
|
18554
|
+
hint: "(failed: what didn't work); (failed:[solution] what came back) refutes a shown fix",
|
|
18555
|
+
taught: "taught",
|
|
18556
|
+
decisions: ["j"]
|
|
18557
|
+
},
|
|
18558
|
+
{
|
|
18559
|
+
verb: "instance",
|
|
18560
|
+
form: "verb",
|
|
18561
|
+
opener: "(instance:",
|
|
18562
|
+
kinds: ["instance"],
|
|
18563
|
+
args: "handles",
|
|
18564
|
+
thread: false,
|
|
18565
|
+
handleRequired: true,
|
|
18566
|
+
lowering: INSTANCE_LOWERING,
|
|
18567
|
+
examples: ["instance"],
|
|
18568
|
+
hint: "(instance:[h1],[h2],[h3]) \u2014 ~3 DIFFERENT shown priors this problem instantiates; handles only",
|
|
18569
|
+
taught: "taught",
|
|
18570
|
+
decisions: ["a", "e"]
|
|
18571
|
+
},
|
|
18572
|
+
{
|
|
18573
|
+
verb: "pattern",
|
|
18574
|
+
form: "verb",
|
|
18575
|
+
opener: "(pattern:",
|
|
18576
|
+
kinds: ["pattern"],
|
|
18577
|
+
args: "handle-or-text",
|
|
18578
|
+
thread: false,
|
|
18579
|
+
minText: 3,
|
|
18580
|
+
lowering: [{ target: "Pattern", writes: [{ from: P, edge: "INSTANCE_OF", to: "Pattern" }], note: "a handle must be a Pattern; free text resolves-or-mints one" }],
|
|
18581
|
+
examples: ["pattern"],
|
|
18582
|
+
hint: "(pattern: name the general shape) or (pattern:[shown-pattern])",
|
|
18583
|
+
taught: "taught"
|
|
18584
|
+
},
|
|
18585
|
+
{
|
|
18586
|
+
verb: "domain",
|
|
18587
|
+
form: "verb",
|
|
18588
|
+
opener: "(domain:",
|
|
18589
|
+
kinds: ["domain"],
|
|
18590
|
+
args: "text",
|
|
18591
|
+
thread: false,
|
|
18592
|
+
minText: 2,
|
|
18593
|
+
textRequired: true,
|
|
18594
|
+
lowering: [{ target: "Domain", writes: [{ from: P, edge: "PERTAIN_TO", to: "Domain" }], note: '(domain:#t X) mints a Domain named "#t X" today', decision: "k" }],
|
|
18595
|
+
examples: ["domain"],
|
|
18596
|
+
hint: "(domain: The Area) \u2014 Title Case, no thread",
|
|
18597
|
+
taught: "taught",
|
|
18598
|
+
decisions: ["k"]
|
|
18599
|
+
},
|
|
18600
|
+
{
|
|
18601
|
+
verb: "package",
|
|
18602
|
+
form: "verb",
|
|
18603
|
+
opener: "(package:",
|
|
18604
|
+
kinds: ["package"],
|
|
18605
|
+
args: "text",
|
|
18606
|
+
thread: false,
|
|
18607
|
+
minText: 2,
|
|
18608
|
+
textRequired: true,
|
|
18609
|
+
lowering: [{ target: "Package", writes: [{ from: P, edge: "DEPENDS_ON", to: "Package" }], note: "means 'concerns', written as DEPENDS_ON", decision: "c" }],
|
|
18610
|
+
examples: ["package"],
|
|
18611
|
+
hint: "(package: the-package-name) \u2014 the public package it's about",
|
|
18612
|
+
taught: "taught",
|
|
18613
|
+
decisions: ["c"]
|
|
18614
|
+
},
|
|
18615
|
+
{
|
|
18616
|
+
verb: "component",
|
|
18617
|
+
form: "verb",
|
|
18618
|
+
opener: "(component:",
|
|
18619
|
+
kinds: ["component"],
|
|
18620
|
+
args: "text",
|
|
18621
|
+
thread: false,
|
|
18622
|
+
minText: 2,
|
|
18623
|
+
textRequired: true,
|
|
18624
|
+
lowering: [{ target: "Component", writes: [{ from: P, edge: "CONCERNS", to: "Component" }] }],
|
|
18625
|
+
examples: ["component"],
|
|
18626
|
+
hint: "(component: The Component) \u2014 the framework/product unit",
|
|
18627
|
+
taught: "taught"
|
|
18628
|
+
},
|
|
18629
|
+
{
|
|
18630
|
+
verb: "aids",
|
|
18631
|
+
form: "verb",
|
|
18632
|
+
opener: "(aids:",
|
|
18633
|
+
kinds: ["transfer"],
|
|
18634
|
+
args: "handles",
|
|
18635
|
+
thread: true,
|
|
18636
|
+
handleRequired: true,
|
|
18637
|
+
lowering: [{ target: P, writes: [{ from: S, edge: "MAY_RESOLVE", to: P }], note: "source = the Solution in scope; non-Problem targets are skipped" }],
|
|
18638
|
+
examples: ["aids"],
|
|
18639
|
+
hint: "(aids:[problem-handle],\u2026) \u2014 other shown problems your fix might also resolve",
|
|
18640
|
+
taught: "taught"
|
|
18641
|
+
},
|
|
18642
|
+
{
|
|
18643
|
+
verb: "builds-on",
|
|
18644
|
+
form: "verb",
|
|
18645
|
+
opener: "(builds-on:",
|
|
18646
|
+
kinds: ["builds-on"],
|
|
18647
|
+
args: "handles",
|
|
18648
|
+
thread: true,
|
|
18649
|
+
handleRequired: true,
|
|
18650
|
+
lowering: [{ target: S, writes: [{ from: S, edge: "BUILDS_ON", to: S }] }],
|
|
18651
|
+
examples: ["buildsOn"],
|
|
18652
|
+
hint: "(builds-on:[shown-solution]) \u2014 your fix layers on it",
|
|
18653
|
+
taught: "taught",
|
|
18654
|
+
taughtBy: "linkBullet instruction text"
|
|
18655
|
+
},
|
|
18656
|
+
{
|
|
18657
|
+
verb: "supersedes",
|
|
18658
|
+
form: "verb",
|
|
18659
|
+
opener: "(supersedes:",
|
|
18660
|
+
kinds: ["supersedes"],
|
|
18661
|
+
args: "handles",
|
|
18662
|
+
thread: true,
|
|
18663
|
+
handleRequired: true,
|
|
18664
|
+
lowering: [{ target: S, writes: [{ from: S, edge: "SUPERSEDES", to: S }] }],
|
|
18665
|
+
examples: ["supersedes"],
|
|
18666
|
+
hint: "(supersedes:[shown-solution]) \u2014 your fix replaces it",
|
|
18667
|
+
taught: "taught",
|
|
18668
|
+
taughtBy: "linkBullet instruction text"
|
|
18669
|
+
},
|
|
18670
|
+
{
|
|
18671
|
+
verb: "alternative",
|
|
18672
|
+
form: "verb",
|
|
18673
|
+
opener: "(alternative:",
|
|
18674
|
+
kinds: ["alternative"],
|
|
18675
|
+
args: "handles",
|
|
18676
|
+
thread: true,
|
|
18677
|
+
handleRequired: true,
|
|
18678
|
+
lowering: [{ target: S, writes: [{ from: S, edge: "ALTERNATIVE_TO", to: S }] }],
|
|
18679
|
+
examples: ["alternative"],
|
|
18680
|
+
hint: "(alternative:[shown-solution]) \u2014 a different valid approach",
|
|
18681
|
+
taught: "taught",
|
|
18682
|
+
taughtBy: "linkBullet instruction text"
|
|
18683
|
+
},
|
|
18684
|
+
{
|
|
18685
|
+
verb: "confirm",
|
|
18686
|
+
form: "verb",
|
|
18687
|
+
opener: "(confirm:",
|
|
18688
|
+
kinds: ["confirm"],
|
|
18689
|
+
args: "handles",
|
|
18690
|
+
thread: false,
|
|
18691
|
+
handleRequired: true,
|
|
18692
|
+
lowering: [{ target: S, writes: [], note: "corroboration witness (corroborationCount), no edge" }],
|
|
18693
|
+
examples: ["confirm"],
|
|
18694
|
+
hint: "(confirm:[shown-prior]) \u2014 it held",
|
|
18695
|
+
taught: "taught",
|
|
18696
|
+
taughtBy: "verdictBullet + context render",
|
|
18697
|
+
decisions: ["j"]
|
|
18698
|
+
},
|
|
18699
|
+
{
|
|
18700
|
+
verb: "refute",
|
|
18701
|
+
form: "verb",
|
|
18702
|
+
opener: "(refute:",
|
|
18703
|
+
kinds: ["refute"],
|
|
18704
|
+
args: "handles-text",
|
|
18705
|
+
thread: false,
|
|
18706
|
+
minText: 4,
|
|
18707
|
+
handleRequired: true,
|
|
18708
|
+
textRequired: true,
|
|
18709
|
+
lowering: [{ target: S, writes: [], note: "contradiction witness (contradictionPressure), no edge; reason stays local" }],
|
|
18710
|
+
examples: ["refute"],
|
|
18711
|
+
hint: "(refute:[shown-prior] one line why) \u2014 the reason is required",
|
|
18712
|
+
taught: "taught",
|
|
18713
|
+
taughtBy: "verdictBullet + context render",
|
|
18714
|
+
decisions: ["j"]
|
|
18715
|
+
}
|
|
18716
|
+
];
|
|
18717
|
+
TAG_FENCES = [
|
|
18718
|
+
{
|
|
18719
|
+
fence: "errata-problem",
|
|
18720
|
+
fields: ["problem", "cause", "fix", "anchor", "kind"],
|
|
18721
|
+
required: [["problem"]],
|
|
18722
|
+
taught: "untaught",
|
|
18723
|
+
parser: "apps/daemon/src/turn.ts parseDesignFlags",
|
|
18724
|
+
decisions: ["h"],
|
|
18725
|
+
hint: "use an inline [!\u2026] flag instead (errata-problem cause ids never meet inline ids)"
|
|
18726
|
+
},
|
|
18727
|
+
{
|
|
18728
|
+
fence: "errata-resolved",
|
|
18729
|
+
fields: ["id", "problem", "fix", "disposition", "reason"],
|
|
18730
|
+
required: [["id", "problem"]],
|
|
18731
|
+
taught: "taught",
|
|
18732
|
+
taughtBy: "retract form only (TAG_EXAMPLE.retract); the fix form is untaught",
|
|
18733
|
+
parser: "apps/daemon/src/turn.ts parseDesignResolutions",
|
|
18734
|
+
hint: "```errata-resolved with id: and disposition: false_positive | invalid, reason: \u2026"
|
|
18735
|
+
},
|
|
18736
|
+
{
|
|
18737
|
+
fence: "errata-triage",
|
|
18738
|
+
fields: ["presenting", "cause", "test", "fix", "drift", "route"],
|
|
18739
|
+
required: [["presenting", "route"], ["cause", "test"]],
|
|
18740
|
+
taught: "taught",
|
|
18741
|
+
taughtBy: "MCP errata_triage tool copy",
|
|
18742
|
+
parser: "packages/local-graph/src/triage.ts parseTriageFences",
|
|
18743
|
+
hint: "```errata-triage with presenting: and cause: (or route: + test: to answer one)"
|
|
18744
|
+
},
|
|
18745
|
+
{
|
|
18746
|
+
fence: "errata-abstraction",
|
|
18747
|
+
fields: ["candidate", "principle", "covers"],
|
|
18748
|
+
required: [["candidate"], ["principle"], ["covers"]],
|
|
18749
|
+
taught: "taught",
|
|
18750
|
+
taughtBy: "MCP errata_pending_abstractions tool copy",
|
|
18751
|
+
parser: "packages/local-graph/src/abstraction.ts parseAbstractionFences",
|
|
18752
|
+
hint: "```errata-abstraction with candidate:, principle:, covers: (all required)"
|
|
18753
|
+
},
|
|
18754
|
+
{
|
|
18755
|
+
fence: "errata-intent",
|
|
18756
|
+
fields: ["intent"],
|
|
18757
|
+
required: [["intent"]],
|
|
18758
|
+
taught: "taught",
|
|
18759
|
+
parser: "packages/local-graph/src/intent.ts parseIntentFences",
|
|
18760
|
+
hint: "```errata-intent with intent: what you're about to do"
|
|
18761
|
+
},
|
|
18762
|
+
{
|
|
18763
|
+
fence: "errata-share",
|
|
18764
|
+
fields: ["priors"],
|
|
18765
|
+
required: [["priors"]],
|
|
18766
|
+
taught: "taught",
|
|
18767
|
+
taughtBy: "subagent hand-off copy",
|
|
18768
|
+
parser: "packages/local-graph/src/intent.ts parseShareFence",
|
|
18769
|
+
hint: "```errata-share with priors: all | [h1], [h2]"
|
|
18770
|
+
}
|
|
18771
|
+
];
|
|
18772
|
+
TAG_VERB_BY_NAME = new Map(
|
|
18773
|
+
TAG_VERBS.filter((v) => v.form === "verb").map((v) => [v.verb, v])
|
|
18774
|
+
);
|
|
18775
|
+
TAG_PAREN_VERBS = [...TAG_VERB_BY_NAME.keys()].sort((a, b) => b.length - a.length);
|
|
18776
|
+
TAG_GRAMMAR_OPENERS = [
|
|
18777
|
+
...new Set(TAG_VERBS.filter((v) => v.form !== "citation").map((v) => v.opener))
|
|
18778
|
+
];
|
|
18779
|
+
TAG_QUOTED_PAREN_SOURCE = String.raw`\(\s*(?:${TAG_PAREN_VERBS.map((v) => v.replace(/-/g, "\\-")).join("|")})\s*:|\(\[`;
|
|
18780
|
+
TAG_QUOTED_RE = new RegExp(String.raw`\[[!?]|` + TAG_QUOTED_PAREN_SOURCE, "i");
|
|
18781
|
+
TAG_QUOTED_PAREN_RE = new RegExp(TAG_QUOTED_PAREN_SOURCE, "i");
|
|
18782
|
+
TEMPLATE_VERB_GROUP = new RegExp(
|
|
18783
|
+
String.raw`\(\s*(${TAG_PAREN_VERBS.map((v) => v.replace(/-/g, "\\-")).join("|")})\s*:((?:[^()\n]|\([^()\n]*\))*)\)`,
|
|
18784
|
+
"gi"
|
|
18785
|
+
);
|
|
18786
|
+
BRACKET_TOKEN = /\[([^\]\n]{1,80})\]/g;
|
|
18787
|
+
REAL_HANDLE_SHAPE = new RegExp(
|
|
18788
|
+
String.raw`^(?:[a-z0-9]+(?:-[a-z0-9]+)*-(?=[0-9a-f]{0,3}\d)[0-9a-f]{4}|(?:${TAG_CANONICAL_ID_PREFIXES.join("|")})_[0-9a-f]{6,})$`,
|
|
18789
|
+
"i"
|
|
18790
|
+
);
|
|
18791
|
+
TAG_TEMPLATES = deriveTagTemplates(tagGrammarCopy());
|
|
18792
|
+
VERB_WORDS_SOURCE = TAG_PAREN_VERBS.map((v) => v.replace(/-/g, "\\-")).join("|");
|
|
18793
|
+
JOINED_VERB = new RegExp(String.raw`[,;]\s*(?=(?:${VERB_WORDS_SOURCE})\s*:)`, "i");
|
|
18794
|
+
LEADING_VERB = new RegExp(String.raw`^\s*(${VERB_WORDS_SOURCE})\s*:`, "i");
|
|
18795
|
+
ANY_VERB_WORD = new RegExp(String.raw`\b(?:${VERB_WORDS_SOURCE})\s*:`, "gi");
|
|
18796
|
+
QUOTED_TAG_OPENER = new RegExp(String.raw`\(\s*(?:(${VERB_WORDS_SOURCE})\s*:|(?=\[))`, "gi");
|
|
18797
|
+
TAG_VERDICT_TOKENS = {
|
|
18798
|
+
confirm: (id) => TAG_EXAMPLES.confirm(id),
|
|
18799
|
+
refute: (id) => TAG_EXAMPLES.refute(id),
|
|
18800
|
+
failed: (id) => TAG_EXAMPLES.failedCite(id)
|
|
18801
|
+
};
|
|
18802
|
+
}
|
|
18803
|
+
});
|
|
18804
|
+
|
|
18208
18805
|
// ../../packages/local-shared/src/index.ts
|
|
18209
18806
|
var init_src2 = __esm({
|
|
18210
18807
|
"../../packages/local-shared/src/index.ts"() {
|
|
@@ -18218,6 +18815,7 @@ var init_src2 = __esm({
|
|
|
18218
18815
|
init_review();
|
|
18219
18816
|
init_anchorable();
|
|
18220
18817
|
init_sqlite_adapter();
|
|
18818
|
+
init_tag_grammar();
|
|
18221
18819
|
}
|
|
18222
18820
|
});
|
|
18223
18821
|
|
|
@@ -26743,7 +27341,7 @@ function renderSnapshot(s) {
|
|
|
26743
27341
|
lines.push(` - previously resolved as: ${g.closed.description.slice(0, 120)} \u2014 \`${g.closed.id}\``);
|
|
26744
27342
|
if (g.solution) {
|
|
26745
27343
|
lines.push(
|
|
26746
|
-
` - the fix on record: ${g.solution.description.slice(0, 120)} \u2014 \`${g.solution.id}\` \xB7 fix still holds \u2192
|
|
27344
|
+
` - the fix on record: ${g.solution.description.slice(0, 120)} \u2014 \`${g.solution.id}\` \xB7 fix still holds \u2192 ${TAG_VERDICT_TOKENS.confirm(g.solution.id)} \xB7 hitting it again \u2192 flag it (a second independent witness reopens the close)`
|
|
26747
27345
|
);
|
|
26748
27346
|
} else {
|
|
26749
27347
|
lines.push(
|
|
@@ -26840,7 +27438,7 @@ function renderSnapshot(s) {
|
|
|
26840
27438
|
` - still open \u2014 did this work settle it? fixed \u2192 (fix:[${h.id}]) \xB7 not a real problem \u2192 an \`errata-resolved\` block with \`id: ` + h.id + "`, `disposition: false_positive`, `reason: \u2026` \xB7 still open \u2192 say nothing"
|
|
26841
27439
|
);
|
|
26842
27440
|
} else if (h.verdict === "foreign") {
|
|
26843
|
-
lines.push(` - open in another membrane \u2014 not yours to close:
|
|
27441
|
+
lines.push(` - open in another membrane \u2014 not yours to close: ${TAG_VERDICT_TOKENS.confirm(h.id)} it held \xB7 ${TAG_VERDICT_TOKENS.refute(h.id)}`);
|
|
26844
27442
|
}
|
|
26845
27443
|
}
|
|
26846
27444
|
}
|
|
@@ -26911,7 +27509,7 @@ function renderSnapshot(s) {
|
|
|
26911
27509
|
lines.push(` - \u2713 ${p.description}`);
|
|
26912
27510
|
for (const s2 of w.priors.solutionsByProblem[p.id] ?? []) {
|
|
26913
27511
|
lines.push(
|
|
26914
|
-
` - fixed by: ${s2.description} \u2014 if that fix did NOT hold, refute it:
|
|
27512
|
+
` - fixed by: ${s2.description} \u2014 if that fix did NOT hold, refute it: \`${TAG_VERDICT_TOKENS.failed(s2.id)}\``
|
|
26915
27513
|
);
|
|
26916
27514
|
}
|
|
26917
27515
|
}
|
|
@@ -33885,7 +34483,7 @@ function linkBullet(ref) {
|
|
|
33885
34483
|
` \xB7 ${TAG_EXAMPLE.package()} \u2014 the PUBLIC package it's about, dependency or not`,
|
|
33886
34484
|
` \xB7 ${TAG_EXAMPLE.component()} \u2014 the framework/product unit`,
|
|
33887
34485
|
` \xB7 (aids:[${ref}],\u2026) \u2014 other problems your fix might also resolve (hypothesis)`,
|
|
33888
|
-
` \xB7 your fix vs a shown solution:
|
|
34486
|
+
` \xB7 your fix vs a shown solution: ${TAG_EXAMPLE.buildsOn(ref)} \xB7 ${TAG_EXAMPLE.supersedes(ref)} \xB7 ${TAG_EXAMPLE.alternative("h")} \u2014 pick one`
|
|
33889
34487
|
].join("\n");
|
|
33890
34488
|
}
|
|
33891
34489
|
function verdictBullet(ref) {
|
|
@@ -33916,75 +34514,13 @@ function buildAgentInstruction(opts = {}) {
|
|
|
33916
34514
|
tail
|
|
33917
34515
|
].join("\n");
|
|
33918
34516
|
}
|
|
33919
|
-
var TAG_EXAMPLE, TAG_OPENERS, GLOSS;
|
|
34517
|
+
var TAG_EXAMPLE, TAG_OPENERS, GLOSS, ALL_SIGNALS, TAG_TEMPLATES2;
|
|
33920
34518
|
var init_agent_signals = __esm({
|
|
33921
34519
|
"src/agent-signals.ts"() {
|
|
33922
34520
|
"use strict";
|
|
33923
|
-
|
|
33924
|
-
|
|
33925
|
-
|
|
33926
|
-
vulnerability: () => `[!vuln: who can do what; observed basis @ path:line]`,
|
|
33927
|
-
suspectedVulnerability: () => `[?vuln: consequence; missing check]`,
|
|
33928
|
-
vulnerabilityThread: () => `[!#v vuln: finding here]`,
|
|
33929
|
-
fix: (ref) => `(fix:[${ref}])`,
|
|
33930
|
-
// CONSTRAINT — the native capture path for a DIFFUSE problem (a constraint/tension/
|
|
33931
|
-
// conflict that shaped a decision). Free text, attaches to the decision sentence the
|
|
33932
|
-
// agent is already writing. Full rationale in the constraint note below + prior-tags.ts.
|
|
33933
|
-
constraint: () => `(constraint: the limitation that forced it)`,
|
|
33934
|
-
// TRIAGE — routes the problem/symptom in scope to its cause. `(cause:[handle])`
|
|
33935
|
-
// links to a cited RootCause/Solution node; `(cause: free text)` mints a RootCause
|
|
33936
|
-
// from the text. Harvested in prior-tags.ts → engine.ts (see the triage note below).
|
|
33937
|
-
triage: (ref) => `(cause:[${ref}])`,
|
|
33938
|
-
// Unlike a bare cause citation, this handle names the Problem being explained.
|
|
33939
|
-
triageExplain: (ref) => `(cause:[${ref}] the mechanism)`,
|
|
33940
|
-
// The MINT form — free-text cause that mints a RootCause. Prime-time surfacing
|
|
33941
|
-
// (recallForFile) pastes this next to an open Problem that has no cause yet, so the
|
|
33942
|
-
// diagnostic moment is cued when the agent is looking at the problem. Kept here so
|
|
33943
|
-
// the grammar can't drift from parseInlineTags' `(cause: …)` acceptance.
|
|
33944
|
-
triageMint: () => `(cause: why it happens)`,
|
|
33945
|
-
// THREAD forms — the witness-declared symptom↔cause/fix binding. A `#id` on the
|
|
33946
|
-
// flag names the diagnosis thread; the same `#id` on a later verb binds to it
|
|
33947
|
-
// explicitly (across sentences AND turns), replacing proximity guessing. Adjacent
|
|
33948
|
-
// tags never need one — the id is for diagnoses that unfold over distance.
|
|
33949
|
-
problemThread: () => `[!#slug one line on what's wrong]`,
|
|
33950
|
-
causeThread: () => `(cause:#slug the mechanism)`,
|
|
33951
|
-
fixThread: (thread = "slug") => `(fix:#${thread} what you changed)`,
|
|
33952
|
-
// ATTEMPT arc — what's being tried and what didn't work. A failed attempt is a
|
|
33953
|
-
// witnessed NEGATIVE result: it saves the next agent the same dead end.
|
|
33954
|
-
tried: () => `(tried: the approach you're attempting)`,
|
|
33955
|
-
failed: () => `(failed: what didn't work and the dead end it rules out)`,
|
|
33956
|
-
// LINK verbs (AC epic) — bind the problem in scope to CANONICAL priors and
|
|
33957
|
-
// abstractions. Multi-target by design: single links are weak; ~3 links to 3
|
|
33958
|
-
// DIFFERENT relevant priors is the target shape (see linkBullet).
|
|
33959
|
-
instance: (ref) => `(instance:[${ref}],[another],[a-third])`,
|
|
33960
|
-
pattern: () => `(pattern: name the general shape)`,
|
|
33961
|
-
// DOMAIN — the abstract area a problem is about; the concept layer an
|
|
33962
|
-
// anchor-less problem clusters on. Mints/resolves a Domain by name.
|
|
33963
|
-
domain: () => `(domain: The Area)`,
|
|
33964
|
-
// PACKAGE/COMPONENT — agent-named public anchors (OM-agent-anchors): the
|
|
33965
|
-
// package a problem is ABOUT (even when not a dependency) and the
|
|
33966
|
-
// framework/product-level unit it concerns. Public spine anchors → the
|
|
33967
|
-
// knowledge can cross to the collective.
|
|
33968
|
-
package: () => `(package: the-package-name)`,
|
|
33969
|
-
component: () => `(component: The Component)`,
|
|
33970
|
-
aids: (ref) => `(aids:[${ref}])`,
|
|
33971
|
-
// VERDICT (VS-verdict-tags) — a judgment on a SHOWN prior, distinct from leaning on it.
|
|
33972
|
-
// `confirm` rides the corroborate channel (it held); `refute` the contradict channel
|
|
33973
|
-
// (it's wrong / didn't hold) and REQUIRES a reason. This is the inline producer the
|
|
33974
|
-
// evidence channels lacked — refute sat dead (contradictionPressure 0) until now, while
|
|
33975
|
-
// lean-on corroboration lived, because only corroboration had an inline path. Grammar
|
|
33976
|
-
// single-sourced with parseInlineTags' CONFIRM_PREFIX/REFUTE_PREFIX.
|
|
33977
|
-
confirm: (ref) => `(confirm:[${ref}])`,
|
|
33978
|
-
refute: (ref) => `(refute:[${ref}] one line why)`,
|
|
33979
|
-
// RETRACT — "not a real problem": the errata-resolved block with a disposition
|
|
33980
|
-
// (parseDesignResolutions, turn.ts). No inline form exists; the block is the grammar.
|
|
33981
|
-
retract: (id) => ["```errata-resolved", `id: ${id}`, "disposition: false_positive", "reason: why it was never a real problem", "```"].join("\n")
|
|
33982
|
-
};
|
|
33983
|
-
TAG_OPENERS = [
|
|
33984
|
-
...new Set(
|
|
33985
|
-
Object.values(TAG_EXAMPLE).map((example) => /^(\([a-z][\w-]*:|\[[!?])/i.exec(example("x"))?.[1]?.toLowerCase()).filter((opener) => opener !== void 0)
|
|
33986
|
-
)
|
|
33987
|
-
];
|
|
34521
|
+
init_src2();
|
|
34522
|
+
TAG_EXAMPLE = TAG_EXAMPLES;
|
|
34523
|
+
TAG_OPENERS = TAG_GRAMMAR_OPENERS;
|
|
33988
34524
|
GLOSS = {
|
|
33989
34525
|
prior: "a shown prior helped, or you work in a primed language/package",
|
|
33990
34526
|
// "even in code you just wrote" names the implementation phase explicitly. Field
|
|
@@ -34021,6 +34557,12 @@ var init_agent_signals = __esm({
|
|
|
34021
34557
|
link: "the problem you flagged is an instance of priors/abstractions you can name \u2014 (instance:[h1],[h2],\u2026) / (pattern: \u2026) / (aids:[h]); rendered whole via linkBullet",
|
|
34022
34558
|
verdict: "you can judge a prior we SHOWED you \u2014 confirm it if it held, refute it (with why) if it didn't; rendered whole via verdictBullet"
|
|
34023
34559
|
};
|
|
34560
|
+
ALL_SIGNALS = ["prior", "problem", "vulnerability", "domain", "fix", "constraint", "triage", "attempt", "link", "verdict"];
|
|
34561
|
+
TAG_TEMPLATES2 = deriveTagTemplates([
|
|
34562
|
+
...tagGrammarCopy(),
|
|
34563
|
+
...["its-handle", "its-id"].map((referent) => buildAgentInstruction({ signals: ALL_SIGNALS, referent })),
|
|
34564
|
+
buildFileRecallInstruction()
|
|
34565
|
+
]);
|
|
34024
34566
|
}
|
|
34025
34567
|
});
|
|
34026
34568
|
|
|
@@ -35553,7 +36095,13 @@ function summaryFromDoc(doc, kind) {
|
|
|
35553
36095
|
}
|
|
35554
36096
|
if (verb !== null) return null;
|
|
35555
36097
|
const noun = clipped.replace(/^(?:the|a|an)\s+/i, "");
|
|
35556
|
-
|
|
36098
|
+
const head2 = noun.split(/[\s-]/, 1)[0].replace(/[.,;:!?]+$/, "");
|
|
36099
|
+
return tidy(`${lead(kind)} for ${isOrdinaryCapital(head2) ? noun.charAt(0).toLowerCase() + noun.slice(1) : noun}`);
|
|
36100
|
+
}
|
|
36101
|
+
function isOrdinaryCapital(word) {
|
|
36102
|
+
const contraction = /^([A-Za-z]+)['’]s$/.exec(word);
|
|
36103
|
+
if (contraction) return CONTRACTION_BASES.has(contraction[1].toLowerCase()) && /^[A-Z][a-z]*$/.test(contraction[1]);
|
|
36104
|
+
return /^[A-Z][a-z]+$/.test(word);
|
|
35557
36105
|
}
|
|
35558
36106
|
function summaryFromName(name2, kind) {
|
|
35559
36107
|
if (!NAME_DERIVED_ENABLED) return null;
|
|
@@ -35575,7 +36123,7 @@ function summaryCandidates(name2, kind, doc) {
|
|
|
35575
36123
|
if (fromName !== null && fromName !== fromDoc) candidates.push(fromName);
|
|
35576
36124
|
return candidates;
|
|
35577
36125
|
}
|
|
35578
|
-
var NAME_DERIVED_ENABLED, KIND_ARTICLE, lead, MAX_PAYLOAD_CHARS, DANGLING, VERBS, tidy, VERB_PHRASE_KINDS;
|
|
36126
|
+
var NAME_DERIVED_ENABLED, KIND_ARTICLE, lead, MAX_PAYLOAD_CHARS, DANGLING, VERBS, tidy, CONTRACTION_BASES, VERB_PHRASE_KINDS;
|
|
35579
36127
|
var init_derive_summary = __esm({
|
|
35580
36128
|
"src/derive-summary.ts"() {
|
|
35581
36129
|
"use strict";
|
|
@@ -35858,6 +36406,7 @@ var init_derive_summary = __esm({
|
|
|
35858
36406
|
"yield"
|
|
35859
36407
|
]);
|
|
35860
36408
|
tidy = (s) => s.replace(/\s+/g, " ").replace(/\s+([,.;:])/g, "$1").replace(/[\s,;:.]+$/, "").trim();
|
|
36409
|
+
CONTRACTION_BASES = /* @__PURE__ */ new Set(["it", "that", "this", "there", "here", "what", "who", "where", "when", "why", "how", "let", "he", "she"]);
|
|
35861
36410
|
VERB_PHRASE_KINDS = /* @__PURE__ */ new Set(["function", "method"]);
|
|
35862
36411
|
}
|
|
35863
36412
|
});
|
|
@@ -79553,26 +80102,14 @@ init_src5();
|
|
|
79553
80102
|
import { readFileSync as readFileSync18, writeFileSync as writeFileSync14 } from "node:fs";
|
|
79554
80103
|
var NEG = /n['']t|\b(?:not|never|no|none|neither|nor|unrelated|irrelevant|would|might|could|if)\b/i;
|
|
79555
80104
|
var CITE_GROUP_RE = /\(((?:[^()\n]|\([^()\n]*\)){1,200})\)/g;
|
|
79556
|
-
var HANDLE_RE2 =
|
|
79557
|
-
var PLACEHOLDER_HANDLES =
|
|
79558
|
-
"handle",
|
|
79559
|
-
"its-handle",
|
|
79560
|
-
"another",
|
|
79561
|
-
"a-third",
|
|
79562
|
-
"h",
|
|
79563
|
-
"h1",
|
|
79564
|
-
"h2",
|
|
79565
|
-
"id",
|
|
79566
|
-
"its-id",
|
|
79567
|
-
"a",
|
|
79568
|
-
"b"
|
|
79569
|
-
]);
|
|
80105
|
+
var HANDLE_RE2 = new RegExp(TAG_HANDLE_SOURCE, "gi");
|
|
80106
|
+
var PLACEHOLDER_HANDLES = TAG_PLACEHOLDER_HANDLES;
|
|
79570
80107
|
var isPlaceholderHandle = (h) => PLACEHOLDER_HANDLES.has(h.toLowerCase());
|
|
79571
80108
|
var FLAG_BODY_HANDLE_RE = /^(?:[a-z0-9]+(?:-[a-z0-9]+){2,}-(?=[0-9a-f]{0,3}\d)[0-9a-f]{4}|(?:pat|sol|drc|dcause|dfix|dprob|dvuln|prob|claim|err)_[0-9a-f]{6,})$/i;
|
|
79572
80109
|
var FIX_PREFIX = /^\s*fix:(?:#([a-z][\w-]{0,63}))?\s*/i;
|
|
79573
|
-
var CONSTRAINT_RE = /\(\s*constraint:\s*([^()\n]{8,}?)\s*\)/gi;
|
|
79574
80110
|
var CAUSE_PREFIX = /^\s*cause:(?:#([a-z][\w-]{0,63}))?\s*/i;
|
|
79575
80111
|
var NEST2_UNIT = String.raw`(?:[^()\n]|\((?:[^()\n]|\([^()\n]*\))*\))`;
|
|
80112
|
+
var CONSTRAINT_RE = new RegExp(String.raw`\(\s*constraint:\s*(${NEST2_UNIT}{8,}?)\s*\)`, "gi");
|
|
79576
80113
|
var FIX_LONG_RE = new RegExp(String.raw`\(\s*fix:(?:#([a-z][\w-]{0,63}))?\s*(${NEST2_UNIT}{12,}?)\s*\)`, "gi");
|
|
79577
80114
|
var CAUSE_LONG_RE = new RegExp(String.raw`\(\s*cause:(?:#([a-z][\w-]{0,63}))?\s*(${NEST2_UNIT}{8,}?)\s*\)`, "gi");
|
|
79578
80115
|
var CONFIRM_LONG_RE = new RegExp(String.raw`\(\s*confirm:\s*(${NEST2_UNIT}{4,}?)\s*\)`, "gi");
|
|
@@ -79588,7 +80125,7 @@ var BRACKETED_TOKEN_RE = /\[[^\]\n]{1,120}\]/;
|
|
|
79588
80125
|
var CONFIRM_PREFIX = /^\s*confirm:\s*/i;
|
|
79589
80126
|
var REFUTE_PREFIX = /^\s*refute:\s*/i;
|
|
79590
80127
|
var REFUTE_REASON_MIN = 4;
|
|
79591
|
-
var PATTERN_RE =
|
|
80128
|
+
var PATTERN_RE = new RegExp(String.raw`\(\s*pattern:\s*(${NEST2_UNIT}{3,}?)\s*\)`, "gi");
|
|
79592
80129
|
var DOMAIN_RE = /\(\s*domain:\s*([^()\n]{2,}?)\s*\)/gi;
|
|
79593
80130
|
var PACKAGE_RE = /\(\s*package:\s*([^()\n]{2,}?)\s*\)/gi;
|
|
79594
80131
|
var COMPONENT_RE = /\(\s*component:\s*([^()\n]{2,}?)\s*\)/gi;
|
|
@@ -79681,6 +80218,10 @@ function deriveFixRationale(sentence, startIdx, endIdx) {
|
|
|
79681
80218
|
if (before.length >= FIX_RATIONALE_MIN) return before;
|
|
79682
80219
|
return fixRationaleAfter(sentence, endIdx);
|
|
79683
80220
|
}
|
|
80221
|
+
var TAG_GROUP_OPENER_RE = new RegExp(
|
|
80222
|
+
TAG_OPENERS.filter((o) => o.startsWith("(")).map((o) => String.raw`\(\s*${o.slice(1, -1).replace(/-/g, "\\-")}\s*:`).join("|"),
|
|
80223
|
+
"gi"
|
|
80224
|
+
);
|
|
79684
80225
|
var LEADING_OPENER_RE = new RegExp(String.raw`^(?:${RESIDUAL_OPENER_RE.source})(?:#[a-z][\w-]{0,63})?\s*`, "i");
|
|
79685
80226
|
var WRAPPER_PAIRS = [["(", ")"], ["[", "]"]];
|
|
79686
80227
|
var LEADING_HANDLES_RE = /^(?:\[[a-z0-9][\w-]{0,80}\]\s*,?\s*)+/i;
|
|
@@ -79819,19 +80360,41 @@ function addTagDispositions(a, b) {
|
|
|
79819
80360
|
function parseInlineTags(text) {
|
|
79820
80361
|
return parseInlineTagsWithDispositions(text).tags;
|
|
79821
80362
|
}
|
|
80363
|
+
function tagGroupSpans(line) {
|
|
80364
|
+
const spans = [];
|
|
80365
|
+
let after = 0;
|
|
80366
|
+
for (const m of line.matchAll(TAG_GROUP_OPENER_RE)) {
|
|
80367
|
+
const start2 = m.index;
|
|
80368
|
+
if (start2 < after) continue;
|
|
80369
|
+
let depth = 0;
|
|
80370
|
+
const limit = Math.min(line.length, start2 + 4e3);
|
|
80371
|
+
for (let i2 = start2; i2 < limit; i2++) {
|
|
80372
|
+
if (line[i2] === "(") depth++;
|
|
80373
|
+
else if (line[i2] === ")" && --depth === 0) {
|
|
80374
|
+
spans.push({ start: start2, end: i2 + 1 });
|
|
80375
|
+
after = i2 + 1;
|
|
80376
|
+
break;
|
|
80377
|
+
}
|
|
80378
|
+
}
|
|
80379
|
+
}
|
|
80380
|
+
return spans;
|
|
80381
|
+
}
|
|
79822
80382
|
function* captureSentences(text) {
|
|
79823
80383
|
for (const line of text.split(/\n+/)) {
|
|
79824
80384
|
if (line.length > 2e4) {
|
|
79825
80385
|
yield line;
|
|
79826
80386
|
continue;
|
|
79827
80387
|
}
|
|
79828
|
-
const flags2 = [
|
|
80388
|
+
const flags2 = [
|
|
80389
|
+
...[...flagScanView(line).matchAll(new RegExp(FLAG_RE.source, FLAG_RE.flags))].map((m) => ({ start: m.index, end: m.index + m[0].length })),
|
|
80390
|
+
...tagGroupSpans(line)
|
|
80391
|
+
].sort((a, b) => a.start - b.start);
|
|
79829
80392
|
let flag = 0;
|
|
79830
80393
|
let start2 = 0;
|
|
79831
80394
|
for (const boundary of line.matchAll(/(?<=[.!?])\s+(?!\(fix:)/g)) {
|
|
79832
80395
|
const index = boundary.index;
|
|
79833
80396
|
while (flags2[flag] && flags2[flag].end <= index) flag++;
|
|
79834
|
-
if (flags2
|
|
80397
|
+
if (flags2.slice(flag).some((f) => f.start < index && index < f.end)) continue;
|
|
79835
80398
|
yield line.slice(start2, index);
|
|
79836
80399
|
start2 = index + boundary[0].length;
|
|
79837
80400
|
}
|
|
@@ -79850,22 +80413,28 @@ function parseInlineTagsWithDispositions(text) {
|
|
|
79850
80413
|
continue;
|
|
79851
80414
|
}
|
|
79852
80415
|
const seqStart = out2.length;
|
|
79853
|
-
const
|
|
79854
|
-
|
|
79855
|
-
|
|
80416
|
+
const original = raw2;
|
|
80417
|
+
const flagView = flagScanView(raw2);
|
|
80418
|
+
const flagSpans = [...flagView.matchAll(new RegExp(FLAG_RE.source, FLAG_RE.flags))].map((m) => [m.index, m.index + m[0].length]);
|
|
80419
|
+
const sentence = raw2.replace(/`[^`]*`/g, (m, at) => {
|
|
80420
|
+
if (!TAG_QUOTED_RE.test(m)) return m;
|
|
80421
|
+
if (!TAG_QUOTED_PAREN_RE.test(m)) {
|
|
79856
80422
|
dispositions.codeSpanNeutralized++;
|
|
79857
80423
|
return m;
|
|
79858
80424
|
}
|
|
80425
|
+
const inFlag = flagSpans.some(([a2, b]) => a2 < at && at < b);
|
|
80426
|
+
if (!inFlag && !/\[[!?]/.test(m) && !quotesOnlyTemplateTags(m, TAG_TEMPLATES2)) return m;
|
|
79859
80427
|
dispositions.codeSpanNeutralized++;
|
|
79860
|
-
return " ";
|
|
80428
|
+
return m.replace(/[()[\]]/g, " ");
|
|
79861
80429
|
});
|
|
79862
|
-
const sfield =
|
|
80430
|
+
const sfield = raw2.replace(/\s+/g, " ").trim().slice(0, 160);
|
|
79863
80431
|
const citeMatched = /* @__PURE__ */ new Set();
|
|
79864
|
-
const
|
|
80432
|
+
const codeOnly = [...sentence.matchAll(/`[^`]*`/g)].filter((m) => !TAG_QUOTED_PAREN_RE.test(m[0])).map((m) => [m.index, m.index + m[0].length]);
|
|
79865
80433
|
CITE_GROUP_RE.lastIndex = 0;
|
|
79866
80434
|
let g;
|
|
79867
80435
|
while ((g = CITE_GROUP_RE.exec(sentence)) !== null) {
|
|
79868
80436
|
citeMatched.add(g.index);
|
|
80437
|
+
if (codeOnly.some(([a2, b]) => a2 < g.index && g.index < b)) continue;
|
|
79869
80438
|
let content = g[1];
|
|
79870
80439
|
if (/^\s*pattern:/i.test(content)) continue;
|
|
79871
80440
|
if (/^\s*failed:/i.test(content)) continue;
|
|
@@ -79950,6 +80519,7 @@ function parseInlineTagsWithDispositions(text) {
|
|
|
79950
80519
|
let h;
|
|
79951
80520
|
let emittedHandle = false;
|
|
79952
80521
|
while ((h = HANDLE_RE2.exec(content)) !== null) {
|
|
80522
|
+
if (content[h.index + h[0].length] === "(") continue;
|
|
79953
80523
|
const handle2 = h[1] ?? h[2];
|
|
79954
80524
|
if (handle2 && isPlaceholderHandle(handle2)) {
|
|
79955
80525
|
dispositions.placeholderEcho++;
|
|
@@ -80055,10 +80625,9 @@ function parseInlineTagsWithDispositions(text) {
|
|
|
80055
80625
|
}
|
|
80056
80626
|
}
|
|
80057
80627
|
FLAG_RE.lastIndex = 0;
|
|
80058
|
-
const flagView = flagScanView(sentence);
|
|
80059
80628
|
let f;
|
|
80060
80629
|
while ((f = FLAG_RE.exec(flagView)) !== null) {
|
|
80061
|
-
f[3] =
|
|
80630
|
+
f[3] = original.slice(...f.indices[3]);
|
|
80062
80631
|
const flagThread = f[2];
|
|
80063
80632
|
const raw3 = f[3].trim();
|
|
80064
80633
|
if (/^vuln\b/i.test(raw3)) {
|
|
@@ -85217,7 +85786,7 @@ function createWatchBreaker(deps) {
|
|
|
85217
85786
|
}
|
|
85218
85787
|
|
|
85219
85788
|
// src/engine.ts
|
|
85220
|
-
var DAEMON_VERSION = true ? "2.0.22-dev.
|
|
85789
|
+
var DAEMON_VERSION = true ? "2.0.22-dev.4148" : "2.0.0-alpha.0";
|
|
85221
85790
|
var IGNORED_PATH = /[\\/](?:\.git|node_modules|\.errata|\.claude|\.codex|\.cursor|\.turbo|\.next|dist|coverage|test-results|playwright-report|__pycache__)(?:[\\/]|$)/;
|
|
85222
85791
|
var IGNORED_NOISE = /castalia\.db|eventlog\.sqlite|turn-cursors/;
|
|
85223
85792
|
var GIT_OP_MUTE_MS = 4e3;
|