@descryy/core 0.3.0 → 0.5.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/budget/reply.d.ts +11 -46
- package/dist/budget/reply.d.ts.map +1 -1
- package/dist/budget/reply.js +10 -39
- package/dist/budget/reply.js.map +1 -1
- package/dist/budget/size.d.ts +2 -21
- package/dist/budget/size.d.ts.map +1 -1
- package/dist/budget/size.js +3 -24
- package/dist/budget/size.js.map +1 -1
- package/dist/capabilities/preconditions.d.ts +7 -68
- package/dist/capabilities/preconditions.d.ts.map +1 -1
- package/dist/capabilities/preconditions.js +6 -57
- package/dist/capabilities/preconditions.js.map +1 -1
- package/dist/contracts/engine.d.ts +26 -12
- package/dist/contracts/engine.d.ts.map +1 -1
- package/dist/contracts/engine.js +28 -11
- package/dist/contracts/engine.js.map +1 -1
- package/dist/contracts/index.d.ts +1 -1
- package/dist/contracts/index.d.ts.map +1 -1
- package/dist/contracts/index.js.map +1 -1
- package/dist/contracts/orphans.d.ts +28 -77
- package/dist/contracts/orphans.d.ts.map +1 -1
- package/dist/contracts/orphans.js +124 -94
- package/dist/contracts/orphans.js.map +1 -1
- package/dist/contracts/paths.d.ts +4 -114
- package/dist/contracts/paths.d.ts.map +1 -1
- package/dist/contracts/paths.js +7 -140
- package/dist/contracts/paths.js.map +1 -1
- package/dist/contracts/shapes.d.ts +13 -66
- package/dist/contracts/shapes.d.ts.map +1 -1
- package/dist/contracts/shapes.js +20 -91
- package/dist/contracts/shapes.js.map +1 -1
- package/dist/governance/budget.d.ts +12 -48
- package/dist/governance/budget.d.ts.map +1 -1
- package/dist/governance/budget.js +12 -48
- package/dist/governance/budget.js.map +1 -1
- package/dist/governance/candidate-boundary.d.ts +4 -32
- package/dist/governance/candidate-boundary.d.ts.map +1 -1
- package/dist/governance/candidate-boundary.js +4 -32
- package/dist/governance/candidate-boundary.js.map +1 -1
- package/dist/governance/escalation.d.ts +7 -45
- package/dist/governance/escalation.d.ts.map +1 -1
- package/dist/governance/escalation.js +7 -45
- package/dist/governance/escalation.js.map +1 -1
- package/dist/governance/fact-boundary.d.ts +7 -49
- package/dist/governance/fact-boundary.d.ts.map +1 -1
- package/dist/governance/fact-boundary.js +5 -43
- package/dist/governance/fact-boundary.js.map +1 -1
- package/dist/governance/finding-funnel.d.ts +11 -72
- package/dist/governance/finding-funnel.d.ts.map +1 -1
- package/dist/governance/finding-funnel.js +9 -68
- package/dist/governance/finding-funnel.js.map +1 -1
- package/dist/graph/build.d.ts +13 -75
- package/dist/graph/build.d.ts.map +1 -1
- package/dist/graph/build.js +0 -0
- package/dist/graph/build.js.map +1 -1
- package/dist/graph/cross-language.d.ts +4 -43
- package/dist/graph/cross-language.d.ts.map +1 -1
- package/dist/graph/cross-language.js +9 -77
- package/dist/graph/cross-language.js.map +1 -1
- package/dist/graph/index.d.ts +1 -1
- package/dist/graph/index.d.ts.map +1 -1
- package/dist/graph/merge.d.ts +8 -76
- package/dist/graph/merge.d.ts.map +1 -1
- package/dist/graph/merge.js +27 -77
- package/dist/graph/merge.js.map +1 -1
- package/dist/graph/observed-tests.d.ts +7 -68
- package/dist/graph/observed-tests.d.ts.map +1 -1
- package/dist/graph/observed-tests.js +5 -60
- package/dist/graph/observed-tests.js.map +1 -1
- package/dist/graph/persist.d.ts +2 -25
- package/dist/graph/persist.d.ts.map +1 -1
- package/dist/graph/persist.js +2 -25
- package/dist/graph/persist.js.map +1 -1
- package/dist/graph/runtime-confirmation.d.ts +14 -91
- package/dist/graph/runtime-confirmation.d.ts.map +1 -1
- package/dist/graph/runtime-confirmation.js +19 -103
- package/dist/graph/runtime-confirmation.js.map +1 -1
- package/dist/ledger/mint.d.ts +9 -43
- package/dist/ledger/mint.d.ts.map +1 -1
- package/dist/ledger/mint.js +15 -65
- package/dist/ledger/mint.js.map +1 -1
- package/dist/ledger/resolve.d.ts +13 -81
- package/dist/ledger/resolve.d.ts.map +1 -1
- package/dist/ledger/resolve.js +13 -76
- package/dist/ledger/resolve.js.map +1 -1
- package/dist/multipr/fingerprint.d.ts +5 -46
- package/dist/multipr/fingerprint.d.ts.map +1 -1
- package/dist/multipr/fingerprint.js +22 -74
- package/dist/multipr/fingerprint.js.map +1 -1
- package/dist/multipr/hidden-dependency.d.ts +13 -73
- package/dist/multipr/hidden-dependency.d.ts.map +1 -1
- package/dist/multipr/hidden-dependency.js +12 -63
- package/dist/multipr/hidden-dependency.js.map +1 -1
- package/dist/multipr/mechanical.d.ts +25 -160
- package/dist/multipr/mechanical.d.ts.map +1 -1
- package/dist/multipr/mechanical.js +21 -137
- package/dist/multipr/mechanical.js.map +1 -1
- package/dist/multipr/migration-heads.d.ts +18 -105
- package/dist/multipr/migration-heads.d.ts.map +1 -1
- package/dist/multipr/migration-heads.js +15 -84
- package/dist/multipr/migration-heads.js.map +1 -1
- package/dist/multipr/overlap.d.ts +16 -94
- package/dist/multipr/overlap.d.ts.map +1 -1
- package/dist/multipr/overlap.js +25 -105
- package/dist/multipr/overlap.js.map +1 -1
- package/dist/multipr/scope-store.d.ts +15 -80
- package/dist/multipr/scope-store.d.ts.map +1 -1
- package/dist/multipr/scope-store.js +17 -87
- package/dist/multipr/scope-store.js.map +1 -1
- package/dist/multipr/superseded.d.ts +10 -95
- package/dist/multipr/superseded.d.ts.map +1 -1
- package/dist/multipr/superseded.js +7 -60
- package/dist/multipr/superseded.js.map +1 -1
- package/dist/query/confirmed-facts.d.ts +12 -58
- package/dist/query/confirmed-facts.d.ts.map +1 -1
- package/dist/query/confirmed-facts.js +8 -47
- package/dist/query/confirmed-facts.js.map +1 -1
- package/dist/query/declared-value-closure.d.ts +13 -104
- package/dist/query/declared-value-closure.d.ts.map +1 -1
- package/dist/query/declared-value-closure.js +15 -104
- package/dist/query/declared-value-closure.js.map +1 -1
- package/dist/query/memory.d.ts +5 -9
- package/dist/query/memory.d.ts.map +1 -1
- package/dist/query/memory.js +31 -15
- package/dist/query/memory.js.map +1 -1
- package/dist/query/prominence.d.ts +6 -55
- package/dist/query/prominence.d.ts.map +1 -1
- package/dist/query/prominence.js +6 -55
- package/dist/query/prominence.js.map +1 -1
- package/dist/query/provider.d.ts +28 -81
- package/dist/query/provider.d.ts.map +1 -1
- package/dist/query/provider.js +8 -29
- package/dist/query/provider.js.map +1 -1
- package/dist/query/queries.d.ts +15 -65
- package/dist/query/queries.d.ts.map +1 -1
- package/dist/query/queries.js +43 -100
- package/dist/query/queries.js.map +1 -1
- package/dist/query/refusal-fetch.d.ts +8 -85
- package/dist/query/refusal-fetch.d.ts.map +1 -1
- package/dist/query/refusal-fetch.js +11 -93
- package/dist/query/refusal-fetch.js.map +1 -1
- package/dist/query/refusal-questions.d.ts +17 -92
- package/dist/query/refusal-questions.d.ts.map +1 -1
- package/dist/query/refusal-questions.js +14 -78
- package/dist/query/refusal-questions.js.map +1 -1
- package/dist/query/resolution-floor.d.ts +3 -23
- package/dist/query/resolution-floor.d.ts.map +1 -1
- package/dist/query/resolution-floor.js +3 -23
- package/dist/query/resolution-floor.js.map +1 -1
- package/dist/query/root-cause-score.d.ts +11 -161
- package/dist/query/root-cause-score.d.ts.map +1 -1
- package/dist/query/root-cause-score.js +6 -137
- package/dist/query/root-cause-score.js.map +1 -1
- package/dist/query/row-closure-picture.d.ts +5 -67
- package/dist/query/row-closure-picture.d.ts.map +1 -1
- package/dist/query/row-closure-picture.js +6 -67
- package/dist/query/row-closure-picture.js.map +1 -1
- package/dist/query/similar-incidents.d.ts +6 -41
- package/dist/query/similar-incidents.d.ts.map +1 -1
- package/dist/query/similar-incidents.js +15 -69
- package/dist/query/similar-incidents.js.map +1 -1
- package/dist/query/sqlite.d.ts +3 -7
- package/dist/query/sqlite.d.ts.map +1 -1
- package/dist/query/sqlite.js +13 -16
- package/dist/query/sqlite.js.map +1 -1
- package/dist/query/test-coverage.d.ts +5 -45
- package/dist/query/test-coverage.d.ts.map +1 -1
- package/dist/query/test-coverage.js +10 -53
- package/dist/query/test-coverage.js.map +1 -1
- package/dist/query/traverse.d.ts +22 -126
- package/dist/query/traverse.d.ts.map +1 -1
- package/dist/query/traverse.js +0 -0
- package/dist/query/traverse.js.map +1 -1
- package/dist/query/unresolved.d.ts +19 -164
- package/dist/query/unresolved.d.ts.map +1 -1
- package/dist/query/unresolved.js +11 -138
- package/dist/query/unresolved.js.map +1 -1
- package/dist/query/verification-status.d.ts +12 -109
- package/dist/query/verification-status.d.ts.map +1 -1
- package/dist/query/verification-status.js +9 -99
- package/dist/query/verification-status.js.map +1 -1
- package/dist/recording/migrate.d.ts +4 -10
- package/dist/recording/migrate.d.ts.map +1 -1
- package/dist/recording/migrate.js +4 -10
- package/dist/recording/migrate.js.map +1 -1
- package/dist/recording/reader.d.ts +2 -7
- package/dist/recording/reader.d.ts.map +1 -1
- package/dist/recording/reader.js +2 -7
- package/dist/recording/reader.js.map +1 -1
- package/dist/recording/redact.d.ts +6 -57
- package/dist/recording/redact.d.ts.map +1 -1
- package/dist/recording/redact.js +8 -64
- package/dist/recording/redact.js.map +1 -1
- package/dist/recording/schema.d.ts +3 -38
- package/dist/recording/schema.d.ts.map +1 -1
- package/dist/recording/schema.js +3 -38
- package/dist/recording/schema.js.map +1 -1
- package/dist/recording/writer.d.ts +11 -74
- package/dist/recording/writer.d.ts.map +1 -1
- package/dist/recording/writer.js +3 -43
- package/dist/recording/writer.js.map +1 -1
- package/dist/scoping/fanout.d.ts +6 -68
- package/dist/scoping/fanout.d.ts.map +1 -1
- package/dist/scoping/fanout.js +6 -68
- package/dist/scoping/fanout.js.map +1 -1
- package/dist/scoping/score.d.ts +20 -70
- package/dist/scoping/score.d.ts.map +1 -1
- package/dist/scoping/score.js +20 -70
- package/dist/scoping/score.js.map +1 -1
- package/dist/scoping/tiers.d.ts +4 -16
- package/dist/scoping/tiers.d.ts.map +1 -1
- package/dist/scoping/tiers.js +4 -16
- package/dist/scoping/tiers.js.map +1 -1
- package/dist/scoping/traverse.d.ts +3 -25
- package/dist/scoping/traverse.d.ts.map +1 -1
- package/dist/scoping/traverse.js +14 -49
- package/dist/scoping/traverse.js.map +1 -1
- package/dist/scoping/weights.d.ts +10 -74
- package/dist/scoping/weights.d.ts.map +1 -1
- package/dist/scoping/weights.js +14 -86
- package/dist/scoping/weights.js.map +1 -1
- package/dist/sources/confirmed/incidents.d.ts +5 -35
- package/dist/sources/confirmed/incidents.d.ts.map +1 -1
- package/dist/sources/confirmed/incidents.js +14 -48
- package/dist/sources/confirmed/incidents.js.map +1 -1
- package/dist/sources/git/diff.d.ts +71 -65
- package/dist/sources/git/diff.d.ts.map +1 -1
- package/dist/sources/git/diff.js +136 -83
- package/dist/sources/git/diff.js.map +1 -1
- package/dist/sources/git/env.d.ts +7 -0
- package/dist/sources/git/env.d.ts.map +1 -1
- package/dist/sources/git/env.js +10 -11
- package/dist/sources/git/env.js.map +1 -1
- package/dist/sources/git/history.d.ts +64 -84
- package/dist/sources/git/history.d.ts.map +1 -1
- package/dist/sources/git/history.js +141 -112
- package/dist/sources/git/history.js.map +1 -1
- package/dist/sources/git/incidents.d.ts +13 -75
- package/dist/sources/git/incidents.d.ts.map +1 -1
- package/dist/sources/git/incidents.js +21 -91
- package/dist/sources/git/incidents.js.map +1 -1
- package/dist/sources/git/index.d.ts +5 -3
- package/dist/sources/git/index.d.ts.map +1 -1
- package/dist/sources/git/index.js +3 -2
- package/dist/sources/git/index.js.map +1 -1
- package/dist/sources/git/source.d.ts +9 -79
- package/dist/sources/git/source.d.ts.map +1 -1
- package/dist/sources/git/source.js +0 -0
- package/dist/sources/git/source.js.map +1 -1
- package/dist/sources/migrations/across-change.d.ts +94 -0
- package/dist/sources/migrations/across-change.d.ts.map +1 -0
- package/dist/sources/migrations/across-change.js +278 -0
- package/dist/sources/migrations/across-change.js.map +1 -0
- package/dist/sources/migrations/dialects.d.ts +20 -36
- package/dist/sources/migrations/dialects.d.ts.map +1 -1
- package/dist/sources/migrations/dialects.js +11 -36
- package/dist/sources/migrations/dialects.js.map +1 -1
- package/dist/sources/migrations/index.d.ts +3 -1
- package/dist/sources/migrations/index.d.ts.map +1 -1
- package/dist/sources/migrations/index.js +2 -1
- package/dist/sources/migrations/index.js.map +1 -1
- package/dist/sources/migrations/read.d.ts +14 -79
- package/dist/sources/migrations/read.d.ts.map +1 -1
- package/dist/sources/migrations/read.js +14 -89
- package/dist/sources/migrations/read.js.map +1 -1
- package/dist/sources/workspace/workspace.d.ts +6 -42
- package/dist/sources/workspace/workspace.d.ts.map +1 -1
- package/dist/sources/workspace/workspace.js +10 -53
- package/dist/sources/workspace/workspace.js.map +1 -1
- package/dist/store/driver/driver.d.ts +9 -38
- package/dist/store/driver/driver.d.ts.map +1 -1
- package/dist/store/driver/driver.js +4 -22
- package/dist/store/driver/driver.js.map +1 -1
- package/dist/store/driver/node-sqlite.d.ts +3 -12
- package/dist/store/driver/node-sqlite.d.ts.map +1 -1
- package/dist/store/driver/node-sqlite.js +4 -18
- package/dist/store/driver/node-sqlite.js.map +1 -1
- package/dist/store/index.d.ts +2 -7
- package/dist/store/index.d.ts.map +1 -1
- package/dist/store/index.js +4 -10
- package/dist/store/index.js.map +1 -1
- package/dist/store/migrate.d.ts +14 -50
- package/dist/store/migrate.d.ts.map +1 -1
- package/dist/store/migrate.js +15 -52
- package/dist/store/migrate.js.map +1 -1
- package/dist/store/reader.d.ts +19 -84
- package/dist/store/reader.d.ts.map +1 -1
- package/dist/store/reader.js +25 -92
- package/dist/store/reader.js.map +1 -1
- package/dist/store/schema.d.ts +14 -76
- package/dist/store/schema.d.ts.map +1 -1
- package/dist/store/schema.js +14 -76
- package/dist/store/schema.js.map +1 -1
- package/dist/store/writer.d.ts +14 -88
- package/dist/store/writer.d.ts.map +1 -1
- package/dist/store/writer.js +29 -123
- package/dist/store/writer.js.map +1 -1
- package/dist/tiers/certify.d.ts +46 -281
- package/dist/tiers/certify.d.ts.map +1 -1
- package/dist/tiers/certify.js +46 -226
- package/dist/tiers/certify.js.map +1 -1
- package/dist/tiers/ladder.d.ts +7 -51
- package/dist/tiers/ladder.d.ts.map +1 -1
- package/dist/tiers/ladder.js +13 -89
- package/dist/tiers/ladder.js.map +1 -1
- package/dist/validation/attributes.d.ts +47 -0
- package/dist/validation/attributes.d.ts.map +1 -0
- package/dist/validation/attributes.js +130 -0
- package/dist/validation/attributes.js.map +1 -0
- package/dist/validation/config-graph.d.ts +7 -56
- package/dist/validation/config-graph.d.ts.map +1 -1
- package/dist/validation/config-graph.js +15 -61
- package/dist/validation/config-graph.js.map +1 -1
- package/dist/validation/env.d.ts +53 -2
- package/dist/validation/env.d.ts.map +1 -1
- package/dist/validation/env.js +99 -4
- package/dist/validation/env.js.map +1 -1
- package/dist/validation/index.d.ts +5 -1
- package/dist/validation/index.d.ts.map +1 -1
- package/dist/validation/index.js +3 -1
- package/dist/validation/index.js.map +1 -1
- package/dist/validation/join-substitution.d.ts +22 -120
- package/dist/validation/join-substitution.d.ts.map +1 -1
- package/dist/validation/join-substitution.js +13 -90
- package/dist/validation/join-substitution.js.map +1 -1
- package/dist/validation/migration-integrity.d.ts +72 -0
- package/dist/validation/migration-integrity.d.ts.map +1 -0
- package/dist/validation/migration-integrity.js +238 -0
- package/dist/validation/migration-integrity.js.map +1 -0
- package/dist/validation/migrations.d.ts +23 -88
- package/dist/validation/migrations.d.ts.map +1 -1
- package/dist/validation/migrations.js +20 -79
- package/dist/validation/migrations.js.map +1 -1
- package/dist/validation/nodes.d.ts +3 -1
- package/dist/validation/nodes.d.ts.map +1 -1
- package/dist/validation/nodes.js +3 -1
- package/dist/validation/nodes.js.map +1 -1
- package/dist/validation/rollback.d.ts +10 -73
- package/dist/validation/rollback.d.ts.map +1 -1
- package/dist/validation/rollback.js +23 -81
- package/dist/validation/rollback.js.map +1 -1
- package/dist/validation/route-drift.d.ts +9 -62
- package/dist/validation/route-drift.d.ts.map +1 -1
- package/dist/validation/route-drift.js +7 -52
- package/dist/validation/route-drift.js.map +1 -1
- package/dist/validation/sources.d.ts +16 -94
- package/dist/validation/sources.d.ts.map +1 -1
- package/dist/validation/sources.js +51 -147
- package/dist/validation/sources.js.map +1 -1
- package/dist/worker/pool.d.ts +6 -45
- package/dist/worker/pool.d.ts.map +1 -1
- package/dist/worker/pool.js +5 -42
- package/dist/worker/pool.js.map +1 -1
- package/dist/worker/protocol.d.ts +7 -20
- package/dist/worker/protocol.d.ts.map +1 -1
- package/dist/worker/protocol.js +3 -10
- package/dist/worker/protocol.js.map +1 -1
- package/dist/worker/traversal.worker.d.ts +2 -21
- package/dist/worker/traversal.worker.d.ts.map +1 -1
- package/dist/worker/traversal.worker.js +4 -23
- package/dist/worker/traversal.worker.js.map +1 -1
- package/package.json +11 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/contracts/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACvD,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEtE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACvD,YAAY,EACV,KAAK,EACL,UAAU,EACV,eAAe,EACf,eAAe,EACf,mBAAmB,GACpB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,YAAY,EACV,eAAe,EACf,mBAAmB,EACnB,cAAc,EACd,aAAa,GACd,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,YAAY,EACV,aAAa,EACb,eAAe,EACf,UAAU,EACV,cAAc,EACd,aAAa,GACd,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/contracts/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACvD,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEtE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACvD,YAAY,EACV,KAAK,EACL,UAAU,EACV,eAAe,EACf,eAAe,EACf,mBAAmB,GACpB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,YAAY,EACV,aAAa,EACb,eAAe,EACf,mBAAmB,EACnB,cAAc,EACd,aAAa,GACd,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,YAAY,EACV,aAAa,EACb,eAAe,EACf,UAAU,EACV,cAAc,EACd,aAAa,GACd,MAAM,aAAa,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/contracts/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAGvD,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AASvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/contracts/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAGvD,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AASvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AASnD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -1,64 +1,27 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* §13's mechanism is shape comparison at R3. This is the part that works
|
|
5
|
-
* **below** it, and the architecture is explicit that it should exist: at R2,
|
|
6
|
-
* report path-level orphans only, and say so. Splitting the engine this way
|
|
7
|
-
* means half the value lands on graphs no type checker has touched, and the R3
|
|
8
|
-
* half does not hold it hostage.
|
|
9
|
-
*
|
|
10
|
-
* ## Three findings, and the reason there are only three
|
|
11
|
-
*
|
|
12
|
-
* ```
|
|
13
|
-
* API_ROUTE ──SERVES_API──▶ API_ENDPOINT ◀──USES_API── caller
|
|
14
|
-
* ```
|
|
15
|
-
*
|
|
16
|
-
* An `API_ENDPOINT` is the join. Every question here is about which of its two
|
|
17
|
-
* sides is present:
|
|
18
|
-
*
|
|
19
|
-
* | both sides | one side | finding |
|
|
20
|
-
* | --- | --- | --- |
|
|
21
|
-
* | caller + route | — | the contract holds at path level |
|
|
22
|
-
* | — | caller only | **the call reaches nothing that is served** |
|
|
23
|
-
* | — | route only | **nothing in this graph calls the route** |
|
|
24
|
-
*
|
|
25
|
-
* ## The trap, and it is the whole design
|
|
26
|
-
*
|
|
27
|
-
* On two real repositories: **117 callers, 24 routes, 16 joined.** The other 101
|
|
28
|
-
* callers are, overwhelmingly, calls to services that are not in the graph at
|
|
29
|
-
* all — a third-party API, a backend nobody analysed. Reporting them as "no
|
|
30
|
-
* route serves this" would be 101 confident wrong statements that bury the
|
|
31
|
-
* handful that are real.
|
|
32
|
-
*
|
|
33
|
-
* So an unmatched caller is a **finding** only when a served route exists that
|
|
34
|
-
* it nearly matches (see `paths.ts`, where every rule is a specific mechanical
|
|
35
|
-
* mistake rather than a similarity threshold). Everything else is counted and
|
|
36
|
-
* disclosed as *not analysable*, because the honest description of it is "the
|
|
37
|
-
* provider side of this call was never read", not "the provider side is wrong".
|
|
38
|
-
*
|
|
39
|
-
* Two more refusals in the same spirit:
|
|
40
|
-
*
|
|
41
|
-
* - **No routes at all in the graph → no caller findings, at all.** With nothing
|
|
42
|
-
* on the provider side, every caller is unmatched by construction and the
|
|
43
|
-
* comparison has no content. Reported as not analysable, with the reason.
|
|
44
|
-
* - **`ROUTE_NOT_CALLED` is stated weakly on purpose.** A route nothing calls is
|
|
45
|
-
* usually a route called by something outside this graph — a mobile client,
|
|
46
|
-
* another service, curl. It is a lead, not a defect, and the wording says so.
|
|
47
|
-
*/
|
|
1
|
+
/** Contract engine's R2 half: reports path-level orphans only (§13 is the R3 shape half, not this).
|
|
2
|
+
* A caller is a finding only with a near-miss served route — measured 117 callers/24 routes/16
|
|
3
|
+
* joined; the other 101 are unrelated services, disclosed as not analysable, not false positives. */
|
|
48
4
|
import type { IRNode, ResolutionLevel } from "@descryy/ir";
|
|
49
5
|
import type { AdjacencyProvider, QueryResult } from "../query/provider.ts";
|
|
50
6
|
import { type NearMiss } from "./paths.ts";
|
|
51
|
-
export type ContractFindingKind = "CALL_NOT_SERVED" | "ROUTE_NOT_CALLED";
|
|
7
|
+
export type ContractFindingKind = "CALL_NOT_SERVED" | "ROUTE_NOT_CALLED" | "ROUTE_NOT_MOUNTED";
|
|
8
|
+
/** Provable from the graph alone ("defect") vs dependent on outside knowledge ("lead") — following
|
|
9
|
+
* `EnvClaim`'s precedent. CALL_NOT_SERVED is a defect (miss + call both in graph); ROUTE_NOT_CALLED
|
|
10
|
+
* is a lead (an external caller wouldn't appear here, so "nothing calls it" is only suggestive). */
|
|
11
|
+
export type ContractClaim = "defect" | "lead";
|
|
52
12
|
export interface ContractFinding {
|
|
53
13
|
readonly kind: ContractFindingKind;
|
|
54
|
-
readonly
|
|
14
|
+
readonly claim: ContractClaim;
|
|
15
|
+
/** The join node. Null for ROUTE_NOT_MOUNTED — an unmounted route has no API_ENDPOINT at all;
|
|
16
|
+
* that absence IS the finding. */
|
|
17
|
+
readonly endpoint: IRNode | null;
|
|
55
18
|
readonly method: string;
|
|
56
19
|
readonly pathTemplate: string;
|
|
57
20
|
/** Callers reaching this endpoint. Populated for `CALL_NOT_SERVED`. */
|
|
58
21
|
readonly callers: readonly IRNode[];
|
|
59
|
-
/** Routes serving it
|
|
22
|
+
/** Routes serving it (ROUTE_NOT_CALLED), or the single unmounted route (ROUTE_NOT_MOUNTED). */
|
|
60
23
|
readonly routes: readonly IRNode[];
|
|
61
|
-
/** Why this is reportable rather than merely unmatched. Null for `ROUTE_NOT_CALLED`. */
|
|
24
|
+
/** Why this is reportable rather than merely unmatched. Null for `ROUTE_NOT_CALLED` and `ROUTE_NOT_MOUNTED`. */
|
|
62
25
|
readonly nearMiss: NearMiss | null;
|
|
63
26
|
/** The sentence a developer reads. */
|
|
64
27
|
readonly detail: string;
|
|
@@ -67,46 +30,34 @@ export interface ContractFinding {
|
|
|
67
30
|
}
|
|
68
31
|
export interface ContractReport {
|
|
69
32
|
readonly findings: readonly ContractFinding[];
|
|
33
|
+
/** The count before `maxFindings` capped it — same pattern as `EnvReport`/`RollbackReport`. */
|
|
34
|
+
readonly findingsTotal: number;
|
|
70
35
|
readonly checked: {
|
|
71
36
|
readonly endpoints: number;
|
|
72
37
|
readonly withCallers: number;
|
|
73
38
|
readonly withRoutes: number;
|
|
74
39
|
readonly joined: number;
|
|
40
|
+
/** API_ROUTE nodes with attrs.mounted as a real boolean — the only ones ROUTE_NOT_MOUNTED can
|
|
41
|
+
* speak about. A route with no such attribute is in neither this count nor `routesUnmounted`. */
|
|
42
|
+
readonly routesWithMountInfo: number;
|
|
43
|
+
/** Of those, how many declared `attrs.mounted === false` — before `maxFindings` capped the list. */
|
|
44
|
+
readonly routesUnmounted: number;
|
|
75
45
|
};
|
|
76
|
-
/**
|
|
77
|
-
*
|
|
78
|
-
*
|
|
79
|
-
* Not findings, and the number matters: it is the size of the region this
|
|
80
|
-
* analysis could not speak about.
|
|
81
|
-
*/
|
|
46
|
+
/** Unmatched callers with nothing resembling them on the provider side. Not findings — the
|
|
47
|
+
* number is the size of the region this analysis couldn't speak about. */
|
|
82
48
|
readonly unmatchedWithoutNearMiss: number;
|
|
83
49
|
/** True when the R3 shape comparison did not run. Always true in this half. */
|
|
84
50
|
readonly shapesCompared: boolean;
|
|
85
51
|
}
|
|
86
|
-
/**
|
|
87
|
-
*
|
|
88
|
-
*
|
|
89
|
-
*
|
|
90
|
-
* This function is the path half and cannot know whether a shape comparison
|
|
91
|
-
* followed, so it always says one did not. That was true for as long as the path
|
|
92
|
-
* half was the only half that ran, and it stopped being true the moment a
|
|
93
|
-
* producer attached direction to a route's DTOs — leaving `contracts` reporting
|
|
94
|
-
* a shape mismatch above a disclosure denying any shape was compared. Measured
|
|
95
|
-
* against the real binary, UAT phase 2.
|
|
96
|
-
*
|
|
97
|
-
* A caller that runs the shape half removes this note when a comparison actually
|
|
98
|
-
* happened. It is a constant rather than a regex on the caller's side because a
|
|
99
|
-
* disclosure matched by pattern is a disclosure that silently stops being
|
|
100
|
-
* retracted the day someone rewords it.
|
|
101
|
-
*/
|
|
52
|
+
/** Path-half coverage disclosure, exported so the shape half can retract it rather than restate
|
|
53
|
+
* it (UAT phase 2: a producer attaching DTO direction once left this standing beside a real shape
|
|
54
|
+
* mismatch). A constant, not a regex — regex-matched text silently stops being retracted when reworded. */
|
|
102
55
|
export declare const PATH_LEVEL_ONLY_NOTE: string;
|
|
103
56
|
export interface OrphanOptions {
|
|
104
57
|
/** Cap on endpoints enumerated. Truncation is reported, never silent. */
|
|
105
58
|
readonly limit?: number;
|
|
106
|
-
/**
|
|
107
|
-
*
|
|
108
|
-
* an exhaustive maybe-list". Overflow is disclosed, not dropped quietly.
|
|
109
|
-
*/
|
|
59
|
+
/** Cap on findings — rule 5's "a few high-confidence findings, never an exhaustive maybe-list".
|
|
60
|
+
* Overflow is disclosed, not dropped quietly. */
|
|
110
61
|
readonly maxFindings?: number;
|
|
111
62
|
}
|
|
112
63
|
export declare function findContractOrphans(provider: AdjacencyProvider, options?: OrphanOptions): QueryResult<ContractReport>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orphans.d.ts","sourceRoot":"","sources":["../../src/contracts/orphans.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"orphans.d.ts","sourceRoot":"","sources":["../../src/contracts/orphans.ts"],"names":[],"mappings":"AAAA;;sGAEsG;AAEtG,OAAO,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE3D,OAAO,KAAK,EAAE,iBAAiB,EAAc,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACvF,OAAO,EAAiC,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE1E,MAAM,MAAM,mBAAmB,GAAG,iBAAiB,GAAG,kBAAkB,GAAG,mBAAmB,CAAC;AAE/F;;qGAEqG;AACrG,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE9C,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAC9B;uCACmC;IACnC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,uEAAuE;IACvE,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,+FAA+F;IAC/F,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,gHAAgH;IAChH,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;IACnC,sCAAsC;IACtC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,+EAA+E;IAC/E,QAAQ,CAAC,UAAU,EAAE,eAAe,CAAC;CACtC;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,QAAQ,EAAE,SAAS,eAAe,EAAE,CAAC;IAC9C,+FAA+F;IAC/F,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE;QAChB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;QAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;QAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB;0GACkG;QAClG,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;QACrC,oGAAoG;QACpG,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;KAClC,CAAC;IACF;+EAC2E;IAC3E,QAAQ,CAAC,wBAAwB,EAAE,MAAM,CAAC;IAC1C,+EAA+E;IAC/E,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;CAClC;AAED;;4GAE4G;AAC5G,eAAO,MAAM,oBAAoB,QAEuB,CAAC;AAEzD,MAAM,WAAW,aAAa;IAC5B,yEAAyE;IACzE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB;sDACkD;IAClD,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AA+ED,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,iBAAiB,EAC3B,OAAO,GAAE,aAAkB,GAC1B,WAAW,CAAC,cAAc,CAAC,CAgP7B"}
|
|
@@ -1,67 +1,10 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* §13's mechanism is shape comparison at R3. This is the part that works
|
|
5
|
-
* **below** it, and the architecture is explicit that it should exist: at R2,
|
|
6
|
-
* report path-level orphans only, and say so. Splitting the engine this way
|
|
7
|
-
* means half the value lands on graphs no type checker has touched, and the R3
|
|
8
|
-
* half does not hold it hostage.
|
|
9
|
-
*
|
|
10
|
-
* ## Three findings, and the reason there are only three
|
|
11
|
-
*
|
|
12
|
-
* ```
|
|
13
|
-
* API_ROUTE ──SERVES_API──▶ API_ENDPOINT ◀──USES_API── caller
|
|
14
|
-
* ```
|
|
15
|
-
*
|
|
16
|
-
* An `API_ENDPOINT` is the join. Every question here is about which of its two
|
|
17
|
-
* sides is present:
|
|
18
|
-
*
|
|
19
|
-
* | both sides | one side | finding |
|
|
20
|
-
* | --- | --- | --- |
|
|
21
|
-
* | caller + route | — | the contract holds at path level |
|
|
22
|
-
* | — | caller only | **the call reaches nothing that is served** |
|
|
23
|
-
* | — | route only | **nothing in this graph calls the route** |
|
|
24
|
-
*
|
|
25
|
-
* ## The trap, and it is the whole design
|
|
26
|
-
*
|
|
27
|
-
* On two real repositories: **117 callers, 24 routes, 16 joined.** The other 101
|
|
28
|
-
* callers are, overwhelmingly, calls to services that are not in the graph at
|
|
29
|
-
* all — a third-party API, a backend nobody analysed. Reporting them as "no
|
|
30
|
-
* route serves this" would be 101 confident wrong statements that bury the
|
|
31
|
-
* handful that are real.
|
|
32
|
-
*
|
|
33
|
-
* So an unmatched caller is a **finding** only when a served route exists that
|
|
34
|
-
* it nearly matches (see `paths.ts`, where every rule is a specific mechanical
|
|
35
|
-
* mistake rather than a similarity threshold). Everything else is counted and
|
|
36
|
-
* disclosed as *not analysable*, because the honest description of it is "the
|
|
37
|
-
* provider side of this call was never read", not "the provider side is wrong".
|
|
38
|
-
*
|
|
39
|
-
* Two more refusals in the same spirit:
|
|
40
|
-
*
|
|
41
|
-
* - **No routes at all in the graph → no caller findings, at all.** With nothing
|
|
42
|
-
* on the provider side, every caller is unmatched by construction and the
|
|
43
|
-
* comparison has no content. Reported as not analysable, with the reason.
|
|
44
|
-
* - **`ROUTE_NOT_CALLED` is stated weakly on purpose.** A route nothing calls is
|
|
45
|
-
* usually a route called by something outside this graph — a mobile client,
|
|
46
|
-
* another service, curl. It is a lead, not a defect, and the wording says so.
|
|
47
|
-
*/
|
|
1
|
+
/** Contract engine's R2 half: reports path-level orphans only (§13 is the R3 shape half, not this).
|
|
2
|
+
* A caller is a finding only with a near-miss served route — measured 117 callers/24 routes/16
|
|
3
|
+
* joined; the other 101 are unrelated services, disclosed as not analysable, not false positives. */
|
|
48
4
|
import { nearestMiss } from "./paths.js";
|
|
49
|
-
/**
|
|
50
|
-
*
|
|
51
|
-
*
|
|
52
|
-
*
|
|
53
|
-
* This function is the path half and cannot know whether a shape comparison
|
|
54
|
-
* followed, so it always says one did not. That was true for as long as the path
|
|
55
|
-
* half was the only half that ran, and it stopped being true the moment a
|
|
56
|
-
* producer attached direction to a route's DTOs — leaving `contracts` reporting
|
|
57
|
-
* a shape mismatch above a disclosure denying any shape was compared. Measured
|
|
58
|
-
* against the real binary, UAT phase 2.
|
|
59
|
-
*
|
|
60
|
-
* A caller that runs the shape half removes this note when a comparison actually
|
|
61
|
-
* happened. It is a constant rather than a regex on the caller's side because a
|
|
62
|
-
* disclosure matched by pattern is a disclosure that silently stops being
|
|
63
|
-
* retracted the day someone rewords it.
|
|
64
|
-
*/
|
|
5
|
+
/** Path-half coverage disclosure, exported so the shape half can retract it rather than restate
|
|
6
|
+
* it (UAT phase 2: a producer attaching DTO direction once left this standing beside a real shape
|
|
7
|
+
* mismatch). A constant, not a regex — regex-matched text silently stops being retracted when reworded. */
|
|
65
8
|
export const PATH_LEVEL_ONLY_NOTE = "Path level only. Request and response shapes were not compared — that requires R3 on both " +
|
|
66
9
|
"sides, because it compares shapes rather than names.";
|
|
67
10
|
const DEFAULT_MAX_FINDINGS = 25;
|
|
@@ -72,18 +15,69 @@ function keyOf(endpoint) {
|
|
|
72
15
|
? { method, pathTemplate }
|
|
73
16
|
: null;
|
|
74
17
|
}
|
|
18
|
+
/** ROUTE_NOT_MOUNTED: a route declared but never registered, read generically off
|
|
19
|
+
* `API_ROUTE.attrs.mounted` (`DEC-NEXT-route-declared-but-not-mounted-modelling`). No language/
|
|
20
|
+
* adapter name here — a producer silent on mounting produces nothing, same as rule 2 for an edge. */
|
|
21
|
+
function unmountedRouteFindings(provider) {
|
|
22
|
+
const set = provider.nodesOfType("API_ROUTE");
|
|
23
|
+
const findings = [];
|
|
24
|
+
let routesWithMountInfo = 0;
|
|
25
|
+
let routesWithoutMountInfo = 0;
|
|
26
|
+
let routesUnmounted = 0;
|
|
27
|
+
for (const route of set.nodes) {
|
|
28
|
+
const mounted = route.attrs["mounted"];
|
|
29
|
+
if (typeof mounted !== "boolean") {
|
|
30
|
+
// Absence is "unknown," not "not mounted" — a finding here would be exactly the false
|
|
31
|
+
// positive rule 2 forbids, so this route is counted but produces no finding.
|
|
32
|
+
routesWithoutMountInfo += 1;
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
routesWithMountInfo += 1;
|
|
36
|
+
if (mounted)
|
|
37
|
+
continue; // Mounted normally; the endpoint-side checks above already cover it.
|
|
38
|
+
routesUnmounted += 1;
|
|
39
|
+
const method = typeof route.attrs["method"] === "string" ? route.attrs["method"] : "?";
|
|
40
|
+
const pathTemplate = typeof route.attrs["pathTemplate"] === "string"
|
|
41
|
+
? route.attrs["pathTemplate"]
|
|
42
|
+
: route.name;
|
|
43
|
+
findings.push({
|
|
44
|
+
kind: "ROUTE_NOT_MOUNTED",
|
|
45
|
+
claim: "defect",
|
|
46
|
+
endpoint: null,
|
|
47
|
+
method,
|
|
48
|
+
pathTemplate,
|
|
49
|
+
callers: [],
|
|
50
|
+
routes: [route],
|
|
51
|
+
nearMiss: null,
|
|
52
|
+
detail: `${method} ${pathTemplate} is declared${route.file === null ? "" : ` in ${route.file}`} and ` +
|
|
53
|
+
"nothing mounts it — no code path registers this route with the running application, so it " +
|
|
54
|
+
"404s for every caller. Unlike a route nothing calls, this needs no external-consumer " +
|
|
55
|
+
"caveat: it is provable from this graph alone.",
|
|
56
|
+
resolution: route.resolution,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
return {
|
|
60
|
+
findings,
|
|
61
|
+
routesWithMountInfo,
|
|
62
|
+
routesUnmounted,
|
|
63
|
+
routesWithoutMountInfo,
|
|
64
|
+
truncated: set.truncated,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
75
67
|
export function findContractOrphans(provider, options = {}) {
|
|
76
68
|
const maxFindings = options.maxFindings ?? DEFAULT_MAX_FINDINGS;
|
|
77
69
|
const set = provider.nodesOfType("API_ENDPOINT", ...(options.limit === undefined ? [] : [options.limit]));
|
|
78
70
|
const notes = [];
|
|
71
|
+
// A route that never mounts has no API_ENDPOINT and was never a candidate for one, so this
|
|
72
|
+
// runs (and reports) independent of whether any endpoint exists.
|
|
73
|
+
const mount = unmountedRouteFindings(provider);
|
|
79
74
|
const sided = [];
|
|
80
75
|
let unkeyed = 0;
|
|
81
76
|
for (const endpoint of set.nodes) {
|
|
82
77
|
const key = keyOf(endpoint);
|
|
83
78
|
if (key === null) {
|
|
84
|
-
//
|
|
85
|
-
//
|
|
86
|
-
// join node without the two attributes the join is made of.
|
|
79
|
+
// No method/path template means nothing to compare against — counted (a producer emitted
|
|
80
|
+
// a join node missing the attributes the join is made of), not silently skipped.
|
|
87
81
|
unkeyed += 1;
|
|
88
82
|
continue;
|
|
89
83
|
}
|
|
@@ -104,18 +98,33 @@ export function findContractOrphans(provider, options = {}) {
|
|
|
104
98
|
const withRoutes = sided.filter((s) => s.routes.length > 0);
|
|
105
99
|
const joined = sided.filter((s) => s.callers.length > 0 && s.routes.length > 0);
|
|
106
100
|
const servedKeys = withRoutes.map((s) => s.key);
|
|
107
|
-
//
|
|
108
|
-
|
|
101
|
+
// The genuinely empty case: nothing at the endpoint join, and the mount check agrees there's
|
|
102
|
+
// nothing else to say.
|
|
103
|
+
if (sided.length === 0 && mount.findings.length === 0) {
|
|
109
104
|
notes.push("No API endpoints are in the graph, so there is no contract to check. Either no adapter " +
|
|
110
105
|
"read a route or a client call, or none of the configured adapters produces them. This " +
|
|
111
106
|
"is not a clean result.");
|
|
112
|
-
|
|
107
|
+
if (mount.routesWithoutMountInfo > 0) {
|
|
108
|
+
notes.push(routesWithoutMountInfoNote(mount.routesWithoutMountInfo));
|
|
109
|
+
}
|
|
110
|
+
return report(provider, emptyReport(sided.length, 0, 0, 0, mount.routesWithMountInfo, mount.routesUnmounted), 0, mount.truncated, notes);
|
|
113
111
|
}
|
|
114
|
-
|
|
112
|
+
// Still true even with unmounted-route findings below: the endpoint join has nothing to
|
|
113
|
+
// compare, so this one sentence replaces the two mirror-image refusals below (measured against
|
|
114
|
+
// reviews.py: a repo with no other route mounted at all).
|
|
115
|
+
const noEndpointsAtAll = sided.length === 0;
|
|
116
|
+
if (noEndpointsAtAll) {
|
|
117
|
+
notes.push("No API endpoints are in the graph, so the endpoint-join checks below have nothing to " +
|
|
118
|
+
"compare. Either no adapter read a route or a client call, or none of the configured " +
|
|
119
|
+
"adapters produces them.");
|
|
120
|
+
}
|
|
121
|
+
const findings = [...mount.findings];
|
|
115
122
|
let unmatchedWithoutNearMiss = 0;
|
|
116
|
-
if (
|
|
117
|
-
//
|
|
118
|
-
|
|
123
|
+
if (noEndpointsAtAll) {
|
|
124
|
+
// Handled by the note above — the refusals below would otherwise restate this from two empty sets.
|
|
125
|
+
}
|
|
126
|
+
else if (withRoutes.length === 0) {
|
|
127
|
+
// Every caller is unmatched by construction — comparing against an empty provider side means nothing.
|
|
119
128
|
unmatchedWithoutNearMiss = withCallers.length;
|
|
120
129
|
notes.push(`${withCallers.length} endpoint(s) are called and no route is in the graph at all, so no ` +
|
|
121
130
|
"comparison was possible. Every call would be reported as unserved for the same reason, " +
|
|
@@ -128,14 +137,17 @@ export function findContractOrphans(provider, options = {}) {
|
|
|
128
137
|
continue;
|
|
129
138
|
const miss = nearestMiss(entry.key, servedKeys);
|
|
130
139
|
if (miss === null) {
|
|
131
|
-
// Nothing on the provider side
|
|
132
|
-
//
|
|
133
|
-
// wrong sentences on the repositories this was measured against.
|
|
140
|
+
// Nothing resembles it on the provider side — far more likely an external service than
|
|
141
|
+
// a defect (101 confident wrong sentences on the repos this was measured against).
|
|
134
142
|
unmatchedWithoutNearMiss += 1;
|
|
135
143
|
continue;
|
|
136
144
|
}
|
|
137
145
|
findings.push({
|
|
138
146
|
kind: "CALL_NOT_SERVED",
|
|
147
|
+
// A near miss is what makes this a fault claim rather than a lead: the
|
|
148
|
+
// provider side has something one segment or one method away, so the
|
|
149
|
+
// call is wrong about a route this repository really serves.
|
|
150
|
+
claim: "defect",
|
|
139
151
|
endpoint: entry.endpoint,
|
|
140
152
|
method: entry.key.method,
|
|
141
153
|
pathTemplate: entry.key.pathTemplate,
|
|
@@ -148,18 +160,13 @@ export function findContractOrphans(provider, options = {}) {
|
|
|
148
160
|
});
|
|
149
161
|
}
|
|
150
162
|
}
|
|
151
|
-
if (
|
|
152
|
-
//
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
//
|
|
156
|
-
//
|
|
157
|
-
//
|
|
158
|
-
// is the sentence this engine declines to say in the other direction.
|
|
159
|
-
// Whichever side is empty, the cause is ONE fact about what was analysed,
|
|
160
|
-
// not N facts about the artefacts. It is not only an ablation state either:
|
|
161
|
-
// a workspace where only the backend has been indexed is the normal first
|
|
162
|
-
// day of a deployment.
|
|
163
|
+
if (noEndpointsAtAll) {
|
|
164
|
+
// Handled by the single note pushed above.
|
|
165
|
+
}
|
|
166
|
+
else if (withCallers.length === 0) {
|
|
167
|
+
// Mirror of the refusal above — missing until an ablation on bench/contracts-real.mjs found
|
|
168
|
+
// 24 ROUTE_NOT_CALLED findings with no disclosure on a graph with zero callers. Not just an
|
|
169
|
+
// ablation case: a workspace with only the backend indexed is a normal first day of deployment.
|
|
163
170
|
notes.push(`${withRoutes.length} route(s) are served and no call site is in the graph at all, so no ` +
|
|
164
171
|
"comparison was possible. Every route would be reported as uncalled for the same reason, " +
|
|
165
172
|
"which is a property of what was analysed rather than of the code. Add the client that " +
|
|
@@ -171,6 +178,11 @@ export function findContractOrphans(provider, options = {}) {
|
|
|
171
178
|
continue;
|
|
172
179
|
findings.push({
|
|
173
180
|
kind: "ROUTE_NOT_CALLED",
|
|
181
|
+
// Nothing in *this graph* calls it. A mobile client, another service or
|
|
182
|
+
// an external consumer would not appear here, so the absence is not
|
|
183
|
+
// evidence of a fault. Said in the detail since it was written; now
|
|
184
|
+
// said in a field something can count.
|
|
185
|
+
claim: "lead",
|
|
174
186
|
endpoint: entry.endpoint,
|
|
175
187
|
method: entry.key.method,
|
|
176
188
|
pathTemplate: entry.key.pathTemplate,
|
|
@@ -185,13 +197,14 @@ export function findContractOrphans(provider, options = {}) {
|
|
|
185
197
|
});
|
|
186
198
|
}
|
|
187
199
|
}
|
|
188
|
-
//
|
|
189
|
-
// path so
|
|
200
|
+
// Better evidence first, then defects before leads (a route nothing calls needs external
|
|
201
|
+
// knowledge to condemn), then kind/path so ordering is identical between runs.
|
|
190
202
|
findings.sort((a, b) => b.resolution - a.resolution ||
|
|
191
|
-
(a.
|
|
203
|
+
(a.claim === b.claim ? 0 : a.claim === "defect" ? -1 : 1) ||
|
|
204
|
+
(a.kind === b.kind ? 0 : a.kind.localeCompare(b.kind)) ||
|
|
192
205
|
`${a.method} ${a.pathTemplate}`.localeCompare(`${b.method} ${b.pathTemplate}`));
|
|
193
206
|
const kept = findings.slice(0, maxFindings);
|
|
194
|
-
const truncated = set.truncated || kept.length < findings.length;
|
|
207
|
+
const truncated = set.truncated || mount.truncated || kept.length < findings.length;
|
|
195
208
|
if (kept.length < findings.length) {
|
|
196
209
|
notes.push(`${findings.length - kept.length} further finding(s) were withheld: a report is capped at ` +
|
|
197
210
|
`${maxFindings} so that a short list stays worth reading. They were found, not missed — ` +
|
|
@@ -201,6 +214,10 @@ export function findContractOrphans(provider, options = {}) {
|
|
|
201
214
|
notes.push("More endpoints exist than were enumerated, so this report covers a prefix of the graph " +
|
|
202
215
|
"rather than all of it. Endpoints beyond the cap were not examined and are not clean.");
|
|
203
216
|
}
|
|
217
|
+
if (mount.truncated) {
|
|
218
|
+
notes.push("More API_ROUTE nodes exist than were enumerated for the mounted-route check, so that check " +
|
|
219
|
+
"covers a prefix of the graph rather than all of it.");
|
|
220
|
+
}
|
|
204
221
|
if (unkeyed > 0) {
|
|
205
222
|
notes.push(`${unkeyed} endpoint(s) carry no method or path template and could not be compared to ` +
|
|
206
223
|
"anything. A producer emitted a join node without the two attributes the join is made of.");
|
|
@@ -211,6 +228,9 @@ export function findContractOrphans(provider, options = {}) {
|
|
|
211
228
|
"explanation is a service outside this workspace, and the honest statement is that their " +
|
|
212
229
|
"provider was never read.");
|
|
213
230
|
}
|
|
231
|
+
if (mount.routesWithoutMountInfo > 0) {
|
|
232
|
+
notes.push(routesWithoutMountInfoNote(mount.routesWithoutMountInfo));
|
|
233
|
+
}
|
|
214
234
|
notes.push(PATH_LEVEL_ONLY_NOTE);
|
|
215
235
|
let floor = 4;
|
|
216
236
|
for (const finding of kept)
|
|
@@ -220,16 +240,25 @@ export function findContractOrphans(provider, options = {}) {
|
|
|
220
240
|
floor = 2;
|
|
221
241
|
return report(provider, {
|
|
222
242
|
findings: kept,
|
|
243
|
+
findingsTotal: findings.length,
|
|
223
244
|
checked: {
|
|
224
245
|
endpoints: sided.length,
|
|
225
246
|
withCallers: withCallers.length,
|
|
226
247
|
withRoutes: withRoutes.length,
|
|
227
248
|
joined: joined.length,
|
|
249
|
+
routesWithMountInfo: mount.routesWithMountInfo,
|
|
250
|
+
routesUnmounted: mount.routesUnmounted,
|
|
228
251
|
},
|
|
229
252
|
unmatchedWithoutNearMiss,
|
|
230
253
|
shapesCompared: false,
|
|
231
254
|
}, floor, truncated, notes);
|
|
232
255
|
}
|
|
256
|
+
/** Shared wording for the precision guard — a route with no `attrs.mounted` at all is not evidence either way. */
|
|
257
|
+
function routesWithoutMountInfoNote(count) {
|
|
258
|
+
return (`${count} route(s) in the graph carry no attrs.mounted at all, so mount status could not be ` +
|
|
259
|
+
"checked for them. That is not the same as confirming they are mounted — it means the " +
|
|
260
|
+
"producer that read them does not report mounting, and no finding is made either way.");
|
|
261
|
+
}
|
|
233
262
|
function describeCallers(callers) {
|
|
234
263
|
const first = callers[0];
|
|
235
264
|
if (first === undefined)
|
|
@@ -243,10 +272,11 @@ function describeRoutes(routes) {
|
|
|
243
272
|
return "an unknown route";
|
|
244
273
|
return routes.length === 1 ? first.name : `${first.name} and ${routes.length - 1} other(s)`;
|
|
245
274
|
}
|
|
246
|
-
function emptyReport(endpoints, withCallers, withRoutes, joined) {
|
|
275
|
+
function emptyReport(endpoints, withCallers, withRoutes, joined, routesWithMountInfo = 0, routesUnmounted = 0) {
|
|
247
276
|
return {
|
|
248
277
|
findings: [],
|
|
249
|
-
|
|
278
|
+
findingsTotal: 0,
|
|
279
|
+
checked: { endpoints, withCallers, withRoutes, joined, routesWithMountInfo, routesUnmounted },
|
|
250
280
|
unmatchedWithoutNearMiss: 0,
|
|
251
281
|
shapesCompared: false,
|
|
252
282
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orphans.js","sourceRoot":"","sources":["../../src/contracts/orphans.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"orphans.js","sourceRoot":"","sources":["../../src/contracts/orphans.ts"],"names":[],"mappings":"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"}
|