@younndai/lyt 0.9.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.
Files changed (96) hide show
  1. package/LICENSE +200 -0
  2. package/NOTICE +23 -0
  3. package/README.md +117 -0
  4. package/dist/automator-bodies/arc-builder.d.ts +13 -0
  5. package/dist/automator-bodies/arc-builder.d.ts.map +1 -0
  6. package/dist/automator-bodies/arc-builder.js +34 -0
  7. package/dist/automator-bodies/arc-builder.js.map +1 -0
  8. package/dist/automator-bodies/index.d.ts +20 -0
  9. package/dist/automator-bodies/index.d.ts.map +1 -0
  10. package/dist/automator-bodies/index.js +32 -0
  11. package/dist/automator-bodies/index.js.map +1 -0
  12. package/dist/automator-bodies/lane-builder.d.ts +12 -0
  13. package/dist/automator-bodies/lane-builder.d.ts.map +1 -0
  14. package/dist/automator-bodies/lane-builder.js +34 -0
  15. package/dist/automator-bodies/lane-builder.js.map +1 -0
  16. package/dist/automator-bodies/metadata-filler.d.ts +34 -0
  17. package/dist/automator-bodies/metadata-filler.d.ts.map +1 -0
  18. package/dist/automator-bodies/metadata-filler.js +211 -0
  19. package/dist/automator-bodies/metadata-filler.js.map +1 -0
  20. package/dist/automator-run.d.ts +27 -0
  21. package/dist/automator-run.d.ts.map +1 -0
  22. package/dist/automator-run.js +137 -0
  23. package/dist/automator-run.js.map +1 -0
  24. package/dist/bench/graded-corpus.d.ts +5 -0
  25. package/dist/bench/graded-corpus.d.ts.map +1 -0
  26. package/dist/bench/graded-corpus.js +121 -0
  27. package/dist/bench/graded-corpus.js.map +1 -0
  28. package/dist/bench/invariant-corpus.d.ts +18 -0
  29. package/dist/bench/invariant-corpus.d.ts.map +1 -0
  30. package/dist/bench/invariant-corpus.js +181 -0
  31. package/dist/bench/invariant-corpus.js.map +1 -0
  32. package/dist/bench/ir-metrics.d.ts +33 -0
  33. package/dist/bench/ir-metrics.d.ts.map +1 -0
  34. package/dist/bench/ir-metrics.js +79 -0
  35. package/dist/bench/ir-metrics.js.map +1 -0
  36. package/dist/bench/latency-bench.d.ts +15 -0
  37. package/dist/bench/latency-bench.d.ts.map +1 -0
  38. package/dist/bench/latency-bench.js +68 -0
  39. package/dist/bench/latency-bench.js.map +1 -0
  40. package/dist/bench/latency-corpus.d.ts +4 -0
  41. package/dist/bench/latency-corpus.d.ts.map +1 -0
  42. package/dist/bench/latency-corpus.js +109 -0
  43. package/dist/bench/latency-corpus.js.map +1 -0
  44. package/dist/bench/pod-harness.d.ts +16 -0
  45. package/dist/bench/pod-harness.d.ts.map +1 -0
  46. package/dist/bench/pod-harness.js +127 -0
  47. package/dist/bench/pod-harness.js.map +1 -0
  48. package/dist/bench/run-bench.d.ts +20 -0
  49. package/dist/bench/run-bench.d.ts.map +1 -0
  50. package/dist/bench/run-bench.js +86 -0
  51. package/dist/bench/run-bench.js.map +1 -0
  52. package/dist/cli-automator-run.d.ts +7 -0
  53. package/dist/cli-automator-run.d.ts.map +1 -0
  54. package/dist/cli-automator-run.js +80 -0
  55. package/dist/cli-automator-run.js.map +1 -0
  56. package/dist/cli.d.ts +3 -0
  57. package/dist/cli.d.ts.map +1 -0
  58. package/dist/cli.js +161 -0
  59. package/dist/cli.js.map +1 -0
  60. package/dist/commands/bench.d.ts +3 -0
  61. package/dist/commands/bench.d.ts.map +1 -0
  62. package/dist/commands/bench.js +92 -0
  63. package/dist/commands/bench.js.map +1 -0
  64. package/dist/commands/capture.d.ts +4 -0
  65. package/dist/commands/capture.d.ts.map +1 -0
  66. package/dist/commands/capture.js +251 -0
  67. package/dist/commands/capture.js.map +1 -0
  68. package/dist/commands/init.d.ts +12 -0
  69. package/dist/commands/init.d.ts.map +1 -0
  70. package/dist/commands/init.js +741 -0
  71. package/dist/commands/init.js.map +1 -0
  72. package/dist/commands/primer.d.ts +3 -0
  73. package/dist/commands/primer.d.ts.map +1 -0
  74. package/dist/commands/primer.js +199 -0
  75. package/dist/commands/primer.js.map +1 -0
  76. package/dist/commands/reindex.d.ts +3 -0
  77. package/dist/commands/reindex.d.ts.map +1 -0
  78. package/dist/commands/reindex.js +105 -0
  79. package/dist/commands/reindex.js.map +1 -0
  80. package/dist/commands/search.d.ts +3 -0
  81. package/dist/commands/search.d.ts.map +1 -0
  82. package/dist/commands/search.js +224 -0
  83. package/dist/commands/search.js.map +1 -0
  84. package/dist/flows/heal.d.ts +29 -0
  85. package/dist/flows/heal.d.ts.map +1 -0
  86. package/dist/flows/heal.js +146 -0
  87. package/dist/flows/heal.js.map +1 -0
  88. package/dist/flows/init-bootstrap.d.ts +93 -0
  89. package/dist/flows/init-bootstrap.d.ts.map +1 -0
  90. package/dist/flows/init-bootstrap.js +561 -0
  91. package/dist/flows/init-bootstrap.js.map +1 -0
  92. package/dist/index.d.ts +11 -0
  93. package/dist/index.d.ts.map +1 -0
  94. package/dist/index.js +27 -0
  95. package/dist/index.js.map +1 -0
  96. package/package.json +81 -0
@@ -0,0 +1,181 @@
1
+ /*
2
+ * Copyright 2026 MARLINK TRADING SRL (YounndAI)
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ // Every figment shares a fixed authored-time so indexing is reproducible.
17
+ const TS = "created: 2026-01-01T00:00:00.000Z\nmodified: 2026-01-01T00:00:00.000Z";
18
+ export const INVARIANT_CORPUS = [
19
+ {
20
+ vault: "core",
21
+ notes: [
22
+ // INV-1 (V-F5): two off-topic notes tagged `turso` form a lane (tier-1);
23
+ // a third has `turso` heavily in the BODY but is NOT tagged turso (tier-2).
24
+ // The strong body hit must outrank the tag-only lane hits.
25
+ {
26
+ rel: "notes/turso-tag-a.md",
27
+ frontmatter: `${TS}\ntags: [turso]`,
28
+ body: "Meeting schedule and logistics for the offsite.",
29
+ },
30
+ {
31
+ rel: "notes/turso-tag-b.md",
32
+ frontmatter: `${TS}\ntags: [turso]`,
33
+ body: "Quarterly planning notes and roadmap review.",
34
+ },
35
+ {
36
+ rel: "notes/turso-body.md",
37
+ frontmatter: `${TS}\ntags: [database]`,
38
+ body: "turso turso turso turso turso embedded replica libsql on turso.",
39
+ },
40
+ // INV-2 (V-F11): a UNIQUE tag (one note → no lane). The token "singleton"
41
+ // appears ONLY as a tag, never in the body, so tags→FTS is the only path.
42
+ {
43
+ rel: "notes/unique.md",
44
+ frontmatter: `${TS}\ntags: [singleton]`,
45
+ body: "A standalone one-off note about miscellaneous topics.",
46
+ },
47
+ // INV-3 (hygiene): "espresso" lives ONLY inside a fenced code block, which
48
+ // FTS hygiene strips. A query for it must return zero hits.
49
+ {
50
+ rel: "notes/coffee-fence.md",
51
+ frontmatter: `${TS}\ntags: [coffee]`,
52
+ body: "Notes on tea and other beverages.\n\n```js\nfunction espresso() { return true; }\n```\n",
53
+ },
54
+ // INV-6 (arc primacy): an arc "Build Pipeline" with two members (tier-0).
55
+ // A separate body-only note must NOT displace the arc members from the top.
56
+ {
57
+ rel: "notes/arc-decl.md",
58
+ frontmatter: "t: arc-decl",
59
+ body: '@ARC rid=arc:build-pipeline\n | name="Build Pipeline"\n | category="ops"\n | last_touched:ts=2026-01-01T00:00:00.000Z\n',
60
+ },
61
+ {
62
+ rel: "notes/pipeline-m1.md",
63
+ frontmatter: `${TS}\narcs: [build-pipeline]`,
64
+ body: "Stage one of the rollout.",
65
+ },
66
+ {
67
+ rel: "notes/pipeline-m2.md",
68
+ frontmatter: `${TS}\narcs: [build-pipeline]`,
69
+ body: "Stage two of the rollout.",
70
+ },
71
+ {
72
+ rel: "notes/pipeline-body.md",
73
+ frontmatter: `${TS}\ntags: [misc]`,
74
+ body: "pipeline pipeline throughput and latency pipeline.",
75
+ },
76
+ ],
77
+ },
78
+ {
79
+ // INV-5 (vault-scope isolation): a second vault that ALSO matches "turso".
80
+ // A scope:vault search of `core` must never surface this note.
81
+ vault: "side",
82
+ notes: [
83
+ {
84
+ rel: "notes/turso-side.md",
85
+ frontmatter: `${TS}\ntags: [database]`,
86
+ body: "turso replication notes from the side vault.",
87
+ },
88
+ ],
89
+ },
90
+ ];
91
+ export async function runInvariants(pod) {
92
+ const results = [];
93
+ // INV-1 — V-F5: strong body hit outranks tag-only lane hits.
94
+ {
95
+ const res = await pod.search({ query: "turso", scope: "federation", limit: 20 });
96
+ const rankOf = (suffix) => res.results.findIndex((r) => r.figment_path.endsWith(suffix));
97
+ const body = rankOf("turso-body.md");
98
+ const tagA = rankOf("turso-tag-a.md");
99
+ const tagB = rankOf("turso-tag-b.md");
100
+ const passed = body >= 0 && tagA >= 0 && tagB >= 0 && body < tagA && body < tagB;
101
+ results.push({
102
+ id: "INV-1",
103
+ name: "V-F5 — strong body hit outranks tag-only lane hits",
104
+ passed,
105
+ detail: `query "turso": body#${body} vs tag-a#${tagA}, tag-b#${tagB} (body must rank first)`,
106
+ });
107
+ }
108
+ // INV-2 — V-F11: a unique tag (no lane) is still findable via tags→FTS.
109
+ {
110
+ const res = await pod.search({ query: "singleton", scope: "federation", limit: 20 });
111
+ const found = res.results.some((r) => r.figment_path.endsWith("unique.md"));
112
+ results.push({
113
+ id: "INV-2",
114
+ name: "V-F11 — unique tag is findable",
115
+ passed: found,
116
+ detail: `query "singleton": ${res.results.length} hit(s); unique.md ${found ? "found" : "MISSING"}`,
117
+ });
118
+ }
119
+ // INV-3 — hygiene: a term that lives only in a code fence is not indexed.
120
+ {
121
+ const res = await pod.search({ query: "espresso", scope: "federation", limit: 20 });
122
+ const passed = res.results.length === 0;
123
+ results.push({
124
+ id: "INV-3",
125
+ name: "Hygiene — code-fence term is not FTS-indexed",
126
+ passed,
127
+ detail: `query "espresso": expected 0 hits, got ${res.results.length}`,
128
+ });
129
+ }
130
+ // INV-5 — vault-scope isolation: scope:vault must not leak other vaults.
131
+ {
132
+ const res = await pod.search({
133
+ query: "turso",
134
+ scope: "vault",
135
+ scopeTarget: "core",
136
+ limit: 20,
137
+ });
138
+ const leaked = res.results.filter((r) => r.vault_name !== "core");
139
+ const passed = res.results.length > 0 && leaked.length === 0;
140
+ results.push({
141
+ id: "INV-5",
142
+ name: "Scope — vault scope does not leak other vaults",
143
+ passed,
144
+ detail: `scope=vault core "turso": ${res.results.length} hit(s), ${leaked.length} from other vaults`,
145
+ });
146
+ }
147
+ // INV-6 — arc primacy: tier-0 arc members keep the top under the blend.
148
+ {
149
+ const res = await pod.search({
150
+ query: "pipeline",
151
+ scope: "vault",
152
+ scopeTarget: "core",
153
+ limit: 20,
154
+ });
155
+ const top = res.results[0];
156
+ const passed = top !== undefined && top.tier === 0;
157
+ results.push({
158
+ id: "INV-6",
159
+ name: "Arc primacy — tier-0 arc members stay on top under the soft-tier blend",
160
+ passed,
161
+ detail: top === undefined
162
+ ? `query "pipeline": no results`
163
+ : `query "pipeline": top result tier=${top.tier} (expected 0)`,
164
+ });
165
+ }
166
+ // INV-4 — determinism: identical query → identical ranked results.
167
+ {
168
+ const a = await pod.search({ query: "turso", scope: "federation", limit: 20 });
169
+ const b = await pod.search({ query: "turso", scope: "federation", limit: 20 });
170
+ const key = (r) => JSON.stringify(r.results.map((x) => [x.figment_path, x.tier, x.confidence, x.blendedScore ?? null]));
171
+ const passed = key(a) === key(b);
172
+ results.push({
173
+ id: "INV-4",
174
+ name: "Determinism — identical query yields identical ranked results",
175
+ passed,
176
+ detail: passed ? "two runs identical (mod durationMs)" : "two runs DIFFERED",
177
+ });
178
+ }
179
+ return results;
180
+ }
181
+ //# sourceMappingURL=invariant-corpus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invariant-corpus.js","sourceRoot":"","sources":["../../src/bench/invariant-corpus.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import type { SearchResult } from "@younndai/lyt-vault";
2
+ export declare const NDCG_K = 10;
3
+ export declare function dcg(grades: readonly number[]): number;
4
+ export declare function round3(x: number): number;
5
+ export interface GradedQuery {
6
+ id: string;
7
+ query: string;
8
+ scope: "federation" | "vault" | "mesh";
9
+ scopeTarget?: string;
10
+ grades: Record<string, number>;
11
+ traps?: string[];
12
+ }
13
+ export interface GradedQueryScore {
14
+ id: string;
15
+ query: string;
16
+ nResults: number;
17
+ recall: number;
18
+ mrr: number;
19
+ ndcg: number;
20
+ pAt1: number;
21
+ trapHits: number;
22
+ }
23
+ export declare function scoreGradedQuery(q: GradedQuery, results: readonly SearchResult[]): GradedQueryScore;
24
+ export interface GradedAggregate {
25
+ queries: number;
26
+ ndcg: number;
27
+ recall: number;
28
+ mrr: number;
29
+ pAt1: number;
30
+ cleanliness: number;
31
+ }
32
+ export declare function aggregateGraded(scores: readonly GradedQueryScore[]): GradedAggregate;
33
+ //# sourceMappingURL=ir-metrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ir-metrics.d.ts","sourceRoot":"","sources":["../../src/bench/ir-metrics.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,eAAO,MAAM,MAAM,KAAK,CAAC;AAGzB,wBAAgB,GAAG,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAErD;AAED,wBAAgB,MAAM,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAExC;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,YAAY,GAAG,OAAO,GAAG,MAAM,CAAC;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAE/B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,gBAAgB,CAC9B,CAAC,EAAE,WAAW,EACd,OAAO,EAAE,SAAS,YAAY,EAAE,GAC/B,gBAAgB,CAiDlB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IAEb,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,gBAAgB,EAAE,GAAG,eAAe,CAYpF"}
@@ -0,0 +1,79 @@
1
+ /*
2
+ * Copyright 2026 MARLINK TRADING SRL (YounndAI)
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ export const NDCG_K = 10;
17
+ // dcg = Σ (2^grade − 1) / log2(rank + 1) — matches ir-scorer.mjs:54.
18
+ export function dcg(grades) {
19
+ return grades.reduce((acc, g, i) => acc + (Math.pow(2, g) - 1) / Math.log2(i + 2), 0);
20
+ }
21
+ export function round3(x) {
22
+ return Number.isFinite(x) ? Number(x.toFixed(3)) : 0;
23
+ }
24
+ export function scoreGradedQuery(q, results) {
25
+ const relevantSuffixes = Object.keys(q.grades);
26
+ const gradeOf = (path) => {
27
+ for (const suffix of relevantSuffixes) {
28
+ if (path.endsWith(suffix))
29
+ return q.grades[suffix] ?? 0;
30
+ }
31
+ return 0;
32
+ };
33
+ // Dedup by figment path (keep first occurrence), preserving rank order.
34
+ const seen = new Set();
35
+ const ranked = [];
36
+ for (const r of results) {
37
+ if (seen.has(r.figment_path))
38
+ continue;
39
+ seen.add(r.figment_path);
40
+ ranked.push({ path: r.figment_path, grade: gradeOf(r.figment_path) });
41
+ }
42
+ const grades = ranked.map((x) => x.grade);
43
+ const retrievedRel = new Set(ranked
44
+ .filter((x) => x.grade >= 1)
45
+ .map((x) => relevantSuffixes.find((s) => x.path.endsWith(s)) ?? x.path));
46
+ const recall = relevantSuffixes.length ? retrievedRel.size / relevantSuffixes.length : 0;
47
+ const firstRelIdx = grades.findIndex((g) => g >= 1);
48
+ const mrr = firstRelIdx >= 0 ? 1 / (firstRelIdx + 1) : 0;
49
+ const idealGrades = relevantSuffixes.map((s) => q.grades[s] ?? 0).sort((a, b) => b - a);
50
+ const idcg = dcg(idealGrades.slice(0, NDCG_K));
51
+ const ndcg = idcg > 0 ? dcg(grades.slice(0, NDCG_K)) / idcg : 0;
52
+ const firstGrade = grades[0] ?? 0;
53
+ const pAt1 = firstGrade >= 1 ? 1 : 0;
54
+ const traps = q.traps ?? [];
55
+ const trapHits = ranked.filter((x) => traps.some((t) => x.path.endsWith(t))).length;
56
+ return {
57
+ id: q.id,
58
+ query: q.query,
59
+ nResults: results.length,
60
+ recall: round3(recall),
61
+ mrr: round3(mrr),
62
+ ndcg: round3(ndcg),
63
+ pAt1,
64
+ trapHits,
65
+ };
66
+ }
67
+ export function aggregateGraded(scores) {
68
+ const n = scores.length;
69
+ const mean = (sel) => n ? round3(scores.reduce((a, s) => a + sel(s), 0) / n) : 0;
70
+ return {
71
+ queries: n,
72
+ ndcg: mean((s) => s.ndcg),
73
+ recall: mean((s) => s.recall),
74
+ mrr: mean((s) => s.mrr),
75
+ pAt1: mean((s) => s.pAt1),
76
+ cleanliness: scores.reduce((a, s) => a + s.trapHits, 0),
77
+ };
78
+ }
79
+ //# sourceMappingURL=ir-metrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ir-metrics.js","sourceRoot":"","sources":["../../src/bench/ir-metrics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export declare const DEFAULT_LATENCY_COUNT = 1000;
2
+ export interface LatencyReport {
3
+ corpusSize: number;
4
+ indexMs: number;
5
+ querySamples: number;
6
+ queryP50Ms: number;
7
+ queryP95Ms: number;
8
+ queryMeanMs: number;
9
+ durationMs: number;
10
+ }
11
+ export interface RunLatencyOptions {
12
+ count?: number;
13
+ }
14
+ export declare function runLatencyBench(opts?: RunLatencyOptions): Promise<LatencyReport>;
15
+ //# sourceMappingURL=latency-bench.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"latency-bench.d.ts","sourceRoot":"","sources":["../../src/bench/latency-bench.ts"],"names":[],"mappings":"AA2BA,eAAO,MAAM,qBAAqB,OAAO,CAAC;AAG1C,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AASD,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,eAAe,CAAC,IAAI,GAAE,iBAAsB,GAAG,OAAO,CAAC,aAAa,CAAC,CAmC1F"}
@@ -0,0 +1,68 @@
1
+ /*
2
+ * Copyright 2026 MARLINK TRADING SRL (YounndAI)
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ // Lane V Workstream 2 — `lyt bench --latency` probe.
17
+ //
18
+ // Stands up a temp pod, seeds a synthetic corpus of `count` figments into one
19
+ // vault, times the all-tier reindex, then runs a fixed set of queries (repeated)
20
+ // and reports query-time p50/p95. The latency axis the quality self-test can't
21
+ // give (a review finding). On-demand — default count is modest; pass a larger --count for a
22
+ // federation-scale reading before any scale claim.
23
+ import { generateLatencyCorpus, LATENCY_PROBE_TERMS } from "./latency-corpus.js";
24
+ import { setupBenchPod } from "./pod-harness.js";
25
+ export const DEFAULT_LATENCY_COUNT = 1000;
26
+ const REPEATS = 3;
27
+ // Nearest-rank percentile over an ascending-sorted array.
28
+ function percentile(sortedAsc, p) {
29
+ if (sortedAsc.length === 0)
30
+ return 0;
31
+ const idx = Math.ceil((p / 100) * sortedAsc.length) - 1;
32
+ return sortedAsc[Math.min(sortedAsc.length - 1, Math.max(0, idx))] ?? 0;
33
+ }
34
+ export async function runLatencyBench(opts = {}) {
35
+ const startedAt = Date.now();
36
+ const corpusSize = Math.max(1, Math.floor(opts.count ?? DEFAULT_LATENCY_COUNT));
37
+ const pod = setupBenchPod();
38
+ try {
39
+ const seed = generateLatencyCorpus(corpusSize);
40
+ await pod.seedVault(seed.vault, seed.notes);
41
+ const indexStart = Date.now();
42
+ await pod.reindex(seed.vault);
43
+ const indexMs = Date.now() - indexStart;
44
+ const samples = [];
45
+ for (let r = 0; r < REPEATS; r++) {
46
+ for (const term of LATENCY_PROBE_TERMS) {
47
+ const t = Date.now();
48
+ await pod.search({ query: term, scope: "federation", limit: 20 });
49
+ samples.push(Date.now() - t);
50
+ }
51
+ }
52
+ const sorted = [...samples].sort((a, b) => a - b);
53
+ const mean = samples.length ? samples.reduce((a, b) => a + b, 0) / samples.length : 0;
54
+ return {
55
+ corpusSize,
56
+ indexMs,
57
+ querySamples: samples.length,
58
+ queryP50Ms: percentile(sorted, 50),
59
+ queryP95Ms: percentile(sorted, 95),
60
+ queryMeanMs: Math.round(mean),
61
+ durationMs: Date.now() - startedAt,
62
+ };
63
+ }
64
+ finally {
65
+ pod.teardown();
66
+ }
67
+ }
68
+ //# sourceMappingURL=latency-bench.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"latency-bench.js","sourceRoot":"","sources":["../../src/bench/latency-bench.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { VaultSeed } from "./invariant-corpus.js";
2
+ export declare const LATENCY_PROBE_TERMS: readonly string[];
3
+ export declare function generateLatencyCorpus(count: number): VaultSeed;
4
+ //# sourceMappingURL=latency-corpus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"latency-corpus.d.ts","sourceRoot":"","sources":["../../src/bench/latency-corpus.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AA8FvD,eAAO,MAAM,mBAAmB,EAAE,SAAS,MAAM,EAAW,CAAC;AAE7D,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAK9D"}
@@ -0,0 +1,109 @@
1
+ /*
2
+ * Copyright 2026 MARLINK TRADING SRL (YounndAI)
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ const TOPICS = [
17
+ "turso",
18
+ "libsql",
19
+ "replica",
20
+ "federation",
21
+ "yon",
22
+ "primer",
23
+ "lane",
24
+ "arc",
25
+ "rollup",
26
+ "vault",
27
+ "mesh",
28
+ "figment",
29
+ "index",
30
+ "decay",
31
+ "snapshot",
32
+ "edge",
33
+ ];
34
+ const ADJ = [
35
+ "embedded",
36
+ "local",
37
+ "remote",
38
+ "transitive",
39
+ "derived",
40
+ "cached",
41
+ "frozen",
42
+ "stale",
43
+ "fresh",
44
+ "scoped",
45
+ ];
46
+ const NOUN = [
47
+ "design",
48
+ "note",
49
+ "log",
50
+ "spec",
51
+ "probe",
52
+ "result",
53
+ "trace",
54
+ "plan",
55
+ "review",
56
+ "digest",
57
+ ];
58
+ // Fixed base instant — authored-time spread is deterministic per index.
59
+ const BASE_MS = Date.parse("2026-01-01T00:00:00.000Z");
60
+ const DAY_MS = 86_400_000;
61
+ function word(i, pool) {
62
+ return pool[i % pool.length] ?? pool[0];
63
+ }
64
+ // Small deterministic LCG so term frequency / body length vary without RNG.
65
+ function lcg(seed) {
66
+ return (seed * 1103515245 + 12345) & 0x7fffffff;
67
+ }
68
+ function makeNote(i) {
69
+ const topic = word(i, TOPICS);
70
+ const topic2 = word(i * 7 + 3, TOPICS);
71
+ const tag = word(i * 3, TOPICS);
72
+ const created = new Date(BASE_MS + (i % 150) * DAY_MS).toISOString();
73
+ const r = lcg(i);
74
+ const reps = 1 + (r % 6); // term frequency 1..6
75
+ const fillerLines = 2 + (lcg(r) % 8); // body length 2..9 paragraphs
76
+ const frontmatter = [
77
+ `title: ${word(i, ADJ)} ${topic} ${word(i, NOUN)} ${String(i).padStart(5, "0")}`,
78
+ `created: ${created}`,
79
+ `modified: ${created}`,
80
+ `tags: [${tag}, synthetic]`,
81
+ "purpose: latency-corpus filler.",
82
+ "topic: bench",
83
+ "mesh-visibility: local",
84
+ "weight: 3",
85
+ ].join("\n");
86
+ const lines = [
87
+ `This ${word(i, NOUN)} is about ${topic}. ` +
88
+ `${topic} `.repeat(reps).trim() +
89
+ ` It also touches ${topic2}.`,
90
+ ];
91
+ for (let k = 0; k < fillerLines; k++) {
92
+ lines.push(`Filler ${k}: ${word(i + k, ADJ)} ${word(i + k, NOUN)} regarding ${word(i + k, TOPICS)} and ${word(i + 2 * k, TOPICS)}.`);
93
+ }
94
+ return {
95
+ rel: `notes/syn-${String(i).padStart(5, "0")}.md`,
96
+ frontmatter,
97
+ body: lines.join("\n\n"),
98
+ };
99
+ }
100
+ // Topic terms present in the corpus — used by the latency probe as queries.
101
+ export const LATENCY_PROBE_TERMS = TOPICS;
102
+ export function generateLatencyCorpus(count) {
103
+ const n = Math.max(1, Math.floor(count));
104
+ const notes = [];
105
+ for (let i = 1; i <= n; i++)
106
+ notes.push(makeNote(i));
107
+ return { vault: "latency", notes };
108
+ }
109
+ //# sourceMappingURL=latency-corpus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"latency-corpus.js","sourceRoot":"","sources":["../../src/bench/latency-corpus.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { type SearchCascadeArgs, type SearchCascadeResult } from "@younndai/lyt-vault";
2
+ export interface BenchNote {
3
+ rel: string;
4
+ frontmatter: string;
5
+ body: string;
6
+ }
7
+ export declare const BENCH_NOW_ISO = "2026-06-01T00:00:00.000Z";
8
+ export interface BenchPod {
9
+ readonly home: string;
10
+ seedVault(name: string, notes: readonly BenchNote[]): Promise<void>;
11
+ reindex(name: string): Promise<void>;
12
+ search(args: SearchCascadeArgs): Promise<SearchCascadeResult>;
13
+ teardown(): void;
14
+ }
15
+ export declare function setupBenchPod(): BenchPod;
16
+ //# sourceMappingURL=pod-harness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pod-harness.d.ts","sourceRoot":"","sources":["../../src/bench/pod-harness.ts"],"names":[],"mappings":"AAkCA,OAAO,EAIL,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACzB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,WAAW,SAAS;IAExB,GAAG,EAAE,MAAM,CAAC;IAEZ,WAAW,EAAE,MAAM,CAAC;IAEpB,IAAI,EAAE,MAAM,CAAC;CACd;AAKD,eAAO,MAAM,aAAa,6BAA6B,CAAC;AAExD,MAAM,WAAW,QAAQ;IAEvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,SAAS,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEpE,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAErC,MAAM,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAE9D,QAAQ,IAAI,IAAI,CAAC;CAClB;AA8BD,wBAAgB,aAAa,IAAI,QAAQ,CA6DxC"}