@inerrata-corporation/errata 2.0.23 → 2.0.24-dev.5105

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.
@@ -14867,7 +14867,25 @@ function normalizeParam(v) {
14867
14867
  }
14868
14868
 
14869
14869
  // ../../packages/local-shared/src/tag-grammar.ts
14870
- var TAG_CANONICAL_ID_PREFIXES = ["pat", "sol", "drc", "dcause", "dfix", "dprob", "dvuln", "prob", "claim", "err"];
14870
+ var TAG_CANONICAL_ID_PREFIXES = [
14871
+ "motif_community_projn",
14872
+ "motif_community_orgn",
14873
+ "motif",
14874
+ "projn",
14875
+ "orgn",
14876
+ "dtri",
14877
+ "dom",
14878
+ "pat",
14879
+ "sol",
14880
+ "drc",
14881
+ "dcause",
14882
+ "dfix",
14883
+ "dprob",
14884
+ "dvuln",
14885
+ "prob",
14886
+ "claim",
14887
+ "err"
14888
+ ];
14871
14889
  var TAG_HANDLE_SOURCE = String.raw`\[([a-z0-9][\w-]{0,80})\]|((?:${TAG_CANONICAL_ID_PREFIXES.join("|")})_[0-9a-f]{6,})`;
14872
14890
  var TAG_THREAD_SOURCE = String.raw`#([a-z][\w-]{0,63})`;
14873
14891
  var TAG_PLACEHOLDER_HANDLES = /* @__PURE__ */ new Set([
@@ -16004,13 +16022,23 @@ function pageRankScale(ranks) {
16004
16022
  var DEMAND_HOT = Math.log1p(10);
16005
16023
  var DEMAND_WARM = Math.log1p(5);
16006
16024
 
16025
+ // ../../packages/math/src/reader-evidence.ts
16026
+ var FIELD_CODES = {
16027
+ a: "acceptedCount",
16028
+ c: "corroborationCount",
16029
+ f: "failureReportCount",
16030
+ p: "contradictionPressure"
16031
+ };
16032
+ var FIELDS = Object.values(FIELD_CODES);
16033
+
16007
16034
  // ../../packages/local-graph/src/node-select.ts
16008
16035
  var SELECT_INDEXES = [
16009
16036
  "nodes_live_local_community",
16010
16037
  "nodes_live_fold_candidate",
16011
16038
  "nodes_live_resolved",
16012
16039
  "nodes_live_fix_candidate",
16013
- "nodes_live_anchor_hint"
16040
+ "nodes_live_anchor_hint",
16041
+ "nodes_live_created_v2"
16014
16042
  ];
16015
16043
  var EMBEDDING_DIM_SQL = "(CASE WHEN length(embedding_blob) >= 4 THEN length(embedding_blob) / 4 ELSE COALESCE(json_array_length(embedding_json), 0) END)";
16016
16044
  var KEY = /^[A-Za-z_][A-Za-z0-9_]*(\.[A-Za-z_][A-Za-z0-9_]*)*$/;
@@ -16331,7 +16359,10 @@ CREATE UNIQUE INDEX IF NOT EXISTS edges_triple ON edges(from_id, type, to_id);
16331
16359
  `;
16332
16360
  var TEMPORAL_INDEX_SQL = `
16333
16361
  CREATE INDEX IF NOT EXISTS nodes_live ON nodes(label, valid_to);
16334
- CREATE INDEX IF NOT EXISTS nodes_live_count ON nodes(valid_to);
16362
+ -- Dropped: a prefix of nodes_live_page_rank (valid_to, page_rank), which serves
16363
+ -- the live count and the "any live node?" check as a covering index too. It was
16364
+ -- re-keyed on every close and revive: ~11 KB of a symbol flip's ~80 KB.
16365
+ DROP INDEX IF EXISTS nodes_live_count;
16335
16366
  -- Problems by recency (the only label read newest-first). Over every live row,
16336
16367
  -- each write that stamps last_updated_at moved a code symbol's entry from a
16337
16368
  -- scattered leaf: ~19 KB per position-only symbol rewrite on a 1.1 GB store.
@@ -16343,7 +16374,13 @@ CREATE INDEX IF NOT EXISTS nodes_live_problem_recent ON nodes(label, last_update
16343
16374
  -- walks nodes_live and reads every live row of the label to test created_at:
16344
16375
  -- 56 MB per guard on a 1.1 GB store, to learn there was nothing to do. valid_to
16345
16376
  -- is a key column so the planner prefers this over nodes_live (one more term).
16346
- CREATE INDEX IF NOT EXISTS nodes_live_created ON nodes(label, valid_to, created_at) WHERE valid_to IS NULL;
16377
+ -- last_updated_at rides along for errata.recent on code labels, which names this
16378
+ -- index: the filter runs on index entries, not on every row of the label (79 ms
16379
+ -- \u2192 3 ms for Function on a 1.1 GB store). It costs no extra writes: a close or
16380
+ -- revive already re-keys this index, and mergeNodeIfChanged leaves a symbol's
16381
+ -- last_updated_at alone when only its position moved.
16382
+ DROP INDEX IF EXISTS nodes_live_created;
16383
+ CREATE INDEX IF NOT EXISTS nodes_live_created_v2 ON nodes(label, valid_to, created_at, last_updated_at) WHERE valid_to IS NULL;
16347
16384
  -- Community members (the skills pull reads them twice per session boundary):
16348
16385
  -- ~15% of semantic nodes carry a localCommunity, and without this every live
16349
16386
  -- semantic row was read to find them (168 MB \u2192 18 MB per read).
@@ -16528,6 +16565,12 @@ function sameSqlValue(a, b) {
16528
16565
  if (a instanceof Uint8Array && b instanceof Uint8Array) return Buffer.compare(a, b) === 0;
16529
16566
  return false;
16530
16567
  }
16568
+ var POSITION_ATTRS = ["startByte", "endByte", "startRow"];
16569
+ function attrsJsonWithoutPositions(attrs) {
16570
+ const rest = { ...attrs };
16571
+ for (const k of POSITION_ATTRS) delete rest[k];
16572
+ return JSON.stringify(rest);
16573
+ }
16531
16574
  var PRIOR_TAG_MARKER = '"priorTag":true';
16532
16575
  var SqliteGraphStore = class {
16533
16576
  db;
@@ -16628,7 +16671,7 @@ var SqliteGraphStore = class {
16628
16671
  lastUpdatedOf: this.db.prepare("SELECT last_updated_at AS t, attrs_json FROM nodes WHERE id = ?"),
16629
16672
  labelOf: this.db.prepare("SELECT label FROM nodes WHERE id = ?"),
16630
16673
  nodeContent: this.db.prepare(
16631
- "SELECT label, description, extraction_confidence, extraction_source, stability, valid_to, attrs_json FROM nodes WHERE id = ?"
16674
+ "SELECT label, description, extraction_confidence, extraction_source, stability, valid_to, last_updated_at, attrs_json FROM nodes WHERE id = ?"
16632
16675
  ),
16633
16676
  edgeContent: this.db.prepare(
16634
16677
  "SELECT confidence, valid_to, attrs_json FROM edges WHERE from_id = ? AND type = ? AND to_id = ?"
@@ -17041,11 +17084,23 @@ var SqliteGraphStore = class {
17041
17084
  * rank, community, landmark, surprise, hits, tier and the vector belong to
17042
17085
  * the passes that compute them, and a skipped write leaves them as they are
17043
17086
  * where a merge would have reset them to the producer's defaults. Returns
17044
- * whether it wrote. */
17087
+ * whether it wrote.
17088
+ *
17089
+ * A live row whose only change is its position keeps its lastUpdatedAt, so
17090
+ * that stamp means "this symbol's content changed": what errata.recent lists
17091
+ * and the fix-candidate ask reads, and what lets nodes_live_created_v2 carry
17092
+ * it without being re-keyed by every edit above a symbol. A closed row is
17093
+ * always stamped: reviveReobserved reopens what this pass stamped. */
17045
17094
  mergeNodeIfChanged(node) {
17046
17095
  const row = this.stmts.nodeContent.get(node.id);
17047
- if (row && row.valid_to === null && row.label === node.label && row.description === node.description && row.extraction_confidence === node.extractionConfidence && row.stability === node.stability && !EXPOSURE_ATTRS.some((k) => node.attrs?.[k] !== void 0) && row.attrs_json === JSON.stringify(node.attrs ?? {})) return false;
17048
- this.mergeNode(node);
17096
+ if (!row || row.valid_to !== null || row.label !== node.label || row.description !== node.description || row.extraction_confidence !== node.extractionConfidence || row.stability !== node.stability || EXPOSURE_ATTRS.some((k) => node.attrs?.[k] !== void 0)) {
17097
+ this.mergeNode(node);
17098
+ return true;
17099
+ }
17100
+ const attrs = node.attrs ?? {};
17101
+ if (row.attrs_json === JSON.stringify(attrs)) return false;
17102
+ const moved = attrsJsonWithoutPositions(JSON.parse(row.attrs_json)) === attrsJsonWithoutPositions(attrs);
17103
+ this.mergeNode(moved ? { ...node, lastUpdatedAt: row.last_updated_at } : node);
17049
17104
  return true;
17050
17105
  }
17051
17106
  updateNode(id, patch) {
@@ -17125,8 +17180,8 @@ var SqliteGraphStore = class {
17125
17180
  stmt2 = this.db.prepare(
17126
17181
  // Ordered, not left to the planner: readers take "first row wins" (the
17127
17182
  // symbol lexicon's name winner and doc pick), and the order otherwise
17128
- // followed whichever partial index the planner chose. nodes_live_created
17129
- // serves this order without a sort.
17183
+ // followed whichever partial index the planner chose. nodes_live_created_v2
17184
+ // serves it, sorting rowids only within an equal created_at.
17130
17185
  `SELECT id, description, community, extraction_confidence${cols} FROM nodes WHERE label = ? AND valid_to IS NULL ORDER BY created_at, rowid`
17131
17186
  );
17132
17187
  this.fieldStmts.set(cacheKey, stmt2);
@@ -18019,6 +18074,20 @@ var CREDIT_FAMILY = [
18019
18074
  ...JUSTIFICATION_EDGES
18020
18075
  ];
18021
18076
 
18077
+ // ../../packages/embedding/src/bands.ts
18078
+ var DESIGNED_FOR_MINILM = {
18079
+ dedup: 0.88,
18080
+ softWriteMin: 0.8,
18081
+ bindMin: 0.78,
18082
+ nearMiss: 0.72,
18083
+ judgeMin: 0.5,
18084
+ predictionFloor: 0.5,
18085
+ relevanceFloor: 0.25,
18086
+ relatedWeak: 0.35,
18087
+ relatedStrong: 0.45
18088
+ };
18089
+ var UNKNOWN = { ...DESIGNED_FOR_MINILM, relevanceFloor: 0.5 };
18090
+
18022
18091
  // ../../packages/local-graph/src/design-problem.ts
18023
18092
  var RECURRENCE_DEBOUNCE_MS = 60 * 60 * 1e3;
18024
18093
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@inerrata-corporation/errata",
3
- "version": "2.0.23",
3
+ "version": "2.0.24-dev.5105",
4
4
  "description": "errata - local-first observation engine for AI coding agents",
5
5
  "type": "module",
6
6
  "bin": {
package/pass-worker.mjs CHANGED
@@ -16534,7 +16534,25 @@ var TAG_CANONICAL_ID_PREFIXES, TAG_HANDLE_SOURCE, TAG_THREAD_SOURCE, TAG_PLACEHO
16534
16534
  var init_tag_grammar = __esm({
16535
16535
  "../../packages/local-shared/src/tag-grammar.ts"() {
16536
16536
  "use strict";
16537
- TAG_CANONICAL_ID_PREFIXES = ["pat", "sol", "drc", "dcause", "dfix", "dprob", "dvuln", "prob", "claim", "err"];
16537
+ TAG_CANONICAL_ID_PREFIXES = [
16538
+ "motif_community_projn",
16539
+ "motif_community_orgn",
16540
+ "motif",
16541
+ "projn",
16542
+ "orgn",
16543
+ "dtri",
16544
+ "dom",
16545
+ "pat",
16546
+ "sol",
16547
+ "drc",
16548
+ "dcause",
16549
+ "dfix",
16550
+ "dprob",
16551
+ "dvuln",
16552
+ "prob",
16553
+ "claim",
16554
+ "err"
16555
+ ];
16538
16556
  TAG_HANDLE_SOURCE = String.raw`\[([a-z0-9][\w-]{0,80})\]|((?:${TAG_CANONICAL_ID_PREFIXES.join("|")})_[0-9a-f]{6,})`;
16539
16557
  TAG_THREAD_SOURCE = String.raw`#([a-z][\w-]{0,63})`;
16540
16558
  TAG_PLACEHOLDER_HANDLES = /* @__PURE__ */ new Set([
@@ -26976,13 +26994,23 @@ function pagerankLocal(input) {
26976
26994
  return { scores, iterations: iter, converged };
26977
26995
  }
26978
26996
 
26997
+ // ../../packages/math/src/reader-evidence.ts
26998
+ var FIELD_CODES = {
26999
+ a: "acceptedCount",
27000
+ c: "corroborationCount",
27001
+ f: "failureReportCount",
27002
+ p: "contradictionPressure"
27003
+ };
27004
+ var FIELDS = Object.values(FIELD_CODES);
27005
+
26979
27006
  // ../../packages/local-graph/src/node-select.ts
26980
27007
  var SELECT_INDEXES = [
26981
27008
  "nodes_live_local_community",
26982
27009
  "nodes_live_fold_candidate",
26983
27010
  "nodes_live_resolved",
26984
27011
  "nodes_live_fix_candidate",
26985
- "nodes_live_anchor_hint"
27012
+ "nodes_live_anchor_hint",
27013
+ "nodes_live_created_v2"
26986
27014
  ];
26987
27015
  var EMBEDDING_DIM_SQL = "(CASE WHEN length(embedding_blob) >= 4 THEN length(embedding_blob) / 4 ELSE COALESCE(json_array_length(embedding_json), 0) END)";
26988
27016
  var KEY = /^[A-Za-z_][A-Za-z0-9_]*(\.[A-Za-z_][A-Za-z0-9_]*)*$/;
@@ -27303,7 +27331,10 @@ CREATE UNIQUE INDEX IF NOT EXISTS edges_triple ON edges(from_id, type, to_id);
27303
27331
  `;
27304
27332
  var TEMPORAL_INDEX_SQL = `
27305
27333
  CREATE INDEX IF NOT EXISTS nodes_live ON nodes(label, valid_to);
27306
- CREATE INDEX IF NOT EXISTS nodes_live_count ON nodes(valid_to);
27334
+ -- Dropped: a prefix of nodes_live_page_rank (valid_to, page_rank), which serves
27335
+ -- the live count and the "any live node?" check as a covering index too. It was
27336
+ -- re-keyed on every close and revive: ~11 KB of a symbol flip's ~80 KB.
27337
+ DROP INDEX IF EXISTS nodes_live_count;
27307
27338
  -- Problems by recency (the only label read newest-first). Over every live row,
27308
27339
  -- each write that stamps last_updated_at moved a code symbol's entry from a
27309
27340
  -- scattered leaf: ~19 KB per position-only symbol rewrite on a 1.1 GB store.
@@ -27315,7 +27346,13 @@ CREATE INDEX IF NOT EXISTS nodes_live_problem_recent ON nodes(label, last_update
27315
27346
  -- walks nodes_live and reads every live row of the label to test created_at:
27316
27347
  -- 56 MB per guard on a 1.1 GB store, to learn there was nothing to do. valid_to
27317
27348
  -- is a key column so the planner prefers this over nodes_live (one more term).
27318
- CREATE INDEX IF NOT EXISTS nodes_live_created ON nodes(label, valid_to, created_at) WHERE valid_to IS NULL;
27349
+ -- last_updated_at rides along for errata.recent on code labels, which names this
27350
+ -- index: the filter runs on index entries, not on every row of the label (79 ms
27351
+ -- \u2192 3 ms for Function on a 1.1 GB store). It costs no extra writes: a close or
27352
+ -- revive already re-keys this index, and mergeNodeIfChanged leaves a symbol's
27353
+ -- last_updated_at alone when only its position moved.
27354
+ DROP INDEX IF EXISTS nodes_live_created;
27355
+ CREATE INDEX IF NOT EXISTS nodes_live_created_v2 ON nodes(label, valid_to, created_at, last_updated_at) WHERE valid_to IS NULL;
27319
27356
  -- Community members (the skills pull reads them twice per session boundary):
27320
27357
  -- ~15% of semantic nodes carry a localCommunity, and without this every live
27321
27358
  -- semantic row was read to find them (168 MB \u2192 18 MB per read).
@@ -27500,6 +27537,12 @@ function sameSqlValue(a, b) {
27500
27537
  if (a instanceof Uint8Array && b instanceof Uint8Array) return Buffer.compare(a, b) === 0;
27501
27538
  return false;
27502
27539
  }
27540
+ var POSITION_ATTRS = ["startByte", "endByte", "startRow"];
27541
+ function attrsJsonWithoutPositions(attrs) {
27542
+ const rest = { ...attrs };
27543
+ for (const k of POSITION_ATTRS) delete rest[k];
27544
+ return JSON.stringify(rest);
27545
+ }
27503
27546
  var PRIOR_TAG_MARKER = '"priorTag":true';
27504
27547
  var SqliteGraphStore = class {
27505
27548
  db;
@@ -27600,7 +27643,7 @@ var SqliteGraphStore = class {
27600
27643
  lastUpdatedOf: this.db.prepare("SELECT last_updated_at AS t, attrs_json FROM nodes WHERE id = ?"),
27601
27644
  labelOf: this.db.prepare("SELECT label FROM nodes WHERE id = ?"),
27602
27645
  nodeContent: this.db.prepare(
27603
- "SELECT label, description, extraction_confidence, extraction_source, stability, valid_to, attrs_json FROM nodes WHERE id = ?"
27646
+ "SELECT label, description, extraction_confidence, extraction_source, stability, valid_to, last_updated_at, attrs_json FROM nodes WHERE id = ?"
27604
27647
  ),
27605
27648
  edgeContent: this.db.prepare(
27606
27649
  "SELECT confidence, valid_to, attrs_json FROM edges WHERE from_id = ? AND type = ? AND to_id = ?"
@@ -28013,11 +28056,23 @@ var SqliteGraphStore = class {
28013
28056
  * rank, community, landmark, surprise, hits, tier and the vector belong to
28014
28057
  * the passes that compute them, and a skipped write leaves them as they are
28015
28058
  * where a merge would have reset them to the producer's defaults. Returns
28016
- * whether it wrote. */
28059
+ * whether it wrote.
28060
+ *
28061
+ * A live row whose only change is its position keeps its lastUpdatedAt, so
28062
+ * that stamp means "this symbol's content changed": what errata.recent lists
28063
+ * and the fix-candidate ask reads, and what lets nodes_live_created_v2 carry
28064
+ * it without being re-keyed by every edit above a symbol. A closed row is
28065
+ * always stamped: reviveReobserved reopens what this pass stamped. */
28017
28066
  mergeNodeIfChanged(node) {
28018
28067
  const row = this.stmts.nodeContent.get(node.id);
28019
- if (row && row.valid_to === null && row.label === node.label && row.description === node.description && row.extraction_confidence === node.extractionConfidence && row.stability === node.stability && !EXPOSURE_ATTRS.some((k) => node.attrs?.[k] !== void 0) && row.attrs_json === JSON.stringify(node.attrs ?? {})) return false;
28020
- this.mergeNode(node);
28068
+ if (!row || row.valid_to !== null || row.label !== node.label || row.description !== node.description || row.extraction_confidence !== node.extractionConfidence || row.stability !== node.stability || EXPOSURE_ATTRS.some((k) => node.attrs?.[k] !== void 0)) {
28069
+ this.mergeNode(node);
28070
+ return true;
28071
+ }
28072
+ const attrs = node.attrs ?? {};
28073
+ if (row.attrs_json === JSON.stringify(attrs)) return false;
28074
+ const moved = attrsJsonWithoutPositions(JSON.parse(row.attrs_json)) === attrsJsonWithoutPositions(attrs);
28075
+ this.mergeNode(moved ? { ...node, lastUpdatedAt: row.last_updated_at } : node);
28021
28076
  return true;
28022
28077
  }
28023
28078
  updateNode(id, patch) {
@@ -28097,8 +28152,8 @@ var SqliteGraphStore = class {
28097
28152
  stmt2 = this.db.prepare(
28098
28153
  // Ordered, not left to the planner: readers take "first row wins" (the
28099
28154
  // symbol lexicon's name winner and doc pick), and the order otherwise
28100
- // followed whichever partial index the planner chose. nodes_live_created
28101
- // serves this order without a sort.
28155
+ // followed whichever partial index the planner chose. nodes_live_created_v2
28156
+ // serves it, sorting rowids only within an equal created_at.
28102
28157
  `SELECT id, description, community, extraction_confidence${cols} FROM nodes WHERE label = ? AND valid_to IS NULL ORDER BY created_at, rowid`
28103
28158
  );
28104
28159
  this.fieldStmts.set(cacheKey, stmt2);
@@ -29130,10 +29185,12 @@ function crystallize(store2, opts = { ts: 0 }) {
29130
29185
  const s = support(c) + Math.max(0, sourcesCount(c) - 1);
29131
29186
  const f = contradictions;
29132
29187
  const confidence = (1 + s) / (2 + s + f);
29133
- store2.updateNode(c.id, {
29134
- attrs: { ...c.attrs, confidence },
29135
- lastUpdatedAt: opts.ts
29136
- });
29188
+ if (c.attrs["confidence"] !== confidence) {
29189
+ store2.updateNode(c.id, {
29190
+ attrs: { ...c.attrs, confidence },
29191
+ lastUpdatedAt: opts.ts
29192
+ });
29193
+ }
29137
29194
  const sup = support(c);
29138
29195
  let tier = c.memoryTier;
29139
29196
  if (sup >= PERSISTENT_SUPPORT && confidence >= PERSISTENT_CONFIDENCE) tier = "persistent";
@@ -29201,7 +29258,10 @@ function mergeTruthKind(a, b) {
29201
29258
  function markBoth(store2, a, b, patch, ts) {
29202
29259
  for (const n of [a, b]) {
29203
29260
  const fresh = store2.getNode(n.id);
29204
- store2.updateNode(n.id, { attrs: { ...fresh.attrs, ...patch }, lastUpdatedAt: ts });
29261
+ const next = { ...patch };
29262
+ if (fresh.attrs["revisit"] === true && fresh.attrs["revisitReason"] === next["revisitReason"]) delete next["revisitSinceTs"];
29263
+ if (Object.entries(next).every(([k, v]) => fresh.attrs[k] === v)) continue;
29264
+ store2.updateNode(n.id, { attrs: { ...fresh.attrs, ...next }, lastUpdatedAt: ts });
29205
29265
  }
29206
29266
  }
29207
29267
 
@@ -29392,6 +29452,20 @@ function backfillProblemContext(store2, ts) {
29392
29452
  return report;
29393
29453
  }
29394
29454
 
29455
+ // ../../packages/embedding/src/bands.ts
29456
+ var DESIGNED_FOR_MINILM = {
29457
+ dedup: 0.88,
29458
+ softWriteMin: 0.8,
29459
+ bindMin: 0.78,
29460
+ nearMiss: 0.72,
29461
+ judgeMin: 0.5,
29462
+ predictionFloor: 0.5,
29463
+ relevanceFloor: 0.25,
29464
+ relatedWeak: 0.35,
29465
+ relatedStrong: 0.45
29466
+ };
29467
+ var UNKNOWN = { ...DESIGNED_FOR_MINILM, relevanceFloor: 0.5 };
29468
+
29395
29469
  // ../../packages/local-graph/src/design-problem.ts
29396
29470
  init_src2();
29397
29471
 
@@ -30346,6 +30420,55 @@ var MECHANISMS = [
30346
30420
  effectCounter: "refutesStamped",
30347
30421
  note: "RG-mark; reason text is local-only (wire ships nodeId+witnessKey)"
30348
30422
  },
30423
+ {
30424
+ id: "confirm-local-stamp",
30425
+ what: "stamps a harvested confirm / leaned-on witness onto the LOCAL node (confirmedAt/confirmations)",
30426
+ pass: "capture",
30427
+ // The consumer is errata.search's one formula (apps/daemon one-search.ts
30428
+ // localEvidence → packages/math rankKnowledge reliability). Self-gated and
30429
+ // synthetic-gated at harvest, so a quiet counter can also mean every cite
30430
+ // was the session's own — the written-at-all bar, like refutedAt.
30431
+ fed: {
30432
+ labels: ["Problem", "Solution", "RootCause", "Pattern"],
30433
+ attr: "confirmedAt",
30434
+ minFraction: 0
30435
+ },
30436
+ effectCounter: "confirmsStamped",
30437
+ note: "consumed by one-search rankKnowledge; transport to cloud corroborationCount unchanged"
30438
+ },
30439
+ {
30440
+ id: "supersession-ask",
30441
+ what: "asks how a just-recorded fix relates to earlier fixes for the same symptom; the agent's answer mints SUPERSEDES/BUILDS_ON/ALTERNATIVE_TO",
30442
+ pass: "capture",
30443
+ // Conditional and rare (a fix landing beside earlier ones) — written-at-all
30444
+ // bar. The consumer is supersededBy in rankKnowledge (local lifecycle.ts,
30445
+ // cloud entry-rank.ts) and the superseded/held notes agents read.
30446
+ fed: {
30447
+ labels: ["Solution"],
30448
+ attr: "supersessionAskedAt",
30449
+ minFraction: 0
30450
+ },
30451
+ effectCounter: "structureLinksMinted",
30452
+ note: "the answer is the agent's; nothing is inferred"
30453
+ },
30454
+ {
30455
+ id: "held-ask",
30456
+ what: "asks a session whether a prior it leaned on held; the agent's confirm/refute answers it",
30457
+ pass: "capture",
30458
+ // Opened only by a lean-on cite of a prior the session did not mint —
30459
+ // written-at-all bar. The answers feed confirmedAt/refutedAt locally and
30460
+ // the cloud's corroborate/contradict channels (§5.4 α/β) — the contrastive
30461
+ // verdicts the FEP core needs (docs/reference/plans/fep-core.md §5.7).
30462
+ fed: {
30463
+ labels: ["Problem", "Solution", "RootCause", "Pattern"],
30464
+ attr: "heldAskedAt",
30465
+ minFraction: 0
30466
+ },
30467
+ // Counts only answers to questions a render actually SHOWED — a verdict the
30468
+ // agent would have given unasked does not prove the ask did anything.
30469
+ effectCounter: "heldAnswered",
30470
+ note: "asked, never inferred; the lean is provisional while asked and replaced by the answer; Network-only priors are asked by id"
30471
+ },
30349
30472
  {
30350
30473
  id: "regression-recognize",
30351
30474
  what: "marks a resolved problem as resolutionSuspect when it recurs at the door",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "errata-context",
3
- "version": "2.0.23",
3
+ "version": "2.0.24-dev.5105",
4
4
  "description": "A minimal 3D view of loaded Errata priors and recent graph bursts.",
5
5
  "author": {
6
6
  "name": "inErrata"
@@ -1,14 +1,14 @@
1
- 2f63c615dcb8381cd2e5eda37ba5bb8aa79e35c7f536e9bbbb9ff5ec18d36040 .codex-plugin/plugin.json
1
+ 65ef21d093ccff4f2ae34ab42cad7e42471cbea231b89d529258b2a52dd7a3ab .codex-plugin/plugin.json
2
2
  a7bebae9fb01c838d6c75fc784129e28be571233fa66ff5ee8039b574f35ccf7 assets/icon.png
3
3
  fc38b64e4df1e0b72c35764bef6c4c05430d97c9009ad0ecc8a9e75b4deab232 configure-local.mjs
4
- 73dc6028b3b070257c7c31f252d11e55a9e096f4aed0f187f10cb21716e1e6d7 dist/client.js
4
+ 80431e822def1ed5f5376ff0e67af30b4d26829572982e08fe24f438838f134c dist/client.js
5
5
  6d2d2068ffa7e6627151aa69e86654d1b3452e7205d75a15b312c1bc663d03d4 dist/index.html
6
- 1c5b4bdf92eca32629bf74003f711cf5bafebb5c9cf988ea068feb8da536457b dist/mcp-server.mjs
7
- fca26cc5a0ee1080a9f4aa1773b3e634ea7ff12376bbb66ea66ee3670dc5f274 dist/panel.html
6
+ aa0bb16795d53b70e0de3aad9dbe2d9d13aec1bbe7f7b10f2ad6d636c574e265 dist/mcp-server.mjs
7
+ 18146fb994a6e04a1078bed957061e8128be97e8e9e15a06f5a82192476e0b7c dist/panel.html
8
8
  ab99177aff0d134ef44f7867c61a7c4eb8a6afbb0f138c08dbb68e7546260147 dist/server.mjs
9
9
  5a721b645e399e676d48f8691ec81694172f1bbdea309c852dd099ef7a147018 dist/style.css
10
10
  2644953a4a3762926663db951c03ad3175061c9d52de49cf90d07ddb4c73846a INSTALL.md
11
11
  fb840ab74865258c91565529fa08f9f8586261f973c08a798e8f66d85d3260ed launch.mjs
12
12
  5abff6ef2aff3bc033862e2293421908e6d6fe9425de042412e0c8b577a6d8fc skills/context-graph/SKILL.md
13
13
  9f8d96a5a28248e04b54fdabed59319a640dead39ede67fe9b9283aec678d46f SUBMISSION.md
14
- 5852d66e82ac6aab92911ba375fa1a02f3ad853f498517e1d50cc0225aa67d66 THIRD-PARTY-NOTICES.md
14
+ 24b45b998aae358bcdfbd7569c7243efe494acaca7f89089bbd848b07fc4eefb THIRD-PARTY-NOTICES.md
@@ -251,7 +251,7 @@ the full license text.
251
251
 
252
252
  ---
253
253
 
254
- ## @modelcontextprotocol/sdk@1.29.0
254
+ ## @modelcontextprotocol/sdk@1.32.2
255
255
 
256
256
  LICENSE
257
257
  MIT License
@@ -996,6 +996,34 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
996
996
  SOFTWARE.
997
997
 
998
998
 
999
+ ---
1000
+
1001
+ ## eventsource-parser@3.1.1
1002
+
1003
+ LICENSE
1004
+ MIT License
1005
+
1006
+ Copyright (c) 2026 Espen Hovlandsdal <espen@hovlandsdal.com>
1007
+
1008
+ Permission is hereby granted, free of charge, to any person obtaining a copy
1009
+ of this software and associated documentation files (the "Software"), to deal
1010
+ in the Software without restriction, including without limitation the rights
1011
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
1012
+ copies of the Software, and to permit persons to whom the Software is
1013
+ furnished to do so, subject to the following conditions:
1014
+
1015
+ The above copyright notice and this permission notice shall be included in all
1016
+ copies or substantial portions of the Software.
1017
+
1018
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1019
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1020
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
1021
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1022
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
1023
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
1024
+ SOFTWARE.
1025
+
1026
+
999
1027
  ---
1000
1028
 
1001
1029
  ## eventsource@3.0.7