@descryy/core 0.1.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/LICENSE +21 -0
- package/dist/capabilities/index.d.ts +3 -0
- package/dist/capabilities/index.d.ts.map +1 -0
- package/dist/capabilities/index.js +2 -0
- package/dist/capabilities/index.js.map +1 -0
- package/dist/capabilities/preconditions.d.ts +99 -0
- package/dist/capabilities/preconditions.d.ts.map +1 -0
- package/dist/capabilities/preconditions.js +94 -0
- package/dist/capabilities/preconditions.js.map +1 -0
- package/dist/contracts/engine.d.ts +90 -0
- package/dist/contracts/engine.d.ts.map +1 -0
- package/dist/contracts/engine.js +291 -0
- package/dist/contracts/engine.js.map +1 -0
- package/dist/contracts/index.d.ts +9 -0
- package/dist/contracts/index.d.ts.map +1 -0
- package/dist/contracts/index.js +5 -0
- package/dist/contracts/index.js.map +1 -0
- package/dist/contracts/orphans.d.ts +96 -0
- package/dist/contracts/orphans.d.ts.map +1 -0
- package/dist/contracts/orphans.js +241 -0
- package/dist/contracts/orphans.js.map +1 -0
- package/dist/contracts/paths.d.ts +132 -0
- package/dist/contracts/paths.d.ts.map +1 -0
- package/dist/contracts/paths.js +245 -0
- package/dist/contracts/paths.js.map +1 -0
- package/dist/contracts/shapes.d.ts +99 -0
- package/dist/contracts/shapes.d.ts.map +1 -0
- package/dist/contracts/shapes.js +196 -0
- package/dist/contracts/shapes.js.map +1 -0
- package/dist/governance/budget.d.ts +89 -0
- package/dist/governance/budget.d.ts.map +1 -0
- package/dist/governance/budget.js +101 -0
- package/dist/governance/budget.js.map +1 -0
- package/dist/governance/candidate-boundary.d.ts +49 -0
- package/dist/governance/candidate-boundary.d.ts.map +1 -0
- package/dist/governance/candidate-boundary.js +51 -0
- package/dist/governance/candidate-boundary.js.map +1 -0
- package/dist/governance/escalation.d.ts +63 -0
- package/dist/governance/escalation.d.ts.map +1 -0
- package/dist/governance/escalation.js +72 -0
- package/dist/governance/escalation.js.map +1 -0
- package/dist/governance/fact-boundary.d.ts +77 -0
- package/dist/governance/fact-boundary.d.ts.map +1 -0
- package/dist/governance/fact-boundary.js +91 -0
- package/dist/governance/fact-boundary.js.map +1 -0
- package/dist/governance/finding-funnel.d.ts +109 -0
- package/dist/governance/finding-funnel.d.ts.map +1 -0
- package/dist/governance/finding-funnel.js +137 -0
- package/dist/governance/finding-funnel.js.map +1 -0
- package/dist/governance/index.d.ts +11 -0
- package/dist/governance/index.d.ts.map +1 -0
- package/dist/governance/index.js +6 -0
- package/dist/governance/index.js.map +1 -0
- package/dist/graph/build.d.ts +127 -0
- package/dist/graph/build.d.ts.map +1 -0
- package/dist/graph/build.js +0 -0
- package/dist/graph/build.js.map +1 -0
- package/dist/graph/cross-language.d.ts +70 -0
- package/dist/graph/cross-language.d.ts.map +1 -0
- package/dist/graph/cross-language.js +104 -0
- package/dist/graph/cross-language.js.map +1 -0
- package/dist/graph/index.d.ts +11 -0
- package/dist/graph/index.d.ts.map +1 -0
- package/dist/graph/index.js +6 -0
- package/dist/graph/index.js.map +1 -0
- package/dist/graph/merge.d.ts +95 -0
- package/dist/graph/merge.d.ts.map +1 -0
- package/dist/graph/merge.js +131 -0
- package/dist/graph/merge.js.map +1 -0
- package/dist/graph/persist.d.ts +42 -0
- package/dist/graph/persist.d.ts.map +1 -0
- package/dist/graph/persist.js +52 -0
- package/dist/graph/persist.js.map +1 -0
- package/dist/graph/runtime-confirmation.d.ts +169 -0
- package/dist/graph/runtime-confirmation.d.ts.map +1 -0
- package/dist/graph/runtime-confirmation.js +318 -0
- package/dist/graph/runtime-confirmation.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/ledger/index.d.ts +5 -0
- package/dist/ledger/index.d.ts.map +1 -0
- package/dist/ledger/index.js +3 -0
- package/dist/ledger/index.js.map +1 -0
- package/dist/ledger/mint.d.ts +81 -0
- package/dist/ledger/mint.d.ts.map +1 -0
- package/dist/ledger/mint.js +138 -0
- package/dist/ledger/mint.js.map +1 -0
- package/dist/ledger/resolve.d.ts +124 -0
- package/dist/ledger/resolve.d.ts.map +1 -0
- package/dist/ledger/resolve.js +290 -0
- package/dist/ledger/resolve.js.map +1 -0
- package/dist/multipr/fingerprint.d.ts +56 -0
- package/dist/multipr/fingerprint.d.ts.map +1 -0
- package/dist/multipr/fingerprint.js +169 -0
- package/dist/multipr/fingerprint.js.map +1 -0
- package/dist/multipr/hidden-dependency.d.ts +120 -0
- package/dist/multipr/hidden-dependency.d.ts.map +1 -0
- package/dist/multipr/hidden-dependency.js +185 -0
- package/dist/multipr/hidden-dependency.js.map +1 -0
- package/dist/multipr/index.d.ts +14 -0
- package/dist/multipr/index.d.ts.map +1 -0
- package/dist/multipr/index.js +8 -0
- package/dist/multipr/index.js.map +1 -0
- package/dist/multipr/mechanical.d.ts +239 -0
- package/dist/multipr/mechanical.d.ts.map +1 -0
- package/dist/multipr/mechanical.js +333 -0
- package/dist/multipr/mechanical.js.map +1 -0
- package/dist/multipr/migration-heads.d.ts +160 -0
- package/dist/multipr/migration-heads.d.ts.map +1 -0
- package/dist/multipr/migration-heads.js +212 -0
- package/dist/multipr/migration-heads.js.map +1 -0
- package/dist/multipr/overlap.d.ts +186 -0
- package/dist/multipr/overlap.d.ts.map +1 -0
- package/dist/multipr/overlap.js +254 -0
- package/dist/multipr/overlap.js.map +1 -0
- package/dist/multipr/scope-store.d.ts +105 -0
- package/dist/multipr/scope-store.d.ts.map +1 -0
- package/dist/multipr/scope-store.js +182 -0
- package/dist/multipr/scope-store.js.map +1 -0
- package/dist/multipr/superseded.d.ts +133 -0
- package/dist/multipr/superseded.d.ts.map +1 -0
- package/dist/multipr/superseded.js +128 -0
- package/dist/multipr/superseded.js.map +1 -0
- package/dist/query/confirmed-facts.d.ts +56 -0
- package/dist/query/confirmed-facts.d.ts.map +1 -0
- package/dist/query/confirmed-facts.js +64 -0
- package/dist/query/confirmed-facts.js.map +1 -0
- package/dist/query/declared-value-closure.d.ts +126 -0
- package/dist/query/declared-value-closure.d.ts.map +1 -0
- package/dist/query/declared-value-closure.js +156 -0
- package/dist/query/declared-value-closure.js.map +1 -0
- package/dist/query/index.d.ts +28 -0
- package/dist/query/index.d.ts.map +1 -0
- package/dist/query/index.js +15 -0
- package/dist/query/index.js.map +1 -0
- package/dist/query/memory.d.ts +20 -0
- package/dist/query/memory.d.ts.map +1 -0
- package/dist/query/memory.js +55 -0
- package/dist/query/memory.js.map +1 -0
- package/dist/query/provider.d.ts +127 -0
- package/dist/query/provider.d.ts.map +1 -0
- package/dist/query/provider.js +54 -0
- package/dist/query/provider.js.map +1 -0
- package/dist/query/queries.d.ts +119 -0
- package/dist/query/queries.d.ts.map +1 -0
- package/dist/query/queries.js +267 -0
- package/dist/query/queries.js.map +1 -0
- package/dist/query/refusal-fetch.d.ts +114 -0
- package/dist/query/refusal-fetch.d.ts.map +1 -0
- package/dist/query/refusal-fetch.js +200 -0
- package/dist/query/refusal-fetch.js.map +1 -0
- package/dist/query/refusal-questions.d.ts +123 -0
- package/dist/query/refusal-questions.d.ts.map +1 -0
- package/dist/query/refusal-questions.js +122 -0
- package/dist/query/refusal-questions.js.map +1 -0
- package/dist/query/root-cause-score.d.ts +218 -0
- package/dist/query/root-cause-score.d.ts.map +1 -0
- package/dist/query/root-cause-score.js +251 -0
- package/dist/query/root-cause-score.js.map +1 -0
- package/dist/query/row-closure-picture.d.ts +108 -0
- package/dist/query/row-closure-picture.d.ts.map +1 -0
- package/dist/query/row-closure-picture.js +131 -0
- package/dist/query/row-closure-picture.js.map +1 -0
- package/dist/query/similar-incidents.d.ts +76 -0
- package/dist/query/similar-incidents.d.ts.map +1 -0
- package/dist/query/similar-incidents.js +169 -0
- package/dist/query/similar-incidents.js.map +1 -0
- package/dist/query/sqlite.d.ts +13 -0
- package/dist/query/sqlite.d.ts.map +1 -0
- package/dist/query/sqlite.js +54 -0
- package/dist/query/sqlite.js.map +1 -0
- package/dist/query/traverse.d.ts +110 -0
- package/dist/query/traverse.d.ts.map +1 -0
- package/dist/query/traverse.js +0 -0
- package/dist/query/traverse.js.map +1 -0
- package/dist/query/unresolved.d.ts +195 -0
- package/dist/query/unresolved.d.ts.map +1 -0
- package/dist/query/unresolved.js +225 -0
- package/dist/query/unresolved.js.map +1 -0
- package/dist/query/verification-status.d.ts +134 -0
- package/dist/query/verification-status.d.ts.map +1 -0
- package/dist/query/verification-status.js +163 -0
- package/dist/query/verification-status.js.map +1 -0
- package/dist/recording/index.d.ts +26 -0
- package/dist/recording/index.d.ts.map +1 -0
- package/dist/recording/index.js +30 -0
- package/dist/recording/index.js.map +1 -0
- package/dist/recording/migrate.d.ts +22 -0
- package/dist/recording/migrate.d.ts.map +1 -0
- package/dist/recording/migrate.js +51 -0
- package/dist/recording/migrate.js.map +1 -0
- package/dist/recording/reader.d.ts +27 -0
- package/dist/recording/reader.d.ts.map +1 -0
- package/dist/recording/reader.js +55 -0
- package/dist/recording/reader.js.map +1 -0
- package/dist/recording/redact.d.ts +63 -0
- package/dist/recording/redact.d.ts.map +1 -0
- package/dist/recording/redact.js +98 -0
- package/dist/recording/redact.js.map +1 -0
- package/dist/recording/schema.d.ts +41 -0
- package/dist/recording/schema.d.ts.map +1 -0
- package/dist/recording/schema.js +104 -0
- package/dist/recording/schema.js.map +1 -0
- package/dist/recording/writer.d.ts +120 -0
- package/dist/recording/writer.d.ts.map +1 -0
- package/dist/recording/writer.js +81 -0
- package/dist/recording/writer.js.map +1 -0
- package/dist/scoping/fanout.d.ts +86 -0
- package/dist/scoping/fanout.d.ts.map +1 -0
- package/dist/scoping/fanout.js +95 -0
- package/dist/scoping/fanout.js.map +1 -0
- package/dist/scoping/index.d.ts +10 -0
- package/dist/scoping/index.d.ts.map +1 -0
- package/dist/scoping/index.js +6 -0
- package/dist/scoping/index.js.map +1 -0
- package/dist/scoping/score.d.ts +83 -0
- package/dist/scoping/score.d.ts.map +1 -0
- package/dist/scoping/score.js +125 -0
- package/dist/scoping/score.js.map +1 -0
- package/dist/scoping/tiers.d.ts +32 -0
- package/dist/scoping/tiers.d.ts.map +1 -0
- package/dist/scoping/tiers.js +35 -0
- package/dist/scoping/tiers.js.map +1 -0
- package/dist/scoping/traverse.d.ts +60 -0
- package/dist/scoping/traverse.d.ts.map +1 -0
- package/dist/scoping/traverse.js +172 -0
- package/dist/scoping/traverse.js.map +1 -0
- package/dist/scoping/weights.d.ts +97 -0
- package/dist/scoping/weights.d.ts.map +1 -0
- package/dist/scoping/weights.js +167 -0
- package/dist/scoping/weights.js.map +1 -0
- package/dist/sources/git/diff.d.ts +53 -0
- package/dist/sources/git/diff.d.ts.map +1 -0
- package/dist/sources/git/diff.js +140 -0
- package/dist/sources/git/diff.js.map +1 -0
- package/dist/sources/git/env.d.ts +2 -0
- package/dist/sources/git/env.d.ts.map +1 -0
- package/dist/sources/git/env.js +21 -0
- package/dist/sources/git/env.js.map +1 -0
- package/dist/sources/git/history.d.ts +140 -0
- package/dist/sources/git/history.d.ts.map +1 -0
- package/dist/sources/git/history.js +314 -0
- package/dist/sources/git/history.js.map +1 -0
- package/dist/sources/git/index.d.ts +7 -0
- package/dist/sources/git/index.d.ts.map +1 -0
- package/dist/sources/git/index.js +4 -0
- package/dist/sources/git/index.js.map +1 -0
- package/dist/sources/git/source.d.ts +95 -0
- package/dist/sources/git/source.d.ts.map +1 -0
- package/dist/sources/git/source.js +0 -0
- package/dist/sources/git/source.js.map +1 -0
- package/dist/sources/migrations/dialects.d.ts +59 -0
- package/dist/sources/migrations/dialects.d.ts.map +1 -0
- package/dist/sources/migrations/dialects.js +84 -0
- package/dist/sources/migrations/dialects.js.map +1 -0
- package/dist/sources/migrations/index.d.ts +3 -0
- package/dist/sources/migrations/index.d.ts.map +1 -0
- package/dist/sources/migrations/index.js +2 -0
- package/dist/sources/migrations/index.js.map +1 -0
- package/dist/sources/migrations/read.d.ts +113 -0
- package/dist/sources/migrations/read.d.ts.map +1 -0
- package/dist/sources/migrations/read.js +270 -0
- package/dist/sources/migrations/read.js.map +1 -0
- package/dist/sources/workspace/index.d.ts +3 -0
- package/dist/sources/workspace/index.d.ts.map +1 -0
- package/dist/sources/workspace/index.js +2 -0
- package/dist/sources/workspace/index.js.map +1 -0
- package/dist/sources/workspace/workspace.d.ts +64 -0
- package/dist/sources/workspace/workspace.d.ts.map +1 -0
- package/dist/sources/workspace/workspace.js +294 -0
- package/dist/sources/workspace/workspace.js.map +1 -0
- package/dist/store/driver/driver.d.ts +82 -0
- package/dist/store/driver/driver.d.ts.map +1 -0
- package/dist/store/driver/driver.js +31 -0
- package/dist/store/driver/driver.js.map +1 -0
- package/dist/store/driver/node-sqlite.d.ts +28 -0
- package/dist/store/driver/node-sqlite.d.ts.map +1 -0
- package/dist/store/driver/node-sqlite.js +188 -0
- package/dist/store/driver/node-sqlite.js.map +1 -0
- package/dist/store/index.d.ts +33 -0
- package/dist/store/index.d.ts.map +1 -0
- package/dist/store/index.js +46 -0
- package/dist/store/index.js.map +1 -0
- package/dist/store/migrate.d.ts +68 -0
- package/dist/store/migrate.d.ts.map +1 -0
- package/dist/store/migrate.js +140 -0
- package/dist/store/migrate.js.map +1 -0
- package/dist/store/reader.d.ts +127 -0
- package/dist/store/reader.d.ts.map +1 -0
- package/dist/store/reader.js +269 -0
- package/dist/store/reader.js.map +1 -0
- package/dist/store/schema.d.ts +87 -0
- package/dist/store/schema.d.ts.map +1 -0
- package/dist/store/schema.js +322 -0
- package/dist/store/schema.js.map +1 -0
- package/dist/store/writer.d.ts +116 -0
- package/dist/store/writer.d.ts.map +1 -0
- package/dist/store/writer.js +279 -0
- package/dist/store/writer.js.map +1 -0
- package/dist/tiers/certify.d.ts +375 -0
- package/dist/tiers/certify.d.ts.map +1 -0
- package/dist/tiers/certify.js +434 -0
- package/dist/tiers/certify.js.map +1 -0
- package/dist/tiers/index.d.ts +5 -0
- package/dist/tiers/index.d.ts.map +1 -0
- package/dist/tiers/index.js +3 -0
- package/dist/tiers/index.js.map +1 -0
- package/dist/tiers/ladder.d.ts +73 -0
- package/dist/tiers/ladder.d.ts.map +1 -0
- package/dist/tiers/ladder.js +197 -0
- package/dist/tiers/ladder.js.map +1 -0
- package/dist/validation/config-graph.d.ts +104 -0
- package/dist/validation/config-graph.d.ts.map +1 -0
- package/dist/validation/config-graph.js +205 -0
- package/dist/validation/config-graph.js.map +1 -0
- package/dist/validation/env.d.ts +243 -0
- package/dist/validation/env.d.ts.map +1 -0
- package/dist/validation/env.js +447 -0
- package/dist/validation/env.js.map +1 -0
- package/dist/validation/index.d.ts +16 -0
- package/dist/validation/index.d.ts.map +1 -0
- package/dist/validation/index.js +9 -0
- package/dist/validation/index.js.map +1 -0
- package/dist/validation/join-substitution.d.ts +186 -0
- package/dist/validation/join-substitution.d.ts.map +1 -0
- package/dist/validation/join-substitution.js +191 -0
- package/dist/validation/join-substitution.js.map +1 -0
- package/dist/validation/migrations.d.ts +133 -0
- package/dist/validation/migrations.d.ts.map +1 -0
- package/dist/validation/migrations.js +315 -0
- package/dist/validation/migrations.js.map +1 -0
- package/dist/validation/nodes.d.ts +32 -0
- package/dist/validation/nodes.d.ts.map +1 -0
- package/dist/validation/nodes.js +45 -0
- package/dist/validation/nodes.js.map +1 -0
- package/dist/validation/rollback.d.ts +124 -0
- package/dist/validation/rollback.d.ts.map +1 -0
- package/dist/validation/rollback.js +302 -0
- package/dist/validation/rollback.js.map +1 -0
- package/dist/validation/route-drift.d.ts +108 -0
- package/dist/validation/route-drift.d.ts.map +1 -0
- package/dist/validation/route-drift.js +103 -0
- package/dist/validation/route-drift.js.map +1 -0
- package/dist/validation/sources.d.ts +153 -0
- package/dist/validation/sources.d.ts.map +1 -0
- package/dist/validation/sources.js +409 -0
- package/dist/validation/sources.js.map +1 -0
- package/dist/worker/index.d.ts +5 -0
- package/dist/worker/index.d.ts.map +1 -0
- package/dist/worker/index.js +3 -0
- package/dist/worker/index.js.map +1 -0
- package/dist/worker/pool.d.ts +73 -0
- package/dist/worker/pool.d.ts.map +1 -0
- package/dist/worker/pool.js +203 -0
- package/dist/worker/pool.js.map +1 -0
- package/dist/worker/protocol.d.ts +91 -0
- package/dist/worker/protocol.d.ts.map +1 -0
- package/dist/worker/protocol.js +19 -0
- package/dist/worker/protocol.js.map +1 -0
- package/dist/worker/traversal.worker.d.ts +25 -0
- package/dist/worker/traversal.worker.d.ts.map +1 -0
- package/dist/worker/traversal.worker.js +124 -0
- package/dist/worker/traversal.worker.js.map +1 -0
- package/package.json +29 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../src/graph/merge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAElD,wFAAwF;AACxF,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,GAAG,OAAO,CAQhF;AAED;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,gSAMhC,CAAC;AAEF,mFAAmF;AACnF,eAAO,MAAM,oBAAoB,6IAGhC,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,SAAS,EACvD,GAAG,SAAS,EAAE,MAAM,EAAE,GACrB,MAAM,EAAE,CAKV;AAED,oFAAoF;AACpF,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAWpE;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAcpE;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAExD"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The merge policy — DEC-012.
|
|
3
|
+
*
|
|
4
|
+
* Two adapters finding the same relationship produce the same edge id, by
|
|
5
|
+
* construction: `hash(from, to, type)` deliberately excludes resolution,
|
|
6
|
+
* confidence and producer. On the prior-art graphs measured for this build, 30%
|
|
7
|
+
* of edges were exact duplicates, so this is the common path rather than an
|
|
8
|
+
* edge case.
|
|
9
|
+
*
|
|
10
|
+
* ## The rule
|
|
11
|
+
*
|
|
12
|
+
* higher `resolution` wins
|
|
13
|
+
* → tie: higher `confidence` wins
|
|
14
|
+
* → tie: lexicographically smaller `producedBy` wins
|
|
15
|
+
*
|
|
16
|
+
* ## What the rule refuses to do
|
|
17
|
+
*
|
|
18
|
+
* **Confidence is never combined.** Two adapters each 0.8 confident does not
|
|
19
|
+
* make 0.96, or 0.8, or anything else — there is no evidence-combination model
|
|
20
|
+
* here, the two adapters are not independent observers, and inventing a formula
|
|
21
|
+
* would silently move every impact score in §12.4 with nothing in the output to
|
|
22
|
+
* show it happened. Corroboration is recorded as a fact (`attrs.corroboratedBy`)
|
|
23
|
+
* rather than folded into a number.
|
|
24
|
+
*
|
|
25
|
+
* The third tie-break exists only to make the result independent of the order
|
|
26
|
+
* batches arrive in. Lexicographic order is arbitrary; determinism is not.
|
|
27
|
+
*
|
|
28
|
+
* ## Why the rule is written twice
|
|
29
|
+
*
|
|
30
|
+
* The merge has to hold in two places: in memory, when the Graph Builder folds
|
|
31
|
+
* several batches together, and in SQL, when a later batch upserts onto an edge
|
|
32
|
+
* an earlier one already wrote. A rule enforced in only the first is not
|
|
33
|
+
* enforced at all, because the writer is reachable directly.
|
|
34
|
+
*
|
|
35
|
+
* So it appears as a TypeScript predicate and as a SQL `WHERE` fragment, side by
|
|
36
|
+
* side, with a differential test that runs the same case table through both.
|
|
37
|
+
* Two copies with a test that they agree beats one copy that only covers one of
|
|
38
|
+
* the two paths.
|
|
39
|
+
*/
|
|
40
|
+
/**
|
|
41
|
+
* Should `incoming` replace `existing`?
|
|
42
|
+
*
|
|
43
|
+
* Strict: an exact tie on all three keeps what is already there, so re-ingesting
|
|
44
|
+
* the same batch is a no-op rather than a rewrite.
|
|
45
|
+
*/
|
|
46
|
+
export function preferIncoming(incoming, existing) {
|
|
47
|
+
if (incoming.resolution !== existing.resolution) {
|
|
48
|
+
return incoming.resolution > existing.resolution;
|
|
49
|
+
}
|
|
50
|
+
if (incoming.confidence !== existing.confidence) {
|
|
51
|
+
return incoming.confidence > existing.confidence;
|
|
52
|
+
}
|
|
53
|
+
return incoming.producedBy < existing.producedBy;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* The same rule as a SQL `WHERE` clause on an upsert's `DO UPDATE`.
|
|
57
|
+
*
|
|
58
|
+
* `excluded` is the incoming row, `edges` the one already stored — SQLite's
|
|
59
|
+
* upsert names them that way. Kept adjacent to `preferIncoming` on purpose:
|
|
60
|
+
* `merge.test.ts` runs one case table through both and fails if they disagree.
|
|
61
|
+
*/
|
|
62
|
+
export const EDGE_MERGE_CONDITION = `
|
|
63
|
+
excluded.resolution > edges.resolution
|
|
64
|
+
OR (excluded.resolution = edges.resolution AND excluded.confidence > edges.confidence)
|
|
65
|
+
OR (excluded.resolution = edges.resolution
|
|
66
|
+
AND excluded.confidence = edges.confidence
|
|
67
|
+
AND excluded.produced_by < edges.produced_by)
|
|
68
|
+
`;
|
|
69
|
+
/** The same, for nodes. Nodes carry no confidence, so the middle key drops out. */
|
|
70
|
+
export const NODE_MERGE_CONDITION = `
|
|
71
|
+
excluded.resolution > nodes.resolution
|
|
72
|
+
OR (excluded.resolution = nodes.resolution AND excluded.produced_by < nodes.produced_by)
|
|
73
|
+
`;
|
|
74
|
+
/**
|
|
75
|
+
* Producers that corroborated a merged item, sorted and de-duplicated.
|
|
76
|
+
*
|
|
77
|
+
* DEC-012 records this instead of combining confidence. It is not decoration:
|
|
78
|
+
* "two independent adapters agree" is a materially different statement from "one
|
|
79
|
+
* adapter is fairly sure", and it is the only form in which the graph can carry
|
|
80
|
+
* that distinction without inventing an evidence model.
|
|
81
|
+
*/
|
|
82
|
+
export function corroborators(existing, ...producers) {
|
|
83
|
+
const prior = existing?.["corroboratedBy"];
|
|
84
|
+
const all = new Set(Array.isArray(prior) ? prior : []);
|
|
85
|
+
for (const p of producers)
|
|
86
|
+
all.add(p);
|
|
87
|
+
return [...all].sort();
|
|
88
|
+
}
|
|
89
|
+
/** Merge two edges that share an id. Returns the winner, carrying corroboration. */
|
|
90
|
+
export function mergeEdge(incoming, existing) {
|
|
91
|
+
const winner = preferIncoming(incoming, existing) ? incoming : existing;
|
|
92
|
+
const corroboratedBy = corroborators({ ...existing.attrs, ...incoming.attrs }, existing.producedBy, incoming.producedBy);
|
|
93
|
+
return {
|
|
94
|
+
...winner,
|
|
95
|
+
attrs: { ...(winner.attrs ?? {}), corroboratedBy },
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Merge two nodes that share an id.
|
|
100
|
+
*
|
|
101
|
+
* Attributes are NOT unioned. `attrs` is language- and framework-specific detail
|
|
102
|
+
* (§11A.4), so pooling two adapters' attributes would produce a node describing
|
|
103
|
+
* a thing that does not exist. The winner's attrs are kept whole and the loser is
|
|
104
|
+
* recorded as a corroborator.
|
|
105
|
+
*/
|
|
106
|
+
export function mergeNode(incoming, existing) {
|
|
107
|
+
const winner = preferIncoming({ ...incoming, confidence: 0 }, { ...existing, confidence: 0 })
|
|
108
|
+
? incoming
|
|
109
|
+
: existing;
|
|
110
|
+
return {
|
|
111
|
+
...winner,
|
|
112
|
+
attrs: {
|
|
113
|
+
...winner.attrs,
|
|
114
|
+
corroboratedBy: corroborators(existing.attrs, existing.producedBy, incoming.producedBy),
|
|
115
|
+
},
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* The fields two nodes sharing an id must agree on.
|
|
120
|
+
*
|
|
121
|
+
* Compared as one opaque string rather than field by field. That is not only
|
|
122
|
+
* tidier: `n.language !== m.language` reads to the boundary lint as branching on
|
|
123
|
+
* a language, and the lint is right to be suspicious — the exception here is
|
|
124
|
+
* that this asks whether two nodes *disagree*, never which language either one
|
|
125
|
+
* is. Folding both fields into a fingerprint states that intent in the code
|
|
126
|
+
* rather than in a lint suppression.
|
|
127
|
+
*/
|
|
128
|
+
export function identityFingerprint(node) {
|
|
129
|
+
return JSON.stringify([node.type, node.language]);
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=merge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge.js","sourceRoot":"","sources":["../../src/graph/merge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAWH;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,QAAmB,EAAE,QAAmB;IACrE,IAAI,QAAQ,CAAC,UAAU,KAAK,QAAQ,CAAC,UAAU,EAAE,CAAC;QAChD,OAAO,QAAQ,CAAC,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC;IACnD,CAAC;IACD,IAAI,QAAQ,CAAC,UAAU,KAAK,QAAQ,CAAC,UAAU,EAAE,CAAC;QAChD,OAAO,QAAQ,CAAC,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC;IACnD,CAAC;IACD,OAAO,QAAQ,CAAC,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC;AACnD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG;;;;;;CAMnC,CAAC;AAEF,mFAAmF;AACnF,MAAM,CAAC,MAAM,oBAAoB,GAAG;;;CAGnC,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAC3B,QAAuD,EACvD,GAAG,SAAmB;IAEtB,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC,gBAAgB,CAAC,CAAC;IAC3C,MAAM,GAAG,GAAG,IAAI,GAAG,CAAS,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAE,KAAkB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC7E,KAAK,MAAM,CAAC,IAAI,SAAS;QAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACtC,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AACzB,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,SAAS,CAAC,QAAgB,EAAE,QAAgB;IAC1D,MAAM,MAAM,GAAG,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;IACxE,MAAM,cAAc,GAAG,aAAa,CAClC,EAAE,GAAG,QAAQ,CAAC,KAAK,EAAE,GAAG,QAAQ,CAAC,KAAK,EAAE,EACxC,QAAQ,CAAC,UAAU,EACnB,QAAQ,CAAC,UAAU,CACpB,CAAC;IACF,OAAO;QACL,GAAG,MAAM;QACT,KAAK,EAAE,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,cAAc,EAAE;KACnD,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,SAAS,CAAC,QAAgB,EAAE,QAAgB;IAC1D,MAAM,MAAM,GAAG,cAAc,CAC3B,EAAE,GAAG,QAAQ,EAAE,UAAU,EAAE,CAAC,EAAE,EAC9B,EAAE,GAAG,QAAQ,EAAE,UAAU,EAAE,CAAC,EAAE,CAC/B;QACC,CAAC,CAAC,QAAQ;QACV,CAAC,CAAC,QAAQ,CAAC;IACb,OAAO;QACL,GAAG,MAAM;QACT,KAAK,EAAE;YACL,GAAG,MAAM,CAAC,KAAK;YACf,cAAc,EAAE,aAAa,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC;SACxF;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;AACpD,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Writing a built graph back out, split by producer.
|
|
3
|
+
*
|
|
4
|
+
* `buildGraph` merges many producers into one graph; `writeBatch` invalidates
|
|
5
|
+
* and writes **one producer's** rows at a time, because DEC-014's invalidation
|
|
6
|
+
* rule is per-adapter — re-running the Python adapter must not evict the
|
|
7
|
+
* TypeScript adapter's rows. So the merged graph has to be partitioned back
|
|
8
|
+
* before it can be stored.
|
|
9
|
+
*
|
|
10
|
+
* That partition was written out by hand in every bench script that has ever
|
|
11
|
+
* stored a graph, identically, five times. It is not a measurement concern: it
|
|
12
|
+
* is the engine's own write path, and the MCP server needs it too. Lifted here
|
|
13
|
+
* so there is one copy and one place for it to be wrong.
|
|
14
|
+
*
|
|
15
|
+
* ## The subtlety worth stating
|
|
16
|
+
*
|
|
17
|
+
* The rows written for a producer are the **post-merge** ones, not the batch's
|
|
18
|
+
* originals. A node supplied by two adapters is merged (DEC-012) and the merged
|
|
19
|
+
* row carries the winning `producedBy`; writing the pre-merge originals would
|
|
20
|
+
* store the losing version under the loser's producer and then let the next
|
|
21
|
+
* incremental run resurrect it. Filtering the merged graph by `producedBy` is
|
|
22
|
+
* what makes the store agree with the builder.
|
|
23
|
+
*
|
|
24
|
+
* A batch that contributed nothing after the merge is still written, with empty
|
|
25
|
+
* rows, on purpose: that is how a re-run that *removes* a symbol evicts the row
|
|
26
|
+
* it used to own. Skipping empty batches would make deletions invisible.
|
|
27
|
+
*/
|
|
28
|
+
import type { IRBatch } from "@descryy/ir";
|
|
29
|
+
import type { SqlDriver } from "../store/driver/driver.ts";
|
|
30
|
+
import { type WriteOptions, type WriteResult } from "../store/writer.ts";
|
|
31
|
+
import type { BuildResult } from "./build.ts";
|
|
32
|
+
export interface PersistResult {
|
|
33
|
+
readonly writes: readonly WriteResult[];
|
|
34
|
+
readonly nodesWritten: number;
|
|
35
|
+
readonly edgesWritten: number;
|
|
36
|
+
readonly unresolvedWritten: number;
|
|
37
|
+
/** Union of every write's evictions — files a replaced run covered and this one did not. */
|
|
38
|
+
readonly evictedFiles: readonly string[];
|
|
39
|
+
readonly orphanedEdges: number;
|
|
40
|
+
}
|
|
41
|
+
export declare function persistGraph(driver: SqlDriver, batches: readonly IRBatch[], built: BuildResult, options?: WriteOptions): PersistResult;
|
|
42
|
+
//# sourceMappingURL=persist.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persist.d.ts","sourceRoot":"","sources":["../../src/graph/persist.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAc,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACrF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,CAAC;IACxC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,4FAA4F;IAC5F,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC;AAED,wBAAgB,YAAY,CAC1B,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,SAAS,OAAO,EAAE,EAC3B,KAAK,EAAE,WAAW,EAClB,OAAO,GAAE,YAAiB,GACzB,aAAa,CA6Bf"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Writing a built graph back out, split by producer.
|
|
3
|
+
*
|
|
4
|
+
* `buildGraph` merges many producers into one graph; `writeBatch` invalidates
|
|
5
|
+
* and writes **one producer's** rows at a time, because DEC-014's invalidation
|
|
6
|
+
* rule is per-adapter — re-running the Python adapter must not evict the
|
|
7
|
+
* TypeScript adapter's rows. So the merged graph has to be partitioned back
|
|
8
|
+
* before it can be stored.
|
|
9
|
+
*
|
|
10
|
+
* That partition was written out by hand in every bench script that has ever
|
|
11
|
+
* stored a graph, identically, five times. It is not a measurement concern: it
|
|
12
|
+
* is the engine's own write path, and the MCP server needs it too. Lifted here
|
|
13
|
+
* so there is one copy and one place for it to be wrong.
|
|
14
|
+
*
|
|
15
|
+
* ## The subtlety worth stating
|
|
16
|
+
*
|
|
17
|
+
* The rows written for a producer are the **post-merge** ones, not the batch's
|
|
18
|
+
* originals. A node supplied by two adapters is merged (DEC-012) and the merged
|
|
19
|
+
* row carries the winning `producedBy`; writing the pre-merge originals would
|
|
20
|
+
* store the losing version under the loser's producer and then let the next
|
|
21
|
+
* incremental run resurrect it. Filtering the merged graph by `producedBy` is
|
|
22
|
+
* what makes the store agree with the builder.
|
|
23
|
+
*
|
|
24
|
+
* A batch that contributed nothing after the merge is still written, with empty
|
|
25
|
+
* rows, on purpose: that is how a re-run that *removes* a symbol evicts the row
|
|
26
|
+
* it used to own. Skipping empty batches would make deletions invisible.
|
|
27
|
+
*/
|
|
28
|
+
import { writeBatch } from "../store/writer.js";
|
|
29
|
+
export function persistGraph(driver, batches, built, options = {}) {
|
|
30
|
+
const writes = [];
|
|
31
|
+
const evicted = new Set();
|
|
32
|
+
for (const batch of batches) {
|
|
33
|
+
writes.push(writeBatch(driver, {
|
|
34
|
+
...batch,
|
|
35
|
+
nodes: built.nodes.filter((node) => node.producedBy === batch.producedBy),
|
|
36
|
+
edges: built.edges.filter((edge) => edge.producedBy === batch.producedBy),
|
|
37
|
+
unresolved: built.unresolved.filter((ref) => ref.producedBy === batch.producedBy),
|
|
38
|
+
}, options));
|
|
39
|
+
}
|
|
40
|
+
for (const write of writes)
|
|
41
|
+
for (const file of write.evictedFiles)
|
|
42
|
+
evicted.add(file);
|
|
43
|
+
return {
|
|
44
|
+
writes,
|
|
45
|
+
nodesWritten: writes.reduce((n, w) => n + w.nodesWritten, 0),
|
|
46
|
+
edgesWritten: writes.reduce((n, w) => n + w.edgesWritten, 0),
|
|
47
|
+
unresolvedWritten: writes.reduce((n, w) => n + w.unresolvedWritten, 0),
|
|
48
|
+
evictedFiles: [...evicted].sort(),
|
|
49
|
+
orphanedEdges: writes.reduce((n, w) => n + w.orphanedEdges, 0),
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=persist.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persist.js","sourceRoot":"","sources":["../../src/graph/persist.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAKH,OAAO,EAAE,UAAU,EAAuC,MAAM,oBAAoB,CAAC;AAarF,MAAM,UAAU,YAAY,CAC1B,MAAiB,EACjB,OAA2B,EAC3B,KAAkB,EAClB,UAAwB,EAAE;IAE1B,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAElC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,CAAC,IAAI,CACT,UAAU,CACR,MAAM,EACN;YACE,GAAG,KAAK;YACR,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,KAAK,KAAK,CAAC,UAAU,CAAC;YACzE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,KAAK,KAAK,CAAC,UAAU,CAAC;YACzE,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,KAAK,KAAK,CAAC,UAAU,CAAC;SAClF,EACD,OAAO,CACR,CACF,CAAC;IACJ,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,MAAM;QAAE,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,YAAY;YAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAErF,OAAO;QACL,MAAM;QACN,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC;QAC5D,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC;QAC5D,iBAAiB,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,iBAAiB,EAAE,CAAC,CAAC;QACtE,YAAY,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,EAAE;QACjC,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC;KAC/D,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime confirmation — architecture §11B.3, the R4 half of the moat.
|
|
3
|
+
*
|
|
4
|
+
* > *"A purely static code-graph tool is capped at R3 permanently. It has no
|
|
5
|
+
* > runtime. This is the one accuracy source that cannot be copied without
|
|
6
|
+
* > also building the testing half, and it should be treated as the core
|
|
7
|
+
* > technical moat rather than the graph itself."* — §11B.3
|
|
8
|
+
*
|
|
9
|
+
* The schema has held `observed_edges` and `edge_corrections` since the store
|
|
10
|
+
* was first written, both on the EARNED side of DEC-017's partition, both
|
|
11
|
+
* carrying a comment explaining why they cannot be recomputed. **Nothing read
|
|
12
|
+
* or wrote either one.** This module is what they were for.
|
|
13
|
+
*
|
|
14
|
+
* ## The three arrows §11B.3 draws, and where each one lands
|
|
15
|
+
*
|
|
16
|
+
* | Observation | What happens |
|
|
17
|
+
* | --- | --- |
|
|
18
|
+
* | confirms an edge the graph already has, below R4 | **promote** to R4, `observed_by_run` set |
|
|
19
|
+
* | confirms an edge the graph does not have | **create** it at R4 — "recall gap closed" |
|
|
20
|
+
* | denies an edge the graph has, below R4 | **correct** it: an `edge_corrections` row, and a {@link GraphDefectRecord} out |
|
|
21
|
+
*
|
|
22
|
+
* ## Why a denial demotes confidence and does not delete the edge
|
|
23
|
+
*
|
|
24
|
+
* `edges` is DERIVED. Deleting a row there is undone by the next index, which
|
|
25
|
+
* regenerates the identical guess from the identical source and has no memory
|
|
26
|
+
* of the run that disproved it — the correction would evaporate exactly when
|
|
27
|
+
* it was needed again. §11B.5 already states the answer: corrections are
|
|
28
|
+
* *"stored as graph overrides keyed by stable node IDs, surviving re-index and
|
|
29
|
+
* adapter upgrades."* So the durable statement is the `edge_corrections` row,
|
|
30
|
+
* and the effect on the derived graph is a confidence demotion that
|
|
31
|
+
* {@link reapplyEarnedOverlays} re-applies after every rebuild.
|
|
32
|
+
*
|
|
33
|
+
* Demotion rather than deletion is also DEC-284's own stated direction — *"it
|
|
34
|
+
* fails toward demote, which is the safe direction"* — and it keeps rule 2
|
|
35
|
+
* intact from the other side: a wrong edge stops being load-bearing without
|
|
36
|
+
* the graph asserting a *new* fact (that the call does not exist) that no
|
|
37
|
+
* single observation actually establishes.
|
|
38
|
+
*
|
|
39
|
+
* ## What this module refuses to do
|
|
40
|
+
*
|
|
41
|
+
* - **Invent a node.** An observation naming a node this graph does not hold
|
|
42
|
+
* is refused with its reason, never created. Rule 2, and the same posture
|
|
43
|
+
* `correlateExecution` takes one layer down for an ambiguous resolution.
|
|
44
|
+
* - **Adjudicate R4 against R4.** A denial against an edge already at R4 is
|
|
45
|
+
* two runtime observations disagreeing across time — a staleness question
|
|
46
|
+
* whose policy is decided (DEC-284 + a 7-day backstop) but whose consumer
|
|
47
|
+
* does not exist yet. `contradiction.ts` excludes the case by construction
|
|
48
|
+
* and this module reports it as {@link RuntimeConfirmationResult.staleR4}
|
|
49
|
+
* rather than laundering it through a path that looks decided.
|
|
50
|
+
* - **Judge a finding.** Resolution has no opinion on confidence (RT-027).
|
|
51
|
+
* Nothing here reads or writes a finding, a hypothesis or a category.
|
|
52
|
+
*
|
|
53
|
+
* @see `packages/ir/src/contradiction.ts` — the pure detection this persists.
|
|
54
|
+
* @see `documents/plans/ai-layer-plan.md` §10 — *"the valuable half."*
|
|
55
|
+
*/
|
|
56
|
+
import { type EdgeType, type GraphDefectRecord, type RuntimeEdgeObservation } from "@descryy/ir";
|
|
57
|
+
import type { SqlDriver } from "../store/driver/driver.ts";
|
|
58
|
+
/** One observation this pass declined to act on, with the resolver's own reason. */
|
|
59
|
+
export interface RuntimeObservationRefusal {
|
|
60
|
+
readonly from: string;
|
|
61
|
+
readonly to: string;
|
|
62
|
+
readonly edgeType: EdgeType;
|
|
63
|
+
readonly reason: string;
|
|
64
|
+
}
|
|
65
|
+
/** A denial aimed at an edge already at R4 — out of scope here. See the module doc. */
|
|
66
|
+
export interface StaleR4Observation {
|
|
67
|
+
readonly edgeId: string;
|
|
68
|
+
readonly observedByRun: string | null;
|
|
69
|
+
readonly detail: string;
|
|
70
|
+
}
|
|
71
|
+
export interface RuntimeConfirmationInput {
|
|
72
|
+
/** The run that witnessed these observations. Becomes `edges.observed_by_run` and `observed_edges.run_id`. */
|
|
73
|
+
readonly runId: string;
|
|
74
|
+
/** The commit the observed application was built from. Stored so a later reader can tell whether the code has moved under the observation. */
|
|
75
|
+
readonly commitSha: string;
|
|
76
|
+
readonly observations: readonly RuntimeEdgeObservation[];
|
|
77
|
+
}
|
|
78
|
+
export interface RuntimeConfirmationResult {
|
|
79
|
+
/** Edge ids that moved from below R4 up to R4. */
|
|
80
|
+
readonly promoted: readonly string[];
|
|
81
|
+
/** Edge ids created at R4 because no static producer found them. */
|
|
82
|
+
readonly created: readonly string[];
|
|
83
|
+
/** Edge ids already at R4 and observed again — reported, never silently dropped. */
|
|
84
|
+
readonly confirmed: readonly string[];
|
|
85
|
+
/** Denials of a sub-R4 edge, shaped for the independent edge-precision check. */
|
|
86
|
+
readonly contradictions: readonly GraphDefectRecord[];
|
|
87
|
+
readonly staleR4: readonly StaleR4Observation[];
|
|
88
|
+
readonly refused: readonly RuntimeObservationRefusal[];
|
|
89
|
+
}
|
|
90
|
+
/** One row of the EARNED R4 ledger. */
|
|
91
|
+
export interface ObservedEdgeRow {
|
|
92
|
+
readonly edgeId: string;
|
|
93
|
+
readonly runId: string;
|
|
94
|
+
readonly from: string;
|
|
95
|
+
readonly to: string;
|
|
96
|
+
readonly edgeType: EdgeType;
|
|
97
|
+
readonly commitSha: string;
|
|
98
|
+
readonly observedAt: number;
|
|
99
|
+
}
|
|
100
|
+
/** One row of the EARNED correction ledger (§11B.5). */
|
|
101
|
+
export interface EdgeCorrectionRow {
|
|
102
|
+
readonly edgeId: string;
|
|
103
|
+
readonly verdict: "wrong" | "right";
|
|
104
|
+
readonly reason: string;
|
|
105
|
+
readonly correctedAt: number;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* A clock, injected so a test can pin `observed_at`/`corrected_at`. Same shape
|
|
109
|
+
* the store's own tests already use.
|
|
110
|
+
*/
|
|
111
|
+
export interface Clock {
|
|
112
|
+
now(): number;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Apply a run's edge observations to the graph, writing the earned record and
|
|
116
|
+
* projecting it onto the derived edges in one transaction.
|
|
117
|
+
*
|
|
118
|
+
* Pure with respect to its inputs and total over them: every observation lands
|
|
119
|
+
* in exactly one of the six result arrays, so a caller can account for all of
|
|
120
|
+
* them without inspecting the store. Never throws for an observation it cannot
|
|
121
|
+
* act on — that is a refusal, per the five-result-states rule the tool contract
|
|
122
|
+
* applies one layer up.
|
|
123
|
+
*/
|
|
124
|
+
export declare function applyRuntimeObservations(driver: SqlDriver, input: RuntimeConfirmationInput, clock?: Clock): RuntimeConfirmationResult;
|
|
125
|
+
/**
|
|
126
|
+
* Re-project the EARNED ledgers onto a freshly rebuilt derived graph.
|
|
127
|
+
*
|
|
128
|
+
* **This is what makes the DEC-017 partition pay.** `dropDerived()` removes
|
|
129
|
+
* `edges` and leaves `observed_edges`/`edge_corrections` standing; a re-index
|
|
130
|
+
* then regenerates the same static guesses, at their static resolutions, with
|
|
131
|
+
* no memory of any run. Without this call the moat is silently reset on every
|
|
132
|
+
* rebuild — the edges would be back at R2 and the R4 rows would sit in a table
|
|
133
|
+
* nothing consults, which is indistinguishable from never having observed
|
|
134
|
+
* anything.
|
|
135
|
+
*
|
|
136
|
+
* Observations whose endpoints no longer exist are reported as refusals rather
|
|
137
|
+
* than recreated: the code moved, and re-minting a node from an old run's
|
|
138
|
+
* record would be the same rule-2 violation one rebuild later.
|
|
139
|
+
*/
|
|
140
|
+
export declare function reapplyEarnedOverlays(driver: SqlDriver): RuntimeConfirmationResult;
|
|
141
|
+
/** Every row of the EARNED R4 ledger, oldest first, optionally for one run. */
|
|
142
|
+
export declare function observedEdges(driver: SqlDriver, options?: {
|
|
143
|
+
readonly runId?: string;
|
|
144
|
+
}): ObservedEdgeRow[];
|
|
145
|
+
/** Every row of the EARNED correction ledger (§11B.5), oldest first. */
|
|
146
|
+
export declare function edgeCorrections(driver: SqlDriver): EdgeCorrectionRow[];
|
|
147
|
+
/**
|
|
148
|
+
* Record a human's verdict on an edge — §11B.5's other producer.
|
|
149
|
+
*
|
|
150
|
+
* *"On one team's codebase, a few hundred corrections buy more accuracy than a
|
|
151
|
+
* quarter of parser work."* Same table the runtime's own denials land in, on
|
|
152
|
+
* purpose: an edge is wrong or it is not, and who noticed does not change what
|
|
153
|
+
* the graph should do about it. The `reason` is the correction's provenance and
|
|
154
|
+
* is never summarised.
|
|
155
|
+
*/
|
|
156
|
+
export declare function recordEdgeCorrection(driver: SqlDriver, input: {
|
|
157
|
+
readonly from: string;
|
|
158
|
+
readonly to: string;
|
|
159
|
+
readonly edgeType: EdgeType;
|
|
160
|
+
readonly verdict: "wrong" | "right";
|
|
161
|
+
readonly reason: string;
|
|
162
|
+
}, clock?: Clock): {
|
|
163
|
+
readonly edgeId: string;
|
|
164
|
+
};
|
|
165
|
+
/** The `producedBy` every runtime-minted edge carries. Provenance is load-bearing (§11A.5). */
|
|
166
|
+
export declare const RUNTIME_ADAPTER_ID = "runtime-confirmation";
|
|
167
|
+
export declare const RUNTIME_ADAPTER_VERSION = "1";
|
|
168
|
+
export declare const RUNTIME_PRODUCER = "runtime-confirmation@1";
|
|
169
|
+
//# sourceMappingURL=runtime-confirmation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-confirmation.d.ts","sourceRoot":"","sources":["../../src/graph/runtime-confirmation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsDG;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;CACxD;AAED,uCAAuC;AACvC,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,wDAAwD;AACxD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAQD;;;GAGG;AACH,MAAM,WAAW,KAAK;IACpB,GAAG,IAAI,MAAM,CAAC;CACf;AAID;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,wBAAwB,EAC/B,KAAK,GAAE,KAAoB,GAC1B,yBAAyB,CA8E3B;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,yBAAyB,CA2ClF;AAED,+EAA+E;AAC/E,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,GAAE;IAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,eAAe,EAAE,CA0B7G;AAED,wEAAwE;AACxE,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,GAAG,iBAAiB,EAAE,CAYtE;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EAChJ,KAAK,GAAE,KAAoB,GAC1B;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAQ7B;AAqFD,+FAA+F;AAC/F,eAAO,MAAM,kBAAkB,yBAAyB,CAAC;AACzD,eAAO,MAAM,uBAAuB,MAAM,CAAC;AAC3C,eAAO,MAAM,gBAAgB,2BAAqD,CAAC"}
|