@descryy/core 0.6.2 → 0.7.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/dist/graph/index.d.ts +1 -1
- package/dist/graph/index.d.ts.map +1 -1
- package/dist/graph/index.js.map +1 -1
- package/dist/graph/runtime-confirmation.d.ts +19 -0
- package/dist/graph/runtime-confirmation.d.ts.map +1 -1
- package/dist/graph/runtime-confirmation.js +35 -3
- package/dist/graph/runtime-confirmation.js.map +1 -1
- package/dist/query/index.d.ts +3 -0
- package/dist/query/index.d.ts.map +1 -1
- package/dist/query/index.js +2 -0
- package/dist/query/index.js.map +1 -1
- package/dist/query/model-table.d.ts +42 -0
- package/dist/query/model-table.d.ts.map +1 -0
- package/dist/query/model-table.js +51 -0
- package/dist/query/model-table.js.map +1 -0
- package/dist/query/persistence-reach.d.ts +150 -0
- package/dist/query/persistence-reach.d.ts.map +1 -0
- package/dist/query/persistence-reach.js +393 -0
- package/dist/query/persistence-reach.js.map +1 -0
- package/dist/query/queries.d.ts +1 -1
- package/dist/query/queries.d.ts.map +1 -1
- package/dist/query/queries.js +1 -1
- package/dist/query/queries.js.map +1 -1
- package/dist/scoping/weights.js +1 -1
- package/dist/scoping/weights.js.map +1 -1
- package/dist/store/reader.d.ts.map +1 -1
- package/dist/store/reader.js +6 -1
- package/dist/store/reader.js.map +1 -1
- package/dist/store/schema.d.ts +2 -2
- package/dist/store/schema.d.ts.map +1 -1
- package/dist/store/schema.js +2 -1
- package/dist/store/schema.js.map +1 -1
- package/dist/store/writer.d.ts.map +1 -1
- package/dist/store/writer.js +4 -3
- package/dist/store/writer.js.map +1 -1
- package/dist/tiers/certify.d.ts +174 -0
- package/dist/tiers/certify.d.ts.map +1 -1
- package/dist/tiers/certify.js +309 -5
- package/dist/tiers/certify.js.map +1 -1
- package/dist/tiers/index.d.ts +1 -1
- package/dist/tiers/index.d.ts.map +1 -1
- package/dist/tiers/index.js.map +1 -1
- package/dist/tiers/ladder.js +1 -1
- package/dist/tiers/ladder.js.map +1 -1
- package/package.json +2 -2
package/dist/graph/index.d.ts
CHANGED
|
@@ -7,7 +7,7 @@ export type { Mergeable } from "./merge.ts";
|
|
|
7
7
|
export { resolveCrossLanguage, RESOLVER_PRODUCED_BY } from "./cross-language.ts";
|
|
8
8
|
export type { NamespaceDeclaration, CrossLanguageAmbiguity, CrossLanguageResult } from "./cross-language.ts";
|
|
9
9
|
export { applyRuntimeObservations, reapplyEarnedOverlays, observedEdges, edgeCorrections, recordEdgeCorrection, RUNTIME_ADAPTER_ID, RUNTIME_ADAPTER_VERSION, RUNTIME_PRODUCER, } from "./runtime-confirmation.ts";
|
|
10
|
-
export type { Clock, EdgeCorrectionRow, ObservedEdgeRow, RuntimeConfirmationInput, RuntimeConfirmationResult, RuntimeObservationRefusal, StaleR4Observation, } from "./runtime-confirmation.ts";
|
|
10
|
+
export type { Clock, ConfirmedFactConflict, EdgeCorrectionRow, ObservedEdgeRow, RuntimeConfirmationInput, RuntimeConfirmationResult, RuntimeObservationRefusal, StaleR4Observation, } from "./runtime-confirmation.ts";
|
|
11
11
|
export { applyObservedTests, observedTests } from "./observed-tests.ts";
|
|
12
12
|
export type { ObservedTestObservation, ObservedTestOutcome, ObservedTestRefusal, ObservedTestRow, ObservedTestsInput, ObservedTestsResult, } from "./observed-tests.ts";
|
|
13
13
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/graph/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,iBAAiB,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEzG,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,OAAO,EACL,cAAc,EACd,SAAS,EACT,SAAS,EACT,aAAa,EACb,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AACjF,YAAY,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE7G,OAAO,EACL,wBAAwB,EACxB,qBAAqB,EACrB,aAAa,EACb,eAAe,EACf,oBAAoB,EACpB,kBAAkB,EAClB,uBAAuB,EACvB,gBAAgB,GACjB,MAAM,2BAA2B,CAAC;AACnC,YAAY,EACV,KAAK,EACL,iBAAiB,EACjB,eAAe,EACf,wBAAwB,EACxB,yBAAyB,EACzB,yBAAyB,EACzB,kBAAkB,GACnB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACxE,YAAY,EACV,uBAAuB,EACvB,mBAAmB,EACnB,mBAAmB,EACnB,eAAe,EACf,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/graph/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,iBAAiB,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEzG,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,OAAO,EACL,cAAc,EACd,SAAS,EACT,SAAS,EACT,aAAa,EACb,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AACjF,YAAY,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE7G,OAAO,EACL,wBAAwB,EACxB,qBAAqB,EACrB,aAAa,EACb,eAAe,EACf,oBAAoB,EACpB,kBAAkB,EAClB,uBAAuB,EACvB,gBAAgB,GACjB,MAAM,2BAA2B,CAAC;AACnC,YAAY,EACV,KAAK,EACL,qBAAqB,EACrB,iBAAiB,EACjB,eAAe,EACf,wBAAwB,EACxB,yBAAyB,EACzB,yBAAyB,EACzB,kBAAkB,GACnB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACxE,YAAY,EACV,uBAAuB,EACvB,mBAAmB,EACnB,mBAAmB,EACnB,eAAe,EACf,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,qBAAqB,CAAC"}
|
package/dist/graph/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/graph/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGxC,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAG5C,OAAO,EACL,cAAc,EACd,SAAS,EACT,SAAS,EACT,aAAa,EACb,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAGjF,OAAO,EACL,wBAAwB,EACxB,qBAAqB,EACrB,aAAa,EACb,eAAe,EACf,oBAAoB,EACpB,kBAAkB,EAClB,uBAAuB,EACvB,gBAAgB,GACjB,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/graph/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGxC,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAG5C,OAAO,EACL,cAAc,EACd,SAAS,EACT,SAAS,EACT,aAAa,EACb,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAGjF,OAAO,EACL,wBAAwB,EACxB,qBAAqB,EACrB,aAAa,EACb,eAAe,EACf,oBAAoB,EACpB,kBAAkB,EAClB,uBAAuB,EACvB,gBAAgB,GACjB,MAAM,2BAA2B,CAAC;AAWnC,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -18,6 +18,22 @@ export interface StaleR4Observation {
|
|
|
18
18
|
readonly observedByRun: string | null;
|
|
19
19
|
readonly detail: string;
|
|
20
20
|
}
|
|
21
|
+
/** A denial that lands on an edge `mintEdgesFromConfirmedFacts` wrote from a
|
|
22
|
+
* human's answer (`attrs.humanAsserted`, DEC-223). Structurally separate from
|
|
23
|
+
* the generic `contradictions` bucket on purpose: a human assertion and a
|
|
24
|
+
* fresh runtime observation disagreeing is a different situation from the
|
|
25
|
+
* graph's own static guess being wrong, and this project's rule is that a
|
|
26
|
+
* human assertion is never silently overridden or silently trusted forever —
|
|
27
|
+
* so this only names the collision. It does not pick a winner: the edge is
|
|
28
|
+
* still demoted the same as any other contradicted sub-R4 edge (see the
|
|
29
|
+
* caller), and `attrs.confirmedFacts` on the edge itself is left untouched. */
|
|
30
|
+
export interface ConfirmedFactConflict {
|
|
31
|
+
readonly edgeId: string;
|
|
32
|
+
/** `attrs.confirmedFacts` off the edge, verbatim — the confirmed side of the disagreement. */
|
|
33
|
+
readonly confirmedFacts: readonly Record<string, unknown>[];
|
|
34
|
+
/** The runtime observation's own words — the fresh side of the disagreement. */
|
|
35
|
+
readonly detail: string;
|
|
36
|
+
}
|
|
21
37
|
export interface RuntimeConfirmationInput {
|
|
22
38
|
/** The run that witnessed these observations. Becomes `edges.observed_by_run` and `observed_edges.run_id`. */
|
|
23
39
|
readonly runId: string;
|
|
@@ -36,6 +52,9 @@ export interface RuntimeConfirmationResult {
|
|
|
36
52
|
readonly contradictions: readonly GraphDefectRecord[];
|
|
37
53
|
readonly staleR4: readonly StaleR4Observation[];
|
|
38
54
|
readonly refused: readonly RuntimeObservationRefusal[];
|
|
55
|
+
/** Denials that also collided with a human-confirmed edge. A subset named
|
|
56
|
+
* separately, never merged into `contradictions` — see {@link ConfirmedFactConflict}. */
|
|
57
|
+
readonly confirmedFactConflict: readonly ConfirmedFactConflict[];
|
|
39
58
|
}
|
|
40
59
|
/** One row of the EARNED R4 ledger. */
|
|
41
60
|
export interface ObservedEdgeRow {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-confirmation.d.ts","sourceRoot":"","sources":["../../src/graph/runtime-confirmation.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAU,KAAK,QAAQ,EAAE,KAAK,iBAAiB,EAAE,KAAK,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAEzG,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAE3D,oFAAoF;AACpF,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,uFAAuF;AACvF,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,wBAAwB;IACvC,8GAA8G;IAC9G,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,8IAA8I;IAC9I,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,YAAY,EAAE,SAAS,sBAAsB,EAAE,CAAC;CAC1D;AAED,MAAM,WAAW,yBAAyB;IACxC,kDAAkD;IAClD,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,oEAAoE;IACpE,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,oFAAoF;IACpF,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,iFAAiF;IACjF,QAAQ,CAAC,cAAc,EAAE,SAAS,iBAAiB,EAAE,CAAC;IACtD,QAAQ,CAAC,OAAO,EAAE,SAAS,kBAAkB,EAAE,CAAC;IAChD,QAAQ,CAAC,OAAO,EAAE,SAAS,yBAAyB,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"runtime-confirmation.d.ts","sourceRoot":"","sources":["../../src/graph/runtime-confirmation.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,6 +15,7 @@ export function applyRuntimeObservations(driver, input, clock = SYSTEM_CLOCK) {
|
|
|
15
15
|
const contradictions = [];
|
|
16
16
|
const staleR4 = [];
|
|
17
17
|
const refused = [];
|
|
18
|
+
const confirmedFactConflict = [];
|
|
18
19
|
const now = clock.now();
|
|
19
20
|
driver.transaction(() => {
|
|
20
21
|
for (const observation of input.observations) {
|
|
@@ -73,9 +74,17 @@ export function applyRuntimeObservations(driver, input, clock = SYSTEM_CLOCK) {
|
|
|
73
74
|
claimedResolution: existing.resolution,
|
|
74
75
|
detail: observation.detail,
|
|
75
76
|
});
|
|
77
|
+
// A human answered this exact edge (DEC-223) and the runtime now disagrees.
|
|
78
|
+
// Named separately from the contradiction above — not auto-resolved, not
|
|
79
|
+
// merged: the demotion above still runs unconditionally (this signal never
|
|
80
|
+
// picks a winner), and `attrs.confirmedFacts` on the edge is left as-is.
|
|
81
|
+
const confirmedFacts = confirmedFactsOf(existing);
|
|
82
|
+
if (confirmedFacts !== null) {
|
|
83
|
+
confirmedFactConflict.push({ edgeId: id, confirmedFacts, detail: observation.detail });
|
|
84
|
+
}
|
|
76
85
|
}
|
|
77
86
|
});
|
|
78
|
-
return { promoted, created, confirmed, contradictions, staleR4, refused };
|
|
87
|
+
return { promoted, created, confirmed, contradictions, staleR4, refused, confirmedFactConflict };
|
|
79
88
|
}
|
|
80
89
|
/** Re-projects the EARNED ledgers onto a freshly rebuilt derived graph — what
|
|
81
90
|
* makes the DEC-017 partition pay. Without this, a re-index silently resets the
|
|
@@ -120,7 +129,7 @@ export function reapplyEarnedOverlays(driver) {
|
|
|
120
129
|
demoteEdge(driver, correction.edgeId);
|
|
121
130
|
}
|
|
122
131
|
});
|
|
123
|
-
return { promoted, created, confirmed, contradictions: [], staleR4: [], refused };
|
|
132
|
+
return { promoted, created, confirmed, contradictions: [], staleR4: [], refused, confirmedFactConflict: [] };
|
|
124
133
|
}
|
|
125
134
|
/** Every row of the EARNED R4 ledger, oldest first, optionally for one run. */
|
|
126
135
|
export function observedEdges(driver, options = {}) {
|
|
@@ -169,9 +178,32 @@ export function recordEdgeCorrection(driver, input, clock = SYSTEM_CLOCK) {
|
|
|
169
178
|
// Internals.
|
|
170
179
|
function readEdge(driver, id) {
|
|
171
180
|
return driver
|
|
172
|
-
.prepare("SELECT id, resolution, observed_by_run FROM edges WHERE id = ?")
|
|
181
|
+
.prepare("SELECT id, resolution, observed_by_run, attrs FROM edges WHERE id = ?")
|
|
173
182
|
.all(id)[0];
|
|
174
183
|
}
|
|
184
|
+
/** The `attrs.confirmedFacts` array off a human-confirmed edge row, or `null`
|
|
185
|
+
* when the edge carries no `attrs.humanAsserted` — the signal that gates
|
|
186
|
+
* {@link ConfirmedFactConflict}. Malformed/missing `attrs` reads as "not
|
|
187
|
+
* human-asserted" rather than throwing — a parse failure here must never
|
|
188
|
+
* block the ordinary demotion path. */
|
|
189
|
+
function confirmedFactsOf(edge) {
|
|
190
|
+
if (edge.attrs === null)
|
|
191
|
+
return null;
|
|
192
|
+
let parsed;
|
|
193
|
+
try {
|
|
194
|
+
parsed = JSON.parse(edge.attrs);
|
|
195
|
+
}
|
|
196
|
+
catch {
|
|
197
|
+
return null;
|
|
198
|
+
}
|
|
199
|
+
if (typeof parsed !== "object" || parsed === null)
|
|
200
|
+
return null;
|
|
201
|
+
const attrs = parsed;
|
|
202
|
+
if (attrs["humanAsserted"] !== true)
|
|
203
|
+
return null;
|
|
204
|
+
const facts = attrs["confirmedFacts"];
|
|
205
|
+
return Array.isArray(facts) ? facts : [];
|
|
206
|
+
}
|
|
175
207
|
/** The first of `from`/`to` this graph does not hold, or `null` when it holds both. */
|
|
176
208
|
function missingNode(driver, from, to) {
|
|
177
209
|
const statement = driver.prepare("SELECT id FROM nodes WHERE id = ?");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-confirmation.js","sourceRoot":"","sources":["../../src/graph/runtime-confirmation.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAsE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"runtime-confirmation.js","sourceRoot":"","sources":["../../src/graph/runtime-confirmation.ts"],"names":[],"mappings":"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"}
|
package/dist/query/index.d.ts
CHANGED
|
@@ -31,4 +31,7 @@ export { rankRootCause, DEFAULT_ROOT_CAUSE_WEIGHTS, ROOT_CAUSE_TRACE_EDGE_TYPES,
|
|
|
31
31
|
export type { RootCauseWeights, RootCauseOptions, RankedRootCauseCandidate, RootCauseRanking, ChangeCouplingEvidence, } from "./root-cause-score.ts";
|
|
32
32
|
export { createResolutionFloor } from "./resolution-floor.ts";
|
|
33
33
|
export type { ResolutionFloor } from "./resolution-floor.ts";
|
|
34
|
+
export { tableForModel, modelsForTable, tableIdForModel } from "./model-table.ts";
|
|
35
|
+
export { endpointsReachingTable, MODEL_ACCESS_EDGE_TYPES, WRITE_MEANING_NOTE } from "./persistence-reach.ts";
|
|
36
|
+
export type { AccessDirection, EndpointTableAccess, PersistenceHopGap, PersistencePath, PersistenceReach, PersistenceReachOptions, } from "./persistence-reach.ts";
|
|
34
37
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/query/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/query/index.ts"],"names":[],"mappings":"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"}
|
package/dist/query/index.js
CHANGED
|
@@ -15,4 +15,6 @@ export { applyDeclaredValues, DECLARED_VALUE_RELIABILITY } from "./declared-valu
|
|
|
15
15
|
export { describeRowClosures } from "./row-closure-picture.js";
|
|
16
16
|
export { rankRootCause, DEFAULT_ROOT_CAUSE_WEIGHTS, ROOT_CAUSE_TRACE_EDGE_TYPES, INCIDENT_SATURATION } from "./root-cause-score.js";
|
|
17
17
|
export { createResolutionFloor } from "./resolution-floor.js";
|
|
18
|
+
export { tableForModel, modelsForTable, tableIdForModel } from "./model-table.js";
|
|
19
|
+
export { endpointsReachingTable, MODEL_ACCESS_EDGE_TYPES, WRITE_MEANING_NOTE } from "./persistence-reach.js";
|
|
18
20
|
//# sourceMappingURL=index.js.map
|
package/dist/query/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/query/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAQjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAGnD,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhE,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAGxG,OAAO,EACL,QAAQ,EACR,eAAe,EACf,aAAa,EACb,YAAY,EACZ,oBAAoB,EACpB,QAAQ,EACR,UAAU,EACV,WAAW,GACZ,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AASrG,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAG9E,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAG3D,OAAO,EAAE,0BAA0B,EAAE,wBAAwB,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAQ7G,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAGzE,OAAO,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAC5F,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE1D,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAIrG,OAAO,EAAE,mBAAmB,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AAO9F,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAQ/D,OAAO,EAAE,aAAa,EAAE,0BAA0B,EAAE,2BAA2B,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AASpI,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/query/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAQjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAGnD,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhE,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAGxG,OAAO,EACL,QAAQ,EACR,eAAe,EACf,aAAa,EACb,YAAY,EACZ,oBAAoB,EACpB,QAAQ,EACR,UAAU,EACV,WAAW,GACZ,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AASrG,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAG9E,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAG3D,OAAO,EAAE,0BAA0B,EAAE,wBAAwB,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAQ7G,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAGzE,OAAO,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAC5F,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE1D,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAIrG,OAAO,EAAE,mBAAmB,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AAO9F,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAQ/D,OAAO,EAAE,aAAa,EAAE,0BAA0B,EAAE,2BAA2B,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AASpI,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAG9D,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAElF,OAAO,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/** `MODEL` -> `DATABASE_TABLE`, joined at query time rather than by a stored
|
|
2
|
+
* edge — `DEC-NEXT-database-table-column-traversability-vs-queryability.md`
|
|
3
|
+
* rules that queryability, not a new edge type, is what these checks need.
|
|
4
|
+
*
|
|
5
|
+
* `databaseTableNodesFromModel` (`@descryy/ir`, DEC-240) mints every
|
|
6
|
+
* `DATABASE_TABLE` node's id deterministically from
|
|
7
|
+
* `nodeId(scope, "DATABASE_TABLE", tableQsp(schema, table), null)` — with
|
|
8
|
+
* `language: null` unconditionally, specifically so an ORM-derived producer
|
|
9
|
+
* and a raw-DDL-derived producer land on the identical id for the same real
|
|
10
|
+
* table, with no coordination between them. A `MODEL` node's `attrs.table`
|
|
11
|
+
* (and optional `attrs.schema`) is the literal table name it declares — a
|
|
12
|
+
* model refuses rather than guesses if it can't determine one, so this is
|
|
13
|
+
* always single-valued, never ambiguous. Recomputing the same id from those
|
|
14
|
+
* attrs and looking it up is therefore an O(1) exact match, no scan, no
|
|
15
|
+
* fuzzy string comparison — the same "relationship read from attrs at query
|
|
16
|
+
* time, not stored" precedent as `contracts/orphans.ts`'s `keyOf()`. */
|
|
17
|
+
import { type IdentityScope, type IRNode } from "@descryy/ir";
|
|
18
|
+
import type { AdjacencyProvider } from "./provider.ts";
|
|
19
|
+
/** The table id a `MODEL` node's own declared shape computes to, or
|
|
20
|
+
* `undefined` when it names no table — refused rather than guessed at mint
|
|
21
|
+
* time (`model-tables.ts`), so this is a real absence, not a lookup miss.
|
|
22
|
+
* Exported so a composed query can enumerate `MODEL` once and both filter and
|
|
23
|
+
* probe from that one enumeration; a second `nodesOfType` call to recover the
|
|
24
|
+
* same set is a scan the store does not need to repeat. */
|
|
25
|
+
export declare function tableIdForModel(model: IRNode, scope: IdentityScope): string | undefined;
|
|
26
|
+
/** A `MODEL` node's `DATABASE_TABLE` counterpart, or `undefined` when the
|
|
27
|
+
* model names no table, or when the table it names was never observed in
|
|
28
|
+
* this graph (no adapter emitted it, or it belongs to a different scope).
|
|
29
|
+
* Both are real, disclosable gaps — never an error. `scope` must be the
|
|
30
|
+
* same `IdentityScope` the graph was built with; `DATABASE_TABLE` is
|
|
31
|
+
* workspace-scoped (`NODE_SCOPE`), so a mismatched scope silently misses. */
|
|
32
|
+
export declare function tableForModel(provider: AdjacencyProvider, model: IRNode, scope: IdentityScope): IRNode | undefined;
|
|
33
|
+
/** The reverse direction: every `MODEL` node in this graph whose declared
|
|
34
|
+
* table resolves to `table`. Real and legitimate to be more than one — two
|
|
35
|
+
* ORM entities intentionally sharing a table is not an error, just a fact
|
|
36
|
+
* to enumerate correctly. O(models enumerated); there is no stored edge to
|
|
37
|
+
* walk in the other direction. */
|
|
38
|
+
export declare function modelsForTable(provider: AdjacencyProvider, table: IRNode, scope: IdentityScope, limit?: number): {
|
|
39
|
+
readonly models: readonly IRNode[];
|
|
40
|
+
readonly truncated: boolean;
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=model-table.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-table.d.ts","sourceRoot":"","sources":["../../src/query/model-table.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;yEAeyE;AAEzE,OAAO,EAIL,KAAK,aAAa,EAClB,KAAK,MAAM,EACZ,MAAM,aAAa,CAAC;AAErB,OAAO,KAAK,EAAE,iBAAiB,EAAW,MAAM,eAAe,CAAC;AAEhE;;;;;4DAK4D;AAC5D,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,MAAM,GAAG,SAAS,CAKvF;AAED;;;;;8EAK8E;AAC9E,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,iBAAiB,EAC3B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,aAAa,GACnB,MAAM,GAAG,SAAS,CAGpB;AAED;;;;mCAImC;AACnC,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,iBAAiB,EAC3B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,aAAa,EACpB,KAAK,CAAC,EAAE,MAAM,GACb;IAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAIrE"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/** `MODEL` -> `DATABASE_TABLE`, joined at query time rather than by a stored
|
|
2
|
+
* edge — `DEC-NEXT-database-table-column-traversability-vs-queryability.md`
|
|
3
|
+
* rules that queryability, not a new edge type, is what these checks need.
|
|
4
|
+
*
|
|
5
|
+
* `databaseTableNodesFromModel` (`@descryy/ir`, DEC-240) mints every
|
|
6
|
+
* `DATABASE_TABLE` node's id deterministically from
|
|
7
|
+
* `nodeId(scope, "DATABASE_TABLE", tableQsp(schema, table), null)` — with
|
|
8
|
+
* `language: null` unconditionally, specifically so an ORM-derived producer
|
|
9
|
+
* and a raw-DDL-derived producer land on the identical id for the same real
|
|
10
|
+
* table, with no coordination between them. A `MODEL` node's `attrs.table`
|
|
11
|
+
* (and optional `attrs.schema`) is the literal table name it declares — a
|
|
12
|
+
* model refuses rather than guesses if it can't determine one, so this is
|
|
13
|
+
* always single-valued, never ambiguous. Recomputing the same id from those
|
|
14
|
+
* attrs and looking it up is therefore an O(1) exact match, no scan, no
|
|
15
|
+
* fuzzy string comparison — the same "relationship read from attrs at query
|
|
16
|
+
* time, not stored" precedent as `contracts/orphans.ts`'s `keyOf()`. */
|
|
17
|
+
import { DEFAULT_MODEL_SCHEMA, nodeId, tableQsp, } from "@descryy/ir";
|
|
18
|
+
/** The table id a `MODEL` node's own declared shape computes to, or
|
|
19
|
+
* `undefined` when it names no table — refused rather than guessed at mint
|
|
20
|
+
* time (`model-tables.ts`), so this is a real absence, not a lookup miss.
|
|
21
|
+
* Exported so a composed query can enumerate `MODEL` once and both filter and
|
|
22
|
+
* probe from that one enumeration; a second `nodesOfType` call to recover the
|
|
23
|
+
* same set is a scan the store does not need to repeat. */
|
|
24
|
+
export function tableIdForModel(model, scope) {
|
|
25
|
+
const table = model.attrs["table"];
|
|
26
|
+
if (typeof table !== "string" || table === "")
|
|
27
|
+
return undefined;
|
|
28
|
+
const schema = typeof model.attrs["schema"] === "string" ? model.attrs["schema"] : DEFAULT_MODEL_SCHEMA;
|
|
29
|
+
return nodeId(scope, "DATABASE_TABLE", tableQsp(schema, table), null);
|
|
30
|
+
}
|
|
31
|
+
/** A `MODEL` node's `DATABASE_TABLE` counterpart, or `undefined` when the
|
|
32
|
+
* model names no table, or when the table it names was never observed in
|
|
33
|
+
* this graph (no adapter emitted it, or it belongs to a different scope).
|
|
34
|
+
* Both are real, disclosable gaps — never an error. `scope` must be the
|
|
35
|
+
* same `IdentityScope` the graph was built with; `DATABASE_TABLE` is
|
|
36
|
+
* workspace-scoped (`NODE_SCOPE`), so a mismatched scope silently misses. */
|
|
37
|
+
export function tableForModel(provider, model, scope) {
|
|
38
|
+
const tableId = tableIdForModel(model, scope);
|
|
39
|
+
return tableId === undefined ? undefined : provider.node(tableId);
|
|
40
|
+
}
|
|
41
|
+
/** The reverse direction: every `MODEL` node in this graph whose declared
|
|
42
|
+
* table resolves to `table`. Real and legitimate to be more than one — two
|
|
43
|
+
* ORM entities intentionally sharing a table is not an error, just a fact
|
|
44
|
+
* to enumerate correctly. O(models enumerated); there is no stored edge to
|
|
45
|
+
* walk in the other direction. */
|
|
46
|
+
export function modelsForTable(provider, table, scope, limit) {
|
|
47
|
+
const set = limit === undefined ? provider.nodesOfType("MODEL") : provider.nodesOfType("MODEL", limit);
|
|
48
|
+
const models = set.nodes.filter((model) => tableIdForModel(model, scope) === table.id);
|
|
49
|
+
return { models, truncated: set.truncated };
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=model-table.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-table.js","sourceRoot":"","sources":["../../src/query/model-table.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;yEAeyE;AAEzE,OAAO,EACL,oBAAoB,EACpB,MAAM,EACN,QAAQ,GAGT,MAAM,aAAa,CAAC;AAIrB;;;;;4DAK4D;AAC5D,MAAM,UAAU,eAAe,CAAC,KAAa,EAAE,KAAoB;IACjE,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACnC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,SAAS,CAAC;IAChE,MAAM,MAAM,GAAG,OAAO,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC;IACxG,OAAO,MAAM,CAAC,KAAK,EAAE,gBAAgB,EAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;AACxE,CAAC;AAED;;;;;8EAK8E;AAC9E,MAAM,UAAU,aAAa,CAC3B,QAA2B,EAC3B,KAAa,EACb,KAAoB;IAEpB,MAAM,OAAO,GAAG,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC9C,OAAO,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACpE,CAAC;AAED;;;;mCAImC;AACnC,MAAM,UAAU,cAAc,CAC5B,QAA2B,EAC3B,KAAa,EACb,KAAoB,EACpB,KAAc;IAEd,MAAM,GAAG,GAAY,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAChH,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC,CAAC;IACvF,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC;AAC9C,CAAC"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/** "Which endpoints reach this table, and which of them write to it" — the
|
|
2
|
+
* persistence half of the bug-relevant subgraph, made askable.
|
|
3
|
+
*
|
|
4
|
+
* Until this query existed the question could not be asked in any language:
|
|
5
|
+
* `DATABASE_TABLE`/`DATABASE_COLUMN` are in no edge, of any type, in either
|
|
6
|
+
* direction. That is not a defect — it is the consequence of a ruling. The
|
|
7
|
+
* model-to-table join was deliberately built **by shared node identity rather
|
|
8
|
+
* than by an edge** (`databaseTableNodesFromModel`, `@descryy/ir`, DEC-240),
|
|
9
|
+
* so an ORM-derived producer and a raw-DDL-derived producer land on the same
|
|
10
|
+
* id for the same real table with no coordination. Identity merging and
|
|
11
|
+
* reachability are different problems, and solving the first left the second
|
|
12
|
+
* untouched. This module solves the second **without touching the first**:
|
|
13
|
+
* no new edge type, no new node type, no adapter change
|
|
14
|
+
* (`DEC-NEXT-database-table-column-traversability-vs-queryability.md`,
|
|
15
|
+
* `DEC-NEXT-persistence-half-of-the-bug-relevant-subgraph-is-unreachable.md`
|
|
16
|
+
* option 1).
|
|
17
|
+
*
|
|
18
|
+
* ## The three hops, walked backwards from the table
|
|
19
|
+
*
|
|
20
|
+
* 1. **table -> model** — `modelsForTable` (`model-table.ts`), an O(1) exact
|
|
21
|
+
* id match per model, recomputed from the model's own declared table name.
|
|
22
|
+
* **This leg has no edge under it.** Its evidence is two declarations: a
|
|
23
|
+
* string in the model and the table node's identity. That is why the whole
|
|
24
|
+
* composed claim is name-level and can never reach reliability class A,
|
|
25
|
+
* however well-resolved the other two hops are.
|
|
26
|
+
* 2. **model -> accessor** — `READS`/`ASSIGNS` edges pointing at the model.
|
|
27
|
+
* 3. **accessor -> route -> endpoint** — one budgeted inbound `CALLS` walk
|
|
28
|
+
* seeded on every accessor at once (never one walk per accessor), carrying
|
|
29
|
+
* the set of accessors each node reaches, then
|
|
30
|
+
* `API_ROUTE --SERVES_API--> API_ENDPOINT`.
|
|
31
|
+
*
|
|
32
|
+
* ## The write gate, and why it names no language
|
|
33
|
+
*
|
|
34
|
+
* A developer acting on "this endpoint writes to your users table" changes
|
|
35
|
+
* code. Only some producers distinguish an assignment from a read; the rest
|
|
36
|
+
* emit every field access as `READS`, so answering the write question from a
|
|
37
|
+
* `READS` edge would state the opposite of what the code does for those
|
|
38
|
+
* producers. It must therefore be gated — but gating on a language name above
|
|
39
|
+
* the IR is a boundary breach (rule 1), and the mechanical boundary lint is
|
|
40
|
+
* right to forbid it.
|
|
41
|
+
*
|
|
42
|
+
* So the gate is **evidence, not configuration**: a producer is
|
|
43
|
+
* direction-aware iff it is observed emitting at least one `ASSIGNS` edge
|
|
44
|
+
* into a `MODEL` in this graph. An `ASSIGNS` edge is self-evidencing and
|
|
45
|
+
* needs no gate at all. A `READS` edge from a direction-aware producer is a
|
|
46
|
+
* genuine read. A `READS` edge from a producer never seen emitting `ASSIGNS`
|
|
47
|
+
* is `unknown-direction` — reported as not analysable, folded into neither
|
|
48
|
+
* the read set nor the write set. The failure mode is one-directional by
|
|
49
|
+
* construction: the worst this rule can do is decline to answer, and it can
|
|
50
|
+
* never manufacture a write. */
|
|
51
|
+
import { type EdgeType, type IdentityScope, type IREdge, type IRNode, type ReliabilityClass } from "@descryy/ir";
|
|
52
|
+
import type { AdjacencyProvider, QueryResult } from "./provider.ts";
|
|
53
|
+
/** The two edge types that carry a function's access to a model's fields.
|
|
54
|
+
* Named once so the accessor read and the direction probe cannot drift. */
|
|
55
|
+
export declare const MODEL_ACCESS_EDGE_TYPES: readonly EdgeType[];
|
|
56
|
+
/** What this query is willing to say about an endpoint's access to a table.
|
|
57
|
+
*
|
|
58
|
+
* `writes` means **an assignment to a mapped column of the model backing this
|
|
59
|
+
* table**, which is what the underlying edge actually records. It is not a
|
|
60
|
+
* witnessed database write: whether the assignment reaches the database
|
|
61
|
+
* depends on the object being session-attached and the session being flushed,
|
|
62
|
+
* and nothing in the graph establishes either. Rule 4 governs the difference —
|
|
63
|
+
* this is a behavioural prediction until a runtime run confirms it, and the
|
|
64
|
+
* reliability cap and `WRITE_MEANING_NOTE` both say so.
|
|
65
|
+
*
|
|
66
|
+
* `unknown-direction` is a real answer, not a missing one: the endpoint
|
|
67
|
+
* demonstrably reaches the table, and the direction is not analysable from
|
|
68
|
+
* the evidence the producer emitted. */
|
|
69
|
+
export type AccessDirection = "writes" | "reads" | "unknown-direction";
|
|
70
|
+
/** Which hop stopped, and where. A missing hop is disclosed rather than
|
|
71
|
+
* silently yielding a shorter answer — an endpoint absent from the result
|
|
72
|
+
* because hop 2 had nothing to walk is not an endpoint that does not touch
|
|
73
|
+
* the table. */
|
|
74
|
+
export interface PersistenceHopGap {
|
|
75
|
+
readonly hop: "model-for-table" | "accessor-for-model" | "route-for-accessor" | "endpoint-for-route";
|
|
76
|
+
/** The node the hop was walked from. */
|
|
77
|
+
readonly node: IRNode;
|
|
78
|
+
readonly reason: string;
|
|
79
|
+
}
|
|
80
|
+
/** One traced route from an endpoint to the table, with every edge under it. */
|
|
81
|
+
export interface PersistencePath {
|
|
82
|
+
readonly endpoint: IRNode;
|
|
83
|
+
readonly route: IRNode;
|
|
84
|
+
/** The function carrying the model-access edge — the end of the call chain. */
|
|
85
|
+
readonly accessor: IRNode;
|
|
86
|
+
readonly model: IRNode;
|
|
87
|
+
readonly direction: AccessDirection;
|
|
88
|
+
/** Columns the access edge names, where it names any. */
|
|
89
|
+
readonly columns: readonly string[];
|
|
90
|
+
/** `CALLS` hops from the route to the accessor. 1 when the route calls it directly. */
|
|
91
|
+
readonly callDepth: number;
|
|
92
|
+
/** Every edge this claim rests on, in path order: route->endpoint,
|
|
93
|
+
* route->..->accessor, accessor->model. The model->table leg is absent by
|
|
94
|
+
* construction — it is an identity match, not an edge. */
|
|
95
|
+
readonly edges: readonly IREdge[];
|
|
96
|
+
}
|
|
97
|
+
export interface EndpointTableAccess {
|
|
98
|
+
readonly endpoint: IRNode;
|
|
99
|
+
/** Precedence is `writes` > `unknown-direction` > `reads`: one undetermined
|
|
100
|
+
* path is enough to forbid the claim that this endpoint only reads. */
|
|
101
|
+
readonly direction: AccessDirection;
|
|
102
|
+
readonly columns: readonly string[];
|
|
103
|
+
readonly paths: readonly PersistencePath[];
|
|
104
|
+
}
|
|
105
|
+
export interface PersistenceReach {
|
|
106
|
+
readonly table: IRNode;
|
|
107
|
+
/** The `MODEL` nodes whose declared table is this one. More than one is
|
|
108
|
+
* legitimate — two entities intentionally sharing a table. */
|
|
109
|
+
readonly models: readonly IRNode[];
|
|
110
|
+
readonly endpoints: readonly EndpointTableAccess[];
|
|
111
|
+
readonly hopGaps: readonly PersistenceHopGap[];
|
|
112
|
+
/** Producers observed emitting `ASSIGNS` into a `MODEL` in this graph:
|
|
113
|
+
* their `READS` edges are genuine reads. */
|
|
114
|
+
readonly directionAwareProducers: readonly string[];
|
|
115
|
+
/** Producers on a path here that were never observed emitting `ASSIGNS`:
|
|
116
|
+
* their `READS` edges carry no direction, and are reported as such. */
|
|
117
|
+
readonly directionBlindProducers: readonly string[];
|
|
118
|
+
/** Capped at B unconditionally — see the module doc's hop 1. */
|
|
119
|
+
readonly reliability: ReliabilityClass;
|
|
120
|
+
}
|
|
121
|
+
export interface PersistenceReachOptions {
|
|
122
|
+
/** `CALLS` hops from a route to an accessor. Default 4. */
|
|
123
|
+
readonly maxCallDepth?: number;
|
|
124
|
+
/** Budget for the inbound `CALLS` walk, counted in (node, accessor) pairs
|
|
125
|
+
* rather than nodes — the walk re-enters a node for a new accessor, so
|
|
126
|
+
* pairs are what actually bound it. DEC-007's 200/1,000/5,000. Default 1,000. */
|
|
127
|
+
readonly budget?: number;
|
|
128
|
+
/** Fan-out cap per hop, and the cap on accessors read per model. Default 200. */
|
|
129
|
+
readonly perNodeLimit?: number;
|
|
130
|
+
/** Cap on `MODEL` nodes enumerated, for both the table join and the
|
|
131
|
+
* direction probe. Default 5,000 — the provider's own default. */
|
|
132
|
+
readonly modelLimit?: number;
|
|
133
|
+
}
|
|
134
|
+
/** Emitted whenever a write is reported. The distinction it draws is the one a
|
|
135
|
+
* reader will otherwise collapse, and collapsing it turns a provable
|
|
136
|
+
* statement about source into an unproven one about a running database. */
|
|
137
|
+
export declare const WRITE_MEANING_NOTE: string;
|
|
138
|
+
/**
|
|
139
|
+
* Every `API_ENDPOINT` that reaches `table`, and which of them write to it.
|
|
140
|
+
*
|
|
141
|
+
* `scope` must be the `IdentityScope` the graph was built with —
|
|
142
|
+
* `DATABASE_TABLE` is workspace-scoped, so a mismatched scope misses silently
|
|
143
|
+
* rather than erroring, and the miss surfaces as a `model-for-table` gap.
|
|
144
|
+
*
|
|
145
|
+
* Never throws on graph content. A node of the wrong type, a model whose
|
|
146
|
+
* declared table is not a string, a dangling edge — each degrades to a named
|
|
147
|
+
* reason in `hopGaps` or `notes`.
|
|
148
|
+
*/
|
|
149
|
+
export declare function endpointsReachingTable(provider: AdjacencyProvider, table: IRNode, scope: IdentityScope, options?: PersistenceReachOptions): QueryResult<PersistenceReach>;
|
|
150
|
+
//# sourceMappingURL=persistence-reach.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persistence-reach.d.ts","sourceRoot":"","sources":["../../src/query/persistence-reach.ts"],"names":[],"mappings":"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"}
|