daftari 1.21.0 → 1.22.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.
- package/CHANGELOG.md +45 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +7 -0
- package/dist/cli.js.map +1 -1
- package/dist/consolidate/birth.d.ts +74 -0
- package/dist/consolidate/birth.d.ts.map +1 -0
- package/dist/consolidate/birth.js +253 -0
- package/dist/consolidate/birth.js.map +1 -0
- package/dist/consolidate/clocks.d.ts +15 -0
- package/dist/consolidate/clocks.d.ts.map +1 -0
- package/dist/consolidate/clocks.js +127 -0
- package/dist/consolidate/clocks.js.map +1 -0
- package/dist/consolidate/constants.d.ts +26 -0
- package/dist/consolidate/constants.d.ts.map +1 -0
- package/dist/consolidate/constants.js +83 -0
- package/dist/consolidate/constants.js.map +1 -0
- package/dist/consolidate/decorrelation.d.ts +69 -0
- package/dist/consolidate/decorrelation.d.ts.map +1 -0
- package/dist/consolidate/decorrelation.js +287 -0
- package/dist/consolidate/decorrelation.js.map +1 -0
- package/dist/consolidate/derivation-prompt.d.ts +28 -0
- package/dist/consolidate/derivation-prompt.d.ts.map +1 -0
- package/dist/consolidate/derivation-prompt.js +72 -0
- package/dist/consolidate/derivation-prompt.js.map +1 -0
- package/dist/consolidate/edge-write.d.ts +10 -0
- package/dist/consolidate/edge-write.d.ts.map +1 -0
- package/dist/consolidate/edge-write.js +76 -0
- package/dist/consolidate/edge-write.js.map +1 -0
- package/dist/consolidate/index.d.ts +2 -0
- package/dist/consolidate/index.d.ts.map +1 -0
- package/dist/consolidate/index.js +477 -0
- package/dist/consolidate/index.js.map +1 -0
- package/dist/consolidate/priority.d.ts +25 -0
- package/dist/consolidate/priority.d.ts.map +1 -0
- package/dist/consolidate/priority.js +103 -0
- package/dist/consolidate/priority.js.map +1 -0
- package/dist/consolidate/revision.d.ts +75 -0
- package/dist/consolidate/revision.d.ts.map +1 -0
- package/dist/consolidate/revision.js +232 -0
- package/dist/consolidate/revision.js.map +1 -0
- package/dist/consolidate/state.d.ts +10 -0
- package/dist/consolidate/state.d.ts.map +1 -0
- package/dist/consolidate/state.js +54 -0
- package/dist/consolidate/state.js.map +1 -0
- package/dist/curation/edges.d.ts +5 -0
- package/dist/curation/edges.d.ts.map +1 -1
- package/dist/curation/edges.js +82 -9
- package/dist/curation/edges.js.map +1 -1
- package/dist/curation/shadow.d.ts.map +1 -1
- package/dist/curation/shadow.js +10 -0
- package/dist/curation/shadow.js.map +1 -1
- package/dist/eval/llm.d.ts +3 -1
- package/dist/eval/llm.d.ts.map +1 -1
- package/dist/eval/llm.js +6 -2
- package/dist/eval/llm.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/storage/index-db.d.ts +1 -0
- package/dist/storage/index-db.d.ts.map +1 -1
- package/dist/storage/index-db.js +14 -9
- package/dist/storage/index-db.js.map +1 -1
- package/dist/utils/git.d.ts +1 -0
- package/dist/utils/git.d.ts.map +1 -1
- package/dist/utils/git.js +19 -0
- package/dist/utils/git.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,51 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [1.22.0] - 2026-06-17
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- **Cortex consolidation loop — Stage 2 (Component A).** The loop's read-side
|
|
15
|
+
curation engine, running `shadow_mode` + `ratify:false` by default (it proposes;
|
|
16
|
+
humans ratify), driven by `daftari consolidate --mode scan|birth|revision|both`.
|
|
17
|
+
- **Birth mode** — for an unprocessed doc, retrieve its top-K embedding
|
|
18
|
+
neighbors, judge whether a load-bearing derivation exists and in which
|
|
19
|
+
direction, and seed `k=0` candidate `derives_from` edges. The full top-K and
|
|
20
|
+
per-neighbor verdicts are logged to `.daftari/birth-trace.jsonl` for recall@K
|
|
21
|
+
evaluation.
|
|
22
|
+
- **Revision mode** — cast a panel of M independent votes on a due edge and
|
|
23
|
+
decide once by **majority**: majority-survives accrues strength (each
|
|
24
|
+
surviving vote observes on a distinct axis); majority-fails contests once
|
|
25
|
+
(revoke + tension); a tie surfaces without churning edge state.
|
|
26
|
+
- **Shadow mode** — edge writes route through `.daftari/shadow-actions.jsonl`
|
|
27
|
+
(calibration) with the durable `edges.jsonl` untouched; impact/blast/budget
|
|
28
|
+
are recorded per the §11.5 model.
|
|
29
|
+
- **Axis-decorrelation report** — `--report decorrelation --fixture <path>`
|
|
30
|
+
measures the elicitation prompt's direction-recovery accuracy on a
|
|
31
|
+
ground-truth fixture (PASS gate ≥ 85%).
|
|
32
|
+
|
|
33
|
+
- **Reliable `derives_from` edge direction (foundational-ordering).** Replaces the
|
|
34
|
+
brittle derives/depends token with a temperature-0 foundational-ordering
|
|
35
|
+
judgment (`{related, premise}`): which document is the load-bearing premise that
|
|
36
|
+
must be established first. Birth loads the neighbor's content and elicits the
|
|
37
|
+
direction in **both presentation orders**, committing a directed edge only when
|
|
38
|
+
the orders agree; genuinely-mutual or order-contested pairs become
|
|
39
|
+
direction-unconfirmed **pending edges** that stay visible as undirected
|
|
40
|
+
relationships but do not propagate triggers, plus an interpretive
|
|
41
|
+
direction-pending tension for human adjudication. Edge keys are canonical, so a
|
|
42
|
+
post-edit direction flip collapses to one symmetric edge rather than forking a
|
|
43
|
+
contradictory twin. Validated at 96–100% on curated clear-direction real-prose
|
|
44
|
+
pairs and 97.4% on the contamination-free decorrelation fixture.
|
|
45
|
+
|
|
46
|
+
### Changed
|
|
47
|
+
|
|
48
|
+
- **SQLite index schema bumped to v6** — adds `direction_verdict` to
|
|
49
|
+
`derives_from_edges`. The `.daftari/index.db` is ephemeral and rebuilds from the
|
|
50
|
+
markdown/JSONL on first open; no data migration.
|
|
51
|
+
- `daftari consolidate` gains exit code **7** (event-clock baseline unreachable —
|
|
52
|
+
the gap is re-baselined to HEAD and left to the backstop clock, surfaced as a
|
|
53
|
+
cron-alertable signal rather than a silent success).
|
|
54
|
+
|
|
10
55
|
## [1.21.0] - 2026-06-12
|
|
11
56
|
|
|
12
57
|
### Added
|
package/dist/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAuLA,wBAAsB,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA8DnE;AAED,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA6CvD"}
|
package/dist/cli.js
CHANGED
|
@@ -23,6 +23,7 @@ Usage:
|
|
|
23
23
|
daftari audit [options] Run a cross-repo coherence audit (see: daftari audit --help)
|
|
24
24
|
daftari eval [options] Cortex quality metric (see: daftari eval --help)
|
|
25
25
|
daftari backfill [options] Derive frontmatter for an existing wiki (see: daftari backfill --help)
|
|
26
|
+
daftari consolidate [options] Cortex loop scheduler — emit due/birth queues (see: daftari consolidate --help)
|
|
26
27
|
|
|
27
28
|
Server options:
|
|
28
29
|
--user <username> Identity the server runs as (default: guest)
|
|
@@ -51,6 +52,7 @@ const VAULT_GITIGNORE = `# Daftari rebuilds these from the markdown files — ne
|
|
|
51
52
|
.daftari/staged-actions.jsonl
|
|
52
53
|
.daftari/edges.jsonl
|
|
53
54
|
.daftari/shadow-actions.jsonl
|
|
55
|
+
.daftari/consolidate-state.json
|
|
54
56
|
# Transient backfill staging surface (daftari backfill --plan). The apply
|
|
55
57
|
# commit is the durable audit trail — the plan itself is never committed.
|
|
56
58
|
.daftari/backfill-plan.jsonl
|
|
@@ -224,6 +226,11 @@ export async function run(argv) {
|
|
|
224
226
|
process.exitCode = await runBackfill(argv.slice(1));
|
|
225
227
|
return;
|
|
226
228
|
}
|
|
229
|
+
if (argv[0] === "consolidate") {
|
|
230
|
+
const { runConsolidate } = await import("./consolidate/index.js");
|
|
231
|
+
process.exitCode = await runConsolidate(argv.slice(1));
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
227
234
|
if (argv.includes("--help") || argv.includes("-h")) {
|
|
228
235
|
process.stdout.write(USAGE);
|
|
229
236
|
return;
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,eAAe;AACf,EAAE;AACF,0DAA0D;AAC1D,0EAA0E;AAC1E,EAAE;AACF,4EAA4E;AAC5E,4EAA4E;AAC5E,0EAA0E;AAC1E,+BAA+B;AAE/B,OAAO,EACL,UAAU,EACV,SAAS,EACT,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAExC,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAErD,MAAM,KAAK,GAAG
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import type { DerivesFromEdge, ObserveEdgeInput } from "../curation/edges.js";
|
|
2
|
+
import type { TensionInput } from "../curation/tension.js";
|
|
3
|
+
import type { LlmClient } from "../eval/llm.js";
|
|
4
|
+
import { type Result } from "../frontmatter/types.js";
|
|
5
|
+
import { CONSOLIDATE_AGENT, type ConsolidatePromptTemplate } from "./constants.js";
|
|
6
|
+
import { type DerivationVerdict } from "./derivation-prompt.js";
|
|
7
|
+
export interface BirthDeps {
|
|
8
|
+
llm: LlmClient;
|
|
9
|
+
searchNeighbors: (docPath: string, k: number) => Promise<Result<string[], Error>>;
|
|
10
|
+
loadNeighborContent: (path: string) => Promise<Result<string, Error>>;
|
|
11
|
+
observe: (input: ObserveEdgeInput) => Promise<Result<DerivesFromEdge, Error>>;
|
|
12
|
+
recordTension: (input: TensionInput) => Promise<Result<unknown, Error>>;
|
|
13
|
+
recordBirthTrace: (row: BirthTraceRow) => Promise<Result<void, Error>>;
|
|
14
|
+
}
|
|
15
|
+
export interface BirthOpts {
|
|
16
|
+
vaultRoot: string;
|
|
17
|
+
agent: string;
|
|
18
|
+
axis: ConsolidatePromptTemplate;
|
|
19
|
+
budgetRemaining: number;
|
|
20
|
+
model: string;
|
|
21
|
+
}
|
|
22
|
+
export interface BirthVerdict {
|
|
23
|
+
neighbor: string;
|
|
24
|
+
related: boolean;
|
|
25
|
+
direction: "directed" | "symmetric" | "none";
|
|
26
|
+
premise: "doc" | "neighbor" | null;
|
|
27
|
+
reason: string;
|
|
28
|
+
}
|
|
29
|
+
export interface BirthVerdictError {
|
|
30
|
+
neighbor: string;
|
|
31
|
+
error: string;
|
|
32
|
+
}
|
|
33
|
+
export interface BirthTraceRow {
|
|
34
|
+
at: string;
|
|
35
|
+
docPath: string;
|
|
36
|
+
contentHash: string;
|
|
37
|
+
topK: string[];
|
|
38
|
+
axis: ConsolidatePromptTemplate;
|
|
39
|
+
model: string;
|
|
40
|
+
verdicts: Array<BirthVerdict | BirthVerdictError>;
|
|
41
|
+
}
|
|
42
|
+
export interface BirthOutcome {
|
|
43
|
+
docPath: string;
|
|
44
|
+
contentHash: string;
|
|
45
|
+
neighbors: string[];
|
|
46
|
+
verdicts: Array<BirthVerdict | BirthVerdictError>;
|
|
47
|
+
observations: Array<{
|
|
48
|
+
from: string;
|
|
49
|
+
to: string;
|
|
50
|
+
}>;
|
|
51
|
+
llmCalls: number;
|
|
52
|
+
inputTokens: number;
|
|
53
|
+
outputTokens: number;
|
|
54
|
+
traceWritten: boolean;
|
|
55
|
+
traceError?: string;
|
|
56
|
+
}
|
|
57
|
+
export type ReconcileOutcome = {
|
|
58
|
+
kind: "unrelated";
|
|
59
|
+
} | {
|
|
60
|
+
kind: "directed";
|
|
61
|
+
premise: "doc" | "neighbor";
|
|
62
|
+
} | {
|
|
63
|
+
kind: "symmetric";
|
|
64
|
+
contested: boolean;
|
|
65
|
+
};
|
|
66
|
+
export declare function reconcileDirection(order1: DerivationVerdict, order2: DerivationVerdict): ReconcileOutcome;
|
|
67
|
+
export declare function birthOne(doc: {
|
|
68
|
+
relPath: string;
|
|
69
|
+
content: string;
|
|
70
|
+
}, deps: BirthDeps, opts: BirthOpts): Promise<Result<BirthOutcome, Error>>;
|
|
71
|
+
export declare function birthTracePath(vaultRoot: string): string;
|
|
72
|
+
export declare function appendBirthTrace(vaultRoot: string, row: BirthTraceRow): Promise<Result<void, Error>>;
|
|
73
|
+
export { CONSOLIDATE_AGENT };
|
|
74
|
+
//# sourceMappingURL=birth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"birth.d.ts","sourceRoot":"","sources":["../../src/consolidate/birth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
// Birth mode (spec §4.0, brief item 1). For an unprocessed doc, retrieve its
|
|
2
|
+
// top-K embedding neighbors and ask the LLM — with a foundational-ordering
|
|
3
|
+
// prompt, both docs' content loaded — whether it has a load-bearing derivation
|
|
4
|
+
// with each neighbor and which is the premise; emit edge_observe for survivors,
|
|
5
|
+
// log the full top-K + outcomes to the birth trace for post-hoc recall@K
|
|
6
|
+
// evaluation, and return the content hash so the caller can advance
|
|
7
|
+
// `consolidate-state.json`'s birth-processed map.
|
|
8
|
+
//
|
|
9
|
+
// Direction is elicited in BOTH orders per neighbor (option c, design §3.1
|
|
10
|
+
// amendment): agreement ⇒ a trusted directed edge; an explicit `symmetric` or
|
|
11
|
+
// an order-disagreement ⇒ a canonical-sorted *pending* edge (premiseVote
|
|
12
|
+
// "symmetric", direction-unconfirmed) plus an interpretive tension for human
|
|
13
|
+
// adjudication. The gate showed ambiguous real-prose pairs return a confident
|
|
14
|
+
// but order-dependent direction rather than `symmetric`, so both orders are
|
|
15
|
+
// required to catch that.
|
|
16
|
+
//
|
|
17
|
+
// One pass per neighbor — NOT a panel (the panel is revision-mode, §4.1).
|
|
18
|
+
// Birth seeds k=0 candidates; subsequent revision passes earn strength.
|
|
19
|
+
import { createHash } from "node:crypto";
|
|
20
|
+
import { appendFileSync, mkdirSync } from "node:fs";
|
|
21
|
+
import { join, posix } from "node:path";
|
|
22
|
+
import { err, ok } from "../frontmatter/types.js";
|
|
23
|
+
import { CONSOLIDATE_AGENT } from "./constants.js";
|
|
24
|
+
import { DERIVATION_SYSTEM, DERIVATION_VERDICT_SCHEMA, derivationUserBody, parseDerivationVerdict, } from "./derivation-prompt.js";
|
|
25
|
+
// --- canonicalization --------------------------------------------------------
|
|
26
|
+
// Same canon() as src/consolidate/index.ts uses. Path-aliasing is the bug
|
|
27
|
+
// class that bit edge store + merge + Stage 1; every keyed boundary
|
|
28
|
+
// canonicalizes (memory: canonicalize-path-keys).
|
|
29
|
+
function canon(p) {
|
|
30
|
+
return posix.normalize(p).replace(/^\.\//, "");
|
|
31
|
+
}
|
|
32
|
+
// Map an order-1 verdict (A=doc, B=neighbor) to a real-world premise.
|
|
33
|
+
function realWorldPremise1(v) {
|
|
34
|
+
if (!v.related)
|
|
35
|
+
return "unrelated";
|
|
36
|
+
if (v.premise === "symmetric")
|
|
37
|
+
return "symmetric";
|
|
38
|
+
if (v.premise === "A")
|
|
39
|
+
return "doc";
|
|
40
|
+
if (v.premise === "B")
|
|
41
|
+
return "neighbor";
|
|
42
|
+
return "unrelated";
|
|
43
|
+
}
|
|
44
|
+
// Map an order-2 verdict (A=neighbor, B=doc) to a real-world premise.
|
|
45
|
+
function realWorldPremise2(v) {
|
|
46
|
+
if (!v.related)
|
|
47
|
+
return "unrelated";
|
|
48
|
+
if (v.premise === "symmetric")
|
|
49
|
+
return "symmetric";
|
|
50
|
+
if (v.premise === "A")
|
|
51
|
+
return "neighbor";
|
|
52
|
+
if (v.premise === "B")
|
|
53
|
+
return "doc";
|
|
54
|
+
return "unrelated";
|
|
55
|
+
}
|
|
56
|
+
// Reconcile both orders into a single edge decision. Conservative on existence
|
|
57
|
+
// (either order saying "unrelated" ⇒ no edge); any explicit symmetric ⇒ pending;
|
|
58
|
+
// agreement on the premise ⇒ directed; disagreement (one says doc, the other
|
|
59
|
+
// neighbor) ⇒ pending-contested.
|
|
60
|
+
export function reconcileDirection(order1, order2) {
|
|
61
|
+
const r1 = realWorldPremise1(order1);
|
|
62
|
+
const r2 = realWorldPremise2(order2);
|
|
63
|
+
if (r1 === "unrelated" || r2 === "unrelated")
|
|
64
|
+
return { kind: "unrelated" };
|
|
65
|
+
if (r1 === "symmetric" || r2 === "symmetric")
|
|
66
|
+
return { kind: "symmetric", contested: false };
|
|
67
|
+
if (r1 === r2)
|
|
68
|
+
return { kind: "directed", premise: r1 };
|
|
69
|
+
return { kind: "symmetric", contested: true };
|
|
70
|
+
}
|
|
71
|
+
// --- prompt input bounding ---------------------------------------------------
|
|
72
|
+
// Truncate doc content for the prompt. Birth doesn't need the whole doc —
|
|
73
|
+
// the central claim is usually in the first ~1500 chars; a longer corpus
|
|
74
|
+
// is calibration noise + cost. Tunable from constants if needed.
|
|
75
|
+
const MAX_DOC_CHARS = 1500;
|
|
76
|
+
function truncate(s) {
|
|
77
|
+
return s.length <= MAX_DOC_CHARS ? s : `${s.slice(0, MAX_DOC_CHARS)}\n…[truncated]`;
|
|
78
|
+
}
|
|
79
|
+
// A non-empty one-line claim snippet for the tension record (addTension rejects
|
|
80
|
+
// empty claims). Falls back to the path when the content is blank.
|
|
81
|
+
function claimSnippet(content, fallback) {
|
|
82
|
+
const line = content.split("\n").find((l) => l.trim().length > 0);
|
|
83
|
+
const snip = (line ?? "").trim().slice(0, 200);
|
|
84
|
+
return snip.length > 0 ? snip : `(no readable content: ${fallback})`;
|
|
85
|
+
}
|
|
86
|
+
// --- birth pass --------------------------------------------------------------
|
|
87
|
+
export async function birthOne(doc, deps, opts) {
|
|
88
|
+
const docPath = canon(doc.relPath);
|
|
89
|
+
const contentHash = createHash("sha256").update(doc.content).digest("hex").slice(0, 16);
|
|
90
|
+
const docContent = truncate(doc.content);
|
|
91
|
+
const neighborsRes = await deps.searchNeighbors(docPath, 20);
|
|
92
|
+
if (!neighborsRes.ok)
|
|
93
|
+
return neighborsRes;
|
|
94
|
+
const neighbors = neighborsRes.value.map(canon).filter((n) => n !== docPath);
|
|
95
|
+
const verdicts = [];
|
|
96
|
+
const observations = [];
|
|
97
|
+
let llmCalls = 0;
|
|
98
|
+
let inputTokens = 0;
|
|
99
|
+
let outputTokens = 0;
|
|
100
|
+
for (const neighbor of neighbors) {
|
|
101
|
+
// Each neighbor needs both orders; stop if we can't afford the pair.
|
|
102
|
+
if (llmCalls + 2 > opts.budgetRemaining)
|
|
103
|
+
break;
|
|
104
|
+
const nc = await deps.loadNeighborContent(neighbor);
|
|
105
|
+
if (!nc.ok) {
|
|
106
|
+
verdicts.push({ neighbor, error: `load failed: ${nc.error.message}` });
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
const neighborContent = truncate(nc.value);
|
|
110
|
+
// Order 1: DOC A = this doc, DOC B = neighbor.
|
|
111
|
+
const r1 = await deps.llm.completeJson({
|
|
112
|
+
model: opts.model,
|
|
113
|
+
system: DERIVATION_SYSTEM,
|
|
114
|
+
user: derivationUserBody(docPath, docContent, neighbor, neighborContent),
|
|
115
|
+
schema: DERIVATION_VERDICT_SCHEMA,
|
|
116
|
+
temperature: 0,
|
|
117
|
+
});
|
|
118
|
+
llmCalls++;
|
|
119
|
+
if (!r1.ok) {
|
|
120
|
+
verdicts.push({ neighbor, error: r1.error.message });
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
inputTokens += r1.value.input_tokens;
|
|
124
|
+
outputTokens += r1.value.output_tokens;
|
|
125
|
+
const p1 = parseDerivationVerdict(r1.value.parsed);
|
|
126
|
+
if (!p1.ok) {
|
|
127
|
+
verdicts.push({ neighbor, error: p1.error.message });
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
// Order 2: DOC A = neighbor, DOC B = this doc.
|
|
131
|
+
const r2 = await deps.llm.completeJson({
|
|
132
|
+
model: opts.model,
|
|
133
|
+
system: DERIVATION_SYSTEM,
|
|
134
|
+
user: derivationUserBody(neighbor, neighborContent, docPath, docContent),
|
|
135
|
+
schema: DERIVATION_VERDICT_SCHEMA,
|
|
136
|
+
temperature: 0,
|
|
137
|
+
});
|
|
138
|
+
llmCalls++;
|
|
139
|
+
if (!r2.ok) {
|
|
140
|
+
verdicts.push({ neighbor, error: r2.error.message });
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
inputTokens += r2.value.input_tokens;
|
|
144
|
+
outputTokens += r2.value.output_tokens;
|
|
145
|
+
const p2 = parseDerivationVerdict(r2.value.parsed);
|
|
146
|
+
if (!p2.ok) {
|
|
147
|
+
verdicts.push({ neighbor, error: p2.error.message });
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
const outcome = reconcileDirection(p1.value, p2.value);
|
|
151
|
+
const reason = p1.value.reason;
|
|
152
|
+
if (outcome.kind === "unrelated") {
|
|
153
|
+
verdicts.push({ neighbor, related: false, direction: "none", premise: null, reason });
|
|
154
|
+
continue;
|
|
155
|
+
}
|
|
156
|
+
if (outcome.kind === "directed") {
|
|
157
|
+
// Premise is materialized on `to` (clocks: from depends on to). doc-premise
|
|
158
|
+
// ⇒ to=doc, from=neighbor; neighbor-premise ⇒ to=neighbor, from=doc.
|
|
159
|
+
const [from, to] = outcome.premise === "doc" ? [neighbor, docPath] : [docPath, neighbor];
|
|
160
|
+
verdicts.push({
|
|
161
|
+
neighbor,
|
|
162
|
+
related: true,
|
|
163
|
+
direction: "directed",
|
|
164
|
+
premise: outcome.premise,
|
|
165
|
+
reason,
|
|
166
|
+
});
|
|
167
|
+
const obs = await deps.observe({
|
|
168
|
+
fromPath: from,
|
|
169
|
+
toPath: to,
|
|
170
|
+
observedBy: opts.agent,
|
|
171
|
+
blind: true,
|
|
172
|
+
axis: "prompt",
|
|
173
|
+
premiseVote: "to",
|
|
174
|
+
note: `birth: ${reason}`,
|
|
175
|
+
});
|
|
176
|
+
if (!obs.ok) {
|
|
177
|
+
verdicts.push({ neighbor, error: `observe failed: ${obs.error.message}` });
|
|
178
|
+
continue;
|
|
179
|
+
}
|
|
180
|
+
observations.push({ from, to });
|
|
181
|
+
continue;
|
|
182
|
+
}
|
|
183
|
+
// symmetric — a canonical-sorted pending edge (direction unconfirmed) so
|
|
184
|
+
// re-observation lands on the same key, plus an interpretive tension.
|
|
185
|
+
const [from, to] = [docPath, neighbor].sort();
|
|
186
|
+
const which = outcome.contested ? "contested" : "mutual";
|
|
187
|
+
verdicts.push({ neighbor, related: true, direction: "symmetric", premise: null, reason });
|
|
188
|
+
const obs = await deps.observe({
|
|
189
|
+
fromPath: from,
|
|
190
|
+
toPath: to,
|
|
191
|
+
observedBy: opts.agent,
|
|
192
|
+
blind: true,
|
|
193
|
+
axis: "prompt",
|
|
194
|
+
premiseVote: "symmetric",
|
|
195
|
+
note: `birth/symmetric(${which}): ${reason}`,
|
|
196
|
+
});
|
|
197
|
+
if (!obs.ok) {
|
|
198
|
+
verdicts.push({ neighbor, error: `observe failed: ${obs.error.message}` });
|
|
199
|
+
continue;
|
|
200
|
+
}
|
|
201
|
+
observations.push({ from, to });
|
|
202
|
+
const tension = await deps.recordTension({
|
|
203
|
+
title: `direction-pending (${which}): ${from} ↔ ${to}`,
|
|
204
|
+
kind: "interpretive",
|
|
205
|
+
sourceA: docPath,
|
|
206
|
+
claimA: claimSnippet(doc.content, docPath),
|
|
207
|
+
sourceB: neighbor,
|
|
208
|
+
claimB: claimSnippet(nc.value, neighbor),
|
|
209
|
+
loggedBy: opts.agent,
|
|
210
|
+
});
|
|
211
|
+
if (!tension.ok) {
|
|
212
|
+
verdicts.push({ neighbor, error: `tension failed: ${tension.error.message}` });
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
const traceRes = await deps.recordBirthTrace({
|
|
216
|
+
at: new Date().toISOString().replace(/\.\d{3}Z$/, "Z"),
|
|
217
|
+
docPath,
|
|
218
|
+
contentHash,
|
|
219
|
+
topK: neighbors,
|
|
220
|
+
axis: opts.axis,
|
|
221
|
+
model: opts.model,
|
|
222
|
+
verdicts,
|
|
223
|
+
});
|
|
224
|
+
return ok({
|
|
225
|
+
docPath,
|
|
226
|
+
contentHash,
|
|
227
|
+
neighbors,
|
|
228
|
+
verdicts,
|
|
229
|
+
observations,
|
|
230
|
+
llmCalls,
|
|
231
|
+
inputTokens,
|
|
232
|
+
outputTokens,
|
|
233
|
+
traceWritten: traceRes.ok,
|
|
234
|
+
...(traceRes.ok ? {} : { traceError: traceRes.error.message }),
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
// --- the CLI-wired trace recorder --------------------------------------------
|
|
238
|
+
export function birthTracePath(vaultRoot) {
|
|
239
|
+
return join(vaultRoot, ".daftari", "birth-trace.jsonl");
|
|
240
|
+
}
|
|
241
|
+
export async function appendBirthTrace(vaultRoot, row) {
|
|
242
|
+
try {
|
|
243
|
+
mkdirSync(join(vaultRoot, ".daftari"), { recursive: true });
|
|
244
|
+
appendFileSync(birthTracePath(vaultRoot), `${JSON.stringify(row)}\n`);
|
|
245
|
+
return ok(undefined);
|
|
246
|
+
}
|
|
247
|
+
catch (e) {
|
|
248
|
+
return err(new Error(`cannot record birth trace: ${e instanceof Error ? e.message : String(e)}`));
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
// Re-exported so the CLI doesn't have to import it from constants alone.
|
|
252
|
+
export { CONSOLIDATE_AGENT };
|
|
253
|
+
//# sourceMappingURL=birth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"birth.js","sourceRoot":"","sources":["../../src/consolidate/birth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type DerivesFromEdge } from "../curation/edges.js";
|
|
2
|
+
export type DueReason = "backstop" | "decay" | "event";
|
|
3
|
+
export interface DueEdge {
|
|
4
|
+
fromPath: string;
|
|
5
|
+
toPath: string;
|
|
6
|
+
strength: number;
|
|
7
|
+
reason: DueReason;
|
|
8
|
+
}
|
|
9
|
+
export declare function decayBackstopDue(edges: DerivesFromEdge[], now: Date): DueEdge[];
|
|
10
|
+
export declare function eventDue(changedPaths: string[], edges: DerivesFromEdge[]): DueEdge[];
|
|
11
|
+
export declare function birthQueue(docs: Array<{
|
|
12
|
+
relPath: string;
|
|
13
|
+
content: string;
|
|
14
|
+
}>, birthProcessed: Record<string, string>): string[];
|
|
15
|
+
//# sourceMappingURL=clocks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clocks.d.ts","sourceRoot":"","sources":["../../src/consolidate/clocks.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,KAAK,eAAe,EAAc,MAAM,sBAAsB,CAAC;AAQxE,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,OAAO,GAAG,OAAO,CAAC;AACvD,MAAM,WAAW,OAAO;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,SAAS,CAAC;CACnB;AAUD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,eAAe,EAAE,EAAE,GAAG,EAAE,IAAI,GAAG,OAAO,EAAE,CAsB/E;AAqBD,wBAAgB,QAAQ,CAAC,YAAY,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,GAAG,OAAO,EAAE,CAmDpF;AAKD,wBAAgB,UAAU,CACxB,IAAI,EAAE,KAAK,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,EACjD,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACrC,MAAM,EAAE,CAIV"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
// The three session-start clocks (spec §3.1), as pure functions over injected
|
|
2
|
+
// edges/docs — no I/O, so they are exhaustively testable with a fixed `now`.
|
|
3
|
+
// The I/O wrapper that feeds them is runConsolidate (index.ts).
|
|
4
|
+
//
|
|
5
|
+
// NOTE (Stage 1 scope): the decay clock keys off edge aged-strength only. The
|
|
6
|
+
// spec's TTL-on-docs input (`ttl_days` frontmatter feeding the same clock) is
|
|
7
|
+
// deferred to a later stage; it is additive and does not change the edge math.
|
|
8
|
+
import { EDGE_K_CAP } from "../curation/edges.js";
|
|
9
|
+
import { CONSOLIDATE_MAX_INTERVAL_DAYS, CONSOLIDATE_PATH_STRENGTH_FLOOR, reviewIntervalDays, } from "./constants.js";
|
|
10
|
+
import { docContentHash } from "./state.js";
|
|
11
|
+
const MS_PER_DAY = 86_400_000;
|
|
12
|
+
function daysBetween(thenISO, now) {
|
|
13
|
+
return (now.getTime() - new Date(thenISO).getTime()) / MS_PER_DAY;
|
|
14
|
+
}
|
|
15
|
+
// Decay + backstop clocks. Backstop dominates (it is the guarantee): an edge past
|
|
16
|
+
// the max-interval cap is backstop-overdue regardless of strength; otherwise an
|
|
17
|
+
// edge past its strength-scaled review interval is decay-due.
|
|
18
|
+
export function decayBackstopDue(edges, now) {
|
|
19
|
+
const out = [];
|
|
20
|
+
for (const e of edges) {
|
|
21
|
+
if (e.status === "revoked")
|
|
22
|
+
continue;
|
|
23
|
+
// Direction-unconfirmed edges are not trusted to bear triggers (spec §3.4);
|
|
24
|
+
// they stay visible as undirected relationships but never become due.
|
|
25
|
+
if (e.directionVerdict === "symmetric")
|
|
26
|
+
continue;
|
|
27
|
+
// Clamp at 0: a future-dated lastRederived (clock skew) yields a negative age;
|
|
28
|
+
// either way such an edge is fresh, not due (consistent with priority.ts ageOf).
|
|
29
|
+
const age = Math.max(0, daysBetween(e.lastRederived, now));
|
|
30
|
+
if (age >= CONSOLIDATE_MAX_INTERVAL_DAYS) {
|
|
31
|
+
out.push({
|
|
32
|
+
fromPath: e.fromPath,
|
|
33
|
+
toPath: e.toPath,
|
|
34
|
+
strength: e.strength,
|
|
35
|
+
reason: "backstop",
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
else if (age >= reviewIntervalDays(e.strength)) {
|
|
39
|
+
out.push({ fromPath: e.fromPath, toPath: e.toPath, strength: e.strength, reason: "decay" });
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return out;
|
|
43
|
+
}
|
|
44
|
+
const edgeKey = (from, to) => `${from}\n${to}`;
|
|
45
|
+
// Event clock: forward walk from changed premises over derives_from edges. An
|
|
46
|
+
// edge (from → to) means `from` depends on `to`; a changed `to` makes `from` due.
|
|
47
|
+
//
|
|
48
|
+
// Attenuation: edge `strength` is the aged value in [0, EDGE_K_CAP] (k·decay), so
|
|
49
|
+
// a strong edge has strength > 1 — multiplying raw strengths would *amplify* the
|
|
50
|
+
// signal and never hit the floor. We normalize each hop to a factor in [0,1]
|
|
51
|
+
// (strength / EDGE_K_CAP): a fully-earned edge passes the change-signal undimmed,
|
|
52
|
+
// a weak/aged edge attenuates it. Reach = ∏(factors); a path stops below the
|
|
53
|
+
// floor (spec §3.1, C-Q2).
|
|
54
|
+
//
|
|
55
|
+
// Max-product relaxation: a node can be reached by several paths with different
|
|
56
|
+
// products. We keep the BEST (largest) product per node and re-expand when a
|
|
57
|
+
// strictly larger product arrives — a plain visited-on-first-touch guard would
|
|
58
|
+
// prune a node's descendants using whatever (possibly weaker) path reached it
|
|
59
|
+
// first, which is order-dependent and wrongly drops reachable edges. Dedup is by
|
|
60
|
+
// the full edge (from,to): two distinct edges sharing a `from` (a←b and a←c) are
|
|
61
|
+
// separate review units (§4) and must both surface.
|
|
62
|
+
export function eventDue(changedPaths, edges) {
|
|
63
|
+
const byPremise = new Map();
|
|
64
|
+
for (const e of edges) {
|
|
65
|
+
if (e.status === "revoked")
|
|
66
|
+
continue;
|
|
67
|
+
// Direction-unconfirmed edges don't propagate change signals (spec §3.4):
|
|
68
|
+
// we can't trust which endpoint is the premise, so a change on either side
|
|
69
|
+
// must not fabricate a due dependent.
|
|
70
|
+
if (e.directionVerdict === "symmetric")
|
|
71
|
+
continue;
|
|
72
|
+
const list = byPremise.get(e.toPath) ?? [];
|
|
73
|
+
list.push(e);
|
|
74
|
+
byPremise.set(e.toPath, list);
|
|
75
|
+
}
|
|
76
|
+
const due = new Map();
|
|
77
|
+
const bestProduct = new Map();
|
|
78
|
+
const queue = [];
|
|
79
|
+
for (const p of changedPaths) {
|
|
80
|
+
if ((bestProduct.get(p) ?? -1) < 1) {
|
|
81
|
+
bestProduct.set(p, 1);
|
|
82
|
+
queue.push({ path: p, product: 1 });
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// Hard stop: products only decrease (factors ≤ 1) and we re-enqueue only on
|
|
86
|
+
// strict improvement, so this converges; the cap is a defensive backstop.
|
|
87
|
+
const maxExpansions = edges.length * edges.length + edges.length + changedPaths.length + 16;
|
|
88
|
+
let head = 0;
|
|
89
|
+
let expansions = 0;
|
|
90
|
+
while (head < queue.length && expansions < maxExpansions) {
|
|
91
|
+
const item = queue[head++];
|
|
92
|
+
if (!item)
|
|
93
|
+
break;
|
|
94
|
+
expansions += 1;
|
|
95
|
+
if (item.product < (bestProduct.get(item.path) ?? 0))
|
|
96
|
+
continue; // stale entry
|
|
97
|
+
for (const e of byPremise.get(item.path) ?? []) {
|
|
98
|
+
const factor = Math.min(Math.max(e.strength / EDGE_K_CAP, 0), 1);
|
|
99
|
+
const carried = item.product * factor;
|
|
100
|
+
if (carried < CONSOLIDATE_PATH_STRENGTH_FLOOR)
|
|
101
|
+
continue; // signal faded
|
|
102
|
+
const key = edgeKey(e.fromPath, e.toPath);
|
|
103
|
+
if (!due.has(key)) {
|
|
104
|
+
due.set(key, {
|
|
105
|
+
fromPath: e.fromPath,
|
|
106
|
+
toPath: e.toPath,
|
|
107
|
+
strength: e.strength,
|
|
108
|
+
reason: "event",
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
if (carried > (bestProduct.get(e.fromPath) ?? 0)) {
|
|
112
|
+
bestProduct.set(e.fromPath, carried);
|
|
113
|
+
queue.push({ path: e.fromPath, product: carried });
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return [...due.values()];
|
|
118
|
+
}
|
|
119
|
+
// Birth queue: docs never processed, or whose content changed since (edited ⇒
|
|
120
|
+
// re-birth, spec §4.0). Stage 1 only computes this; it never marks anything
|
|
121
|
+
// processed (no births are executed — that is Stage 2).
|
|
122
|
+
export function birthQueue(docs, birthProcessed) {
|
|
123
|
+
return docs
|
|
124
|
+
.filter((d) => birthProcessed[d.relPath] !== docContentHash(d.content))
|
|
125
|
+
.map((d) => d.relPath);
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=clocks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clocks.js","sourceRoot":"","sources":["../../src/consolidate/clocks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export declare const CONSOLIDATE_MIN_INTERVAL_DAYS = 1;
|
|
2
|
+
export declare const CONSOLIDATE_MAX_INTERVAL_DAYS = 90;
|
|
3
|
+
export declare function reviewIntervalDays(strength: number): number;
|
|
4
|
+
export declare const CONSOLIDATE_PATH_STRENGTH_FLOOR = 0.1;
|
|
5
|
+
export declare const CONSOLIDATE_SLICE_FRACTIONS: {
|
|
6
|
+
readonly backstop: 0.25;
|
|
7
|
+
readonly main: 0.45;
|
|
8
|
+
readonly periphery: 0.15;
|
|
9
|
+
readonly birth: 0.15;
|
|
10
|
+
};
|
|
11
|
+
export declare const CONSOLIDATE_DEFAULT_BUDGET = 50;
|
|
12
|
+
export declare const CONSOLIDATE_PANEL_SIZE = 2;
|
|
13
|
+
export declare const CONSOLIDATE_BIRTH_TOP_K = 20;
|
|
14
|
+
export declare const CONSOLIDATE_DEFAULT_MODEL = "claude-haiku-4-5-20251001";
|
|
15
|
+
export declare const CONSOLIDATE_AGENT = "agent:curation-loop";
|
|
16
|
+
export declare const CONSOLIDATE_PROMPT_TEMPLATES: readonly ["forward", "reverse", "contrast"];
|
|
17
|
+
export type ConsolidatePromptTemplate = (typeof CONSOLIDATE_PROMPT_TEMPLATES)[number];
|
|
18
|
+
export declare const CONSOLIDATE_DECORRELATION_MIN_LIFT = 0.05;
|
|
19
|
+
export declare const CONSOLIDATE_DIRECTION_MIN_ACCURACY = 0.85;
|
|
20
|
+
export declare const CONSOLIDATE_PRICING_PER_MTOKEN: Record<string, {
|
|
21
|
+
input: number;
|
|
22
|
+
output: number;
|
|
23
|
+
}>;
|
|
24
|
+
export declare function isModelPriced(model: string): boolean;
|
|
25
|
+
export declare function estimateCostUSD(model: string, inputTokens: number, outputTokens: number): number;
|
|
26
|
+
//# sourceMappingURL=constants.d.ts.map
|