@loopover/engine 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (272) hide show
  1. package/CHANGELOG.md +94 -0
  2. package/LICENSE +661 -0
  3. package/README.md +676 -0
  4. package/dist/advisory/gate-advisory.d.ts +151 -0
  5. package/dist/advisory/gate-advisory.js +512 -0
  6. package/dist/ai-policy-map.d.ts +97 -0
  7. package/dist/ai-policy-map.js +377 -0
  8. package/dist/ams-policy-spec.d.ts +56 -0
  9. package/dist/ams-policy-spec.js +165 -0
  10. package/dist/calibration-dashboard.d.ts +23 -0
  11. package/dist/calibration-dashboard.js +65 -0
  12. package/dist/calibration-trend.d.ts +40 -0
  13. package/dist/calibration-trend.js +60 -0
  14. package/dist/contributor-fit.d.ts +24 -0
  15. package/dist/contributor-fit.js +50 -0
  16. package/dist/discovery-index-contract.d.ts +74 -0
  17. package/dist/discovery-index-contract.js +184 -0
  18. package/dist/discovery-soft-claim.d.ts +35 -0
  19. package/dist/discovery-soft-claim.js +50 -0
  20. package/dist/duplicate-winner.d.ts +57 -0
  21. package/dist/duplicate-winner.js +98 -0
  22. package/dist/feasibility.d.ts +27 -0
  23. package/dist/feasibility.js +86 -0
  24. package/dist/finding-severity-calibration.d.ts +116 -0
  25. package/dist/finding-severity-calibration.js +457 -0
  26. package/dist/fleet-run-manifest.d.ts +41 -0
  27. package/dist/fleet-run-manifest.js +151 -0
  28. package/dist/focus-manifest/guidance.d.ts +21 -0
  29. package/dist/focus-manifest/guidance.js +222 -0
  30. package/dist/focus-manifest.d.ts +826 -0
  31. package/dist/focus-manifest.js +2730 -0
  32. package/dist/gate-verdict-calibration.d.ts +111 -0
  33. package/dist/gate-verdict-calibration.js +411 -0
  34. package/dist/github/constants.d.ts +1 -0
  35. package/dist/github/constants.js +1 -0
  36. package/dist/github/sanitize-public-comment.d.ts +1 -0
  37. package/dist/github/sanitize-public-comment.js +26 -0
  38. package/dist/goal-model.d.ts +7 -0
  39. package/dist/goal-model.js +87 -0
  40. package/dist/governor/action-mode.d.ts +55 -0
  41. package/dist/governor/action-mode.js +74 -0
  42. package/dist/governor/budget-cap.d.ts +49 -0
  43. package/dist/governor/budget-cap.js +34 -0
  44. package/dist/governor/chokepoint.d.ts +58 -0
  45. package/dist/governor/chokepoint.js +269 -0
  46. package/dist/governor/kill-switch.d.ts +38 -0
  47. package/dist/governor/kill-switch.js +62 -0
  48. package/dist/governor/rate-limit.d.ts +40 -0
  49. package/dist/governor/rate-limit.js +63 -0
  50. package/dist/governor/reputation-throttle.d.ts +50 -0
  51. package/dist/governor/reputation-throttle.js +94 -0
  52. package/dist/governor/run-halt.d.ts +39 -0
  53. package/dist/governor/run-halt.js +83 -0
  54. package/dist/governor/self-plagiarism.d.ts +47 -0
  55. package/dist/governor/self-plagiarism.js +200 -0
  56. package/dist/governor/write-rate-limit.d.ts +52 -0
  57. package/dist/governor/write-rate-limit.js +132 -0
  58. package/dist/governor-ledger.d.ts +25 -0
  59. package/dist/governor-ledger.js +91 -0
  60. package/dist/index.d.ts +99 -0
  61. package/dist/index.js +120 -0
  62. package/dist/issue-plan-decomposition.d.ts +18 -0
  63. package/dist/issue-plan-decomposition.js +56 -0
  64. package/dist/issue-rag-query.d.ts +12 -0
  65. package/dist/issue-rag-query.js +35 -0
  66. package/dist/local-scorer.d.ts +34 -0
  67. package/dist/local-scorer.js +36 -0
  68. package/dist/metadata-best-min-score.d.ts +9 -0
  69. package/dist/metadata-best-min-score.js +9 -0
  70. package/dist/metadata-best-pick.d.ts +9 -0
  71. package/dist/metadata-best-pick.js +9 -0
  72. package/dist/metadata-min-score.d.ts +9 -0
  73. package/dist/metadata-min-score.js +13 -0
  74. package/dist/metadata-top-min-score.d.ts +9 -0
  75. package/dist/metadata-top-min-score.js +13 -0
  76. package/dist/metadata-top-pick.d.ts +9 -0
  77. package/dist/metadata-top-pick.js +13 -0
  78. package/dist/miner/acceptance-criteria.d.ts +43 -0
  79. package/dist/miner/acceptance-criteria.js +77 -0
  80. package/dist/miner/agent-sdk-driver.d.ts +39 -0
  81. package/dist/miner/agent-sdk-driver.js +162 -0
  82. package/dist/miner/attempt-log.d.ts +29 -0
  83. package/dist/miner/attempt-log.js +100 -0
  84. package/dist/miner/attempt-metering.d.ts +39 -0
  85. package/dist/miner/attempt-metering.js +67 -0
  86. package/dist/miner/cli-subprocess-driver.d.ts +68 -0
  87. package/dist/miner/cli-subprocess-driver.js +272 -0
  88. package/dist/miner/coding-agent-driver.d.ts +33 -0
  89. package/dist/miner/coding-agent-driver.js +36 -0
  90. package/dist/miner/coding-agent-invoke.d.ts +11 -0
  91. package/dist/miner/coding-agent-invoke.js +80 -0
  92. package/dist/miner/coding-agent-mode.d.ts +25 -0
  93. package/dist/miner/coding-agent-mode.js +43 -0
  94. package/dist/miner/driver-factory.d.ts +82 -0
  95. package/dist/miner/driver-factory.js +169 -0
  96. package/dist/miner/harness-submission-trigger.d.ts +37 -0
  97. package/dist/miner/harness-submission-trigger.js +46 -0
  98. package/dist/miner/iterate-loop.d.ts +97 -0
  99. package/dist/miner/iterate-loop.js +278 -0
  100. package/dist/miner/iterate-policy.d.ts +98 -0
  101. package/dist/miner/iterate-policy.js +98 -0
  102. package/dist/miner/lint-guard.d.ts +50 -0
  103. package/dist/miner/lint-guard.js +68 -0
  104. package/dist/miner/local-write-tools.d.ts +81 -0
  105. package/dist/miner/local-write-tools.js +113 -0
  106. package/dist/miner/loop-reentry-policy.d.ts +36 -0
  107. package/dist/miner/loop-reentry-policy.js +53 -0
  108. package/dist/miner/repo-map.d.ts +51 -0
  109. package/dist/miner/repo-map.js +268 -0
  110. package/dist/miner/self-review-adapter.d.ts +106 -0
  111. package/dist/miner/self-review-adapter.js +83 -0
  112. package/dist/miner/submission-gate.d.ts +40 -0
  113. package/dist/miner/submission-gate.js +89 -0
  114. package/dist/miner/worktree-allocator.d.ts +59 -0
  115. package/dist/miner/worktree-allocator.js +60 -0
  116. package/dist/miner/worktree-pool.d.ts +55 -0
  117. package/dist/miner/worktree-pool.js +65 -0
  118. package/dist/miner-goal-lane-fit.d.ts +18 -0
  119. package/dist/miner-goal-lane-fit.js +76 -0
  120. package/dist/miner-goal-spec.d.ts +139 -0
  121. package/dist/miner-goal-spec.js +281 -0
  122. package/dist/miner-prediction-metrics.d.ts +16 -0
  123. package/dist/miner-prediction-metrics.js +61 -0
  124. package/dist/miner-telemetry.d.ts +32 -0
  125. package/dist/miner-telemetry.js +87 -0
  126. package/dist/objective-anchor.d.ts +125 -0
  127. package/dist/objective-anchor.js +401 -0
  128. package/dist/opportunity-competition.d.ts +6 -0
  129. package/dist/opportunity-competition.js +29 -0
  130. package/dist/opportunity-freshness.d.ts +18 -0
  131. package/dist/opportunity-freshness.js +55 -0
  132. package/dist/opportunity-metadata.d.ts +53 -0
  133. package/dist/opportunity-metadata.js +204 -0
  134. package/dist/opportunity-ranker.d.ts +46 -0
  135. package/dist/opportunity-ranker.js +74 -0
  136. package/dist/pairwise-calibration.d.ts +49 -0
  137. package/dist/pairwise-calibration.js +106 -0
  138. package/dist/phase7-calibration-loop.d.ts +136 -0
  139. package/dist/phase7-calibration-loop.js +437 -0
  140. package/dist/plan-blocked.d.ts +6 -0
  141. package/dist/plan-blocked.js +24 -0
  142. package/dist/plan-completed.d.ts +5 -0
  143. package/dist/plan-completed.js +6 -0
  144. package/dist/plan-completion.d.ts +6 -0
  145. package/dist/plan-completion.js +7 -0
  146. package/dist/plan-empty.d.ts +5 -0
  147. package/dist/plan-empty.js +6 -0
  148. package/dist/plan-export.d.ts +27 -0
  149. package/dist/plan-export.js +86 -0
  150. package/dist/plan-failure.d.ts +5 -0
  151. package/dist/plan-failure.js +6 -0
  152. package/dist/plan-overall-status.d.ts +6 -0
  153. package/dist/plan-overall-status.js +25 -0
  154. package/dist/plan-pending.d.ts +5 -0
  155. package/dist/plan-pending.js +6 -0
  156. package/dist/plan-progress-complete.d.ts +7 -0
  157. package/dist/plan-progress-complete.js +10 -0
  158. package/dist/plan-ready.d.ts +6 -0
  159. package/dist/plan-ready.js +12 -0
  160. package/dist/plan-running.d.ts +5 -0
  161. package/dist/plan-running.js +6 -0
  162. package/dist/plan-skipped.d.ts +5 -0
  163. package/dist/plan-skipped.js +6 -0
  164. package/dist/plan-step-count.d.ts +5 -0
  165. package/dist/plan-step-count.js +6 -0
  166. package/dist/plan-step-stats.d.ts +5 -0
  167. package/dist/plan-step-stats.js +6 -0
  168. package/dist/plan-templates.d.ts +25 -0
  169. package/dist/plan-templates.js +107 -0
  170. package/dist/plan-terminated.d.ts +6 -0
  171. package/dist/plan-terminated.js +9 -0
  172. package/dist/portfolio/non-convergence.d.ts +37 -0
  173. package/dist/portfolio/non-convergence.js +57 -0
  174. package/dist/portfolio/queue.d.ts +30 -0
  175. package/dist/portfolio/queue.js +150 -0
  176. package/dist/predicted-gate.d.ts +103 -0
  177. package/dist/predicted-gate.js +218 -0
  178. package/dist/prompt-packet.d.ts +11 -0
  179. package/dist/prompt-packet.js +34 -0
  180. package/dist/ranked-opportunity-best-min-score.d.ts +8 -0
  181. package/dist/ranked-opportunity-best-min-score.js +9 -0
  182. package/dist/ranked-opportunity-best-pick.d.ts +8 -0
  183. package/dist/ranked-opportunity-best-pick.js +9 -0
  184. package/dist/ranked-opportunity-min-score.d.ts +8 -0
  185. package/dist/ranked-opportunity-min-score.js +13 -0
  186. package/dist/ranked-opportunity-top-min-score.d.ts +8 -0
  187. package/dist/ranked-opportunity-top-min-score.js +13 -0
  188. package/dist/review/advisory-ai-routing-config.d.ts +8 -0
  189. package/dist/review/advisory-ai-routing-config.js +40 -0
  190. package/dist/review/check-names.d.ts +1 -0
  191. package/dist/review/check-names.js +1 -0
  192. package/dist/review/cla-check.d.ts +49 -0
  193. package/dist/review/cla-check.js +71 -0
  194. package/dist/review/diff-file-priority.d.ts +1 -0
  195. package/dist/review/diff-file-priority.js +12 -0
  196. package/dist/review/enrichment-analyzer-names.d.ts +3 -0
  197. package/dist/review/enrichment-analyzer-names.js +63 -0
  198. package/dist/review/guardrail-config.d.ts +10 -0
  199. package/dist/review/guardrail-config.js +62 -0
  200. package/dist/review/linked-issue-hard-rules-config.d.ts +4 -0
  201. package/dist/review/linked-issue-hard-rules-config.js +79 -0
  202. package/dist/review/linked-issue-label-propagation.d.ts +9 -0
  203. package/dist/review/linked-issue-label-propagation.js +114 -0
  204. package/dist/review/pre-merge-checks.d.ts +28 -0
  205. package/dist/review/pre-merge-checks.js +66 -0
  206. package/dist/review/review-thread-findings.d.ts +1 -0
  207. package/dist/review/review-thread-findings.js +1 -0
  208. package/dist/review/safe-url.d.ts +5 -0
  209. package/dist/review/safe-url.js +137 -0
  210. package/dist/review/screenshot-table-gate.d.ts +87 -0
  211. package/dist/review/screenshot-table-gate.js +340 -0
  212. package/dist/review/unlinked-issue-guardrail-config.d.ts +9 -0
  213. package/dist/review/unlinked-issue-guardrail-config.js +44 -0
  214. package/dist/reviewer-consensus-calibration.d.ts +113 -0
  215. package/dist/reviewer-consensus-calibration.js +493 -0
  216. package/dist/reward-risk.d.ts +223 -0
  217. package/dist/reward-risk.js +618 -0
  218. package/dist/scoring/label-match.d.ts +4 -0
  219. package/dist/scoring/label-match.js +145 -0
  220. package/dist/scoring/model.d.ts +31 -0
  221. package/dist/scoring/model.js +157 -0
  222. package/dist/scoring/pending-pr-scenarios.d.ts +44 -0
  223. package/dist/scoring/pending-pr-scenarios.js +145 -0
  224. package/dist/scoring/preview.d.ts +246 -0
  225. package/dist/scoring/preview.js +1108 -0
  226. package/dist/scoring/types.d.ts +131 -0
  227. package/dist/scoring/types.js +7 -0
  228. package/dist/settings/auto-close-exempt.d.ts +10 -0
  229. package/dist/settings/auto-close-exempt.js +58 -0
  230. package/dist/settings/autonomy.d.ts +33 -0
  231. package/dist/settings/autonomy.js +80 -0
  232. package/dist/settings/command-authorization.d.ts +49 -0
  233. package/dist/settings/command-authorization.js +222 -0
  234. package/dist/settings/contributor-blacklist.d.ts +17 -0
  235. package/dist/settings/contributor-blacklist.js +86 -0
  236. package/dist/settings/moderation-rules.d.ts +51 -0
  237. package/dist/settings/moderation-rules.js +104 -0
  238. package/dist/settings/pr-type-label.d.ts +70 -0
  239. package/dist/settings/pr-type-label.js +149 -0
  240. package/dist/signals/change-guardrail.d.ts +49 -0
  241. package/dist/signals/change-guardrail.js +164 -0
  242. package/dist/signals/check-summary.d.ts +9 -0
  243. package/dist/signals/check-summary.js +12 -0
  244. package/dist/signals/contributor-calibration.d.ts +23 -0
  245. package/dist/signals/contributor-calibration.js +47 -0
  246. package/dist/signals/duplicate-winner.d.ts +9 -0
  247. package/dist/signals/duplicate-winner.js +9 -0
  248. package/dist/signals/path-matchers.d.ts +36 -0
  249. package/dist/signals/path-matchers.js +371 -0
  250. package/dist/signals/predicted-gate-engine.d.ts +62 -0
  251. package/dist/signals/predicted-gate-engine.js +895 -0
  252. package/dist/signals/preflight-limits.d.ts +14 -0
  253. package/dist/signals/preflight-limits.js +14 -0
  254. package/dist/signals/slop.d.ts +56 -0
  255. package/dist/signals/slop.js +324 -0
  256. package/dist/signals/test-evidence.d.ts +25 -0
  257. package/dist/signals/test-evidence.js +108 -0
  258. package/dist/subprocess-env.d.ts +23 -0
  259. package/dist/subprocess-env.js +74 -0
  260. package/dist/track-record-summary.d.ts +92 -0
  261. package/dist/track-record-summary.js +301 -0
  262. package/dist/types/manifest-deps-types.d.ts +514 -0
  263. package/dist/types/manifest-deps-types.js +4 -0
  264. package/dist/types/predicted-gate-types.d.ts +338 -0
  265. package/dist/types/predicted-gate-types.js +3 -0
  266. package/dist/types/reward-risk-types.d.ts +319 -0
  267. package/dist/types/reward-risk-types.js +11 -0
  268. package/dist/utils/json.d.ts +1 -0
  269. package/dist/utils/json.js +3 -0
  270. package/dist/version.d.ts +2 -0
  271. package/dist/version.js +3 -0
  272. package/package.json +80 -0
@@ -0,0 +1,246 @@
1
+ import type { ContributorEvidenceRecord, RepositoryRecord, RepoTimeDecayOverrides, ScoringModelSnapshotRecord, ScorePreviewRecord } from "./types.js";
2
+ export type ScorePreviewInput = {
3
+ repoFullName: string;
4
+ targetType?: ScorePreviewRecord["targetType"];
5
+ targetKey?: string | undefined;
6
+ contributorLogin?: string | undefined;
7
+ labels?: string[] | undefined;
8
+ linkedIssueMode?: "none" | "standard" | "maintainer" | undefined;
9
+ linkedIssueContext?: LinkedIssueMultiplierContext | undefined;
10
+ sourceTokenScore?: number | undefined;
11
+ totalTokenScore?: number | undefined;
12
+ sourceLines?: number | undefined;
13
+ testTokenScore?: number | undefined;
14
+ nonCodeTokenScore?: number | undefined;
15
+ /** Raw non-code line count before upstream's MAX_LINES_SCORED_FOR_NON_CODE_EXT cap. */
16
+ nonCodeLines?: number | undefined;
17
+ existingContributorTokenScore?: number | undefined;
18
+ openPrCount?: number | undefined;
19
+ /** Contributor's current open-issue count for the repo, used for the open-issue spam gate (#808). */
20
+ openIssueCount?: number | undefined;
21
+ /** Repo-level merged PR count for upstream contributor-history eligibility (#808). */
22
+ mergedPullRequests?: number | undefined;
23
+ /** Count of valid solved issues for upstream issue-discovery eligibility (#808). */
24
+ validSolvedIssues?: number | undefined;
25
+ /** Issue-discovery credibility for upstream issue-discovery eligibility (#808). */
26
+ issueCredibility?: number | undefined;
27
+ credibility?: number | undefined;
28
+ changesRequestedCount?: number | undefined;
29
+ fixedBaseScore?: number | undefined;
30
+ metadataOnly?: boolean | undefined;
31
+ pendingMergedPrCount?: number | undefined;
32
+ pendingClosedPrCount?: number | undefined;
33
+ approvedPrCount?: number | undefined;
34
+ observedApprovedPrCount?: number | undefined;
35
+ observedStalePrCount?: number | undefined;
36
+ observedClosedPrCount?: number | undefined;
37
+ observedDraftPrCount?: number | undefined;
38
+ observedBlockedPrCount?: number | undefined;
39
+ observedMaintainerPrCount?: number | undefined;
40
+ duplicateRiskCount?: number | undefined;
41
+ expectedOpenPrCountAfterMerge?: number | undefined;
42
+ projectedCredibility?: number | undefined;
43
+ scenarioNotes?: string[] | undefined;
44
+ pendingScenarioObserved?: boolean | undefined;
45
+ observedScenarioNotes?: string[] | undefined;
46
+ branchEligibility?: BranchEligibilityInput | undefined;
47
+ /** Hours since the PR merged, for upstream time-decay (#703). Absent / below the grace period = a fresh
48
+ * PR (multiplier 1.0). Only consulted when `applyTimeDecay` is on. */
49
+ prAgeHours?: number | undefined;
50
+ /** Opt-in upstream time-decay (#703), default OFF and env-gated (SCORING_TIME_DECAY_ENABLED) at the call
51
+ * site. Even when on, a fresh PR is unaffected, so it never changes a normal new-PR preview. */
52
+ applyTimeDecay?: boolean | undefined;
53
+ };
54
+ export type BranchEligibilityInput = {
55
+ status: "eligible" | "ineligible" | "unknown";
56
+ source?: "github_metadata" | "local_metadata" | "registry" | "user_supplied" | undefined;
57
+ reason?: string | undefined;
58
+ checkedAt?: string | undefined;
59
+ stale?: boolean | undefined;
60
+ };
61
+ export type BranchEligibilityResult = {
62
+ required: boolean;
63
+ status: "eligible" | "ineligible" | "unknown" | "not_required";
64
+ evidence: "provided" | "missing";
65
+ source: "github_metadata" | "local_metadata" | "registry" | "user_supplied" | "missing";
66
+ reason?: string | undefined;
67
+ checkedAt?: string | undefined;
68
+ stale: boolean;
69
+ warnings: string[];
70
+ };
71
+ export type LinkedIssueMultiplierStatus = "not_required" | "raw" | "plausible" | "validated" | "invalid" | "unavailable";
72
+ export type LinkedIssueMultiplierSource = "none" | "user_supplied" | "official_mirror" | "github_cache" | "issue_quality" | "missing";
73
+ export type LinkedIssueMultiplierContext = {
74
+ status?: Exclude<LinkedIssueMultiplierStatus, "not_required"> | undefined;
75
+ source?: Exclude<LinkedIssueMultiplierSource, "none"> | undefined;
76
+ issueNumbers?: number[] | undefined;
77
+ solvedByPullRequests?: number[] | undefined;
78
+ reason?: string | undefined;
79
+ warnings?: string[] | undefined;
80
+ };
81
+ export type LinkedIssueMultiplierDecision = {
82
+ mode: "none" | "standard" | "maintainer";
83
+ status: LinkedIssueMultiplierStatus;
84
+ source: LinkedIssueMultiplierSource;
85
+ eligible: boolean;
86
+ issueNumbers: number[];
87
+ solvedByPullRequests: number[];
88
+ baseMultiplier: number;
89
+ appliedMultiplier: number;
90
+ reason: string;
91
+ warnings: string[];
92
+ };
93
+ export type ScoreGateBlocker = {
94
+ code: "repo_not_registered" | "inactive_allocation" | "base_token_gate" | "open_pr_threshold" | "open_issue_threshold" | "merged_pr_history_floor" | "issue_discovery_validity_floor" | "credibility_floor" | "review_penalty" | "metadata_only" | "linked_issue_invalid" | "linked_issue_unvalidated" | "branch_ineligible" | "branch_eligibility_missing" | "duplicate_risk" | "stale_work";
95
+ severity: "blocker" | "reducer" | "context";
96
+ detail: string;
97
+ };
98
+ export type ScoreGateDelta = {
99
+ gate: "open_pr_threshold" | "open_issue_threshold" | "merged_pr_history_floor" | "issue_discovery_validity_floor" | "credibility_floor" | "linked_issue_multiplier";
100
+ current: string;
101
+ projected: string;
102
+ explanation: string;
103
+ };
104
+ export type ScoreScenarioPreview = {
105
+ name: "current" | "cleanGates" | "afterPendingMerges" | "afterApprovedPrsMerge" | "afterStalePrsClose" | "linkedIssueFixed" | "bestReasonableCase";
106
+ source: "current_data" | "user_supplied" | "github_observed" | "gittensory_projection";
107
+ assumptions: string[];
108
+ scoreEstimate: ScorePreviewResult["scoreEstimate"];
109
+ gates: ScorePreviewResult["gates"];
110
+ effectiveEstimatedScore: number;
111
+ underlyingPotentialScore: number;
112
+ blockedBy: ScoreGateBlocker[];
113
+ linkedIssueMultiplier: LinkedIssueMultiplierDecision;
114
+ deltaExplanation: string;
115
+ };
116
+ export type ScorePreviewResult = {
117
+ repoFullName: string;
118
+ generatedAt: string;
119
+ scoringModelSnapshotId: string;
120
+ activeModel: ScoringModelSnapshotRecord["activeModel"];
121
+ privateOnly: true;
122
+ laneMath: {
123
+ repoEmissionShare: number;
124
+ ossEmissionShare: number;
125
+ repoSlice: number;
126
+ directPrSlice: number;
127
+ issueDiscoverySlice: number;
128
+ issueDiscoveryShare: number;
129
+ };
130
+ scoreEstimate: {
131
+ /** Computed base score (the earned foundation before multipliers apply). */
132
+ baseScore: number;
133
+ /** The maximum possible baseScore given the active model and snapshot constants; used by the score
134
+ * breakdown to surface saturation vs sub-cap status. Undefined when a fixedBaseScore override is in
135
+ * effect (the override is not bounded by the model cap). */
136
+ baseScoreCap?: number;
137
+ densityMultiplier: number;
138
+ contributionBonus: number;
139
+ labelMultiplier: number;
140
+ issueMultiplier: number;
141
+ credibilityMultiplier: number;
142
+ reviewPenaltyMultiplier: number;
143
+ openPrMultiplier: number;
144
+ openIssueMultiplier: number;
145
+ /** Upstream merged-PR history floor (#808). 0 when below MIN_VALID_MERGED_PRS; 1 when unknown or eligible. */
146
+ mergedHistoryMultiplier: number;
147
+ /** Upstream issue-discovery validity floor (#808). 0 when below MIN_VALID_SOLVED_ISSUES or MIN_ISSUE_CREDIBILITY. */
148
+ issueDiscoveryHistoryMultiplier: number;
149
+ /** Upstream sigmoid time-decay multiplier (#703). 1 = no decay (fresh PR, or feature off). */
150
+ timeDecayMultiplier: number;
151
+ estimatedMergedScore: number;
152
+ pendingSaturationScore: number;
153
+ };
154
+ linkedIssueMultiplier: LinkedIssueMultiplierDecision;
155
+ gates: {
156
+ baseTokenGatePassed: boolean;
157
+ openPrThreshold: number;
158
+ openPrCount: number;
159
+ /** Effective open-PR collateral fraction (OPEN_PR_COLLATERAL_PERCENT × reviewCollateralMultiplier). */
160
+ collateralFraction: number;
161
+ /** Upstream open-PR review-collateral multiplier from CHANGES_REQUESTED reviews (≥ 1, capped). */
162
+ reviewCollateralMultiplier: number;
163
+ credibilityFloor: number;
164
+ credibilityObserved: number;
165
+ openIssueThreshold: number;
166
+ openIssueCount: number;
167
+ mergedPrFloor: number;
168
+ /** Observed merged PR count when supplied or inferred from contributor evidence; absent when unknown. */
169
+ mergedPullRequests?: number | undefined;
170
+ validSolvedIssuesFloor: number;
171
+ /** Observed valid solved-issue count when supplied; absent when unknown. */
172
+ validSolvedIssues?: number | undefined;
173
+ issueCredibilityFloor: number;
174
+ /** Observed issue-discovery credibility when supplied; absent when unknown. */
175
+ issueCredibility?: number | undefined;
176
+ /** Upstream non-code line scoring cap (MAX_LINES_SCORED_FOR_NON_CODE_EXT); non-code token score beyond this
177
+ * many changed non-code lines is not scored. */
178
+ nonCodeLineCap: number;
179
+ /** Observed raw non-code line count before the cap; absent when no non-code line count was supplied. */
180
+ nonCodeLinesObserved?: number | undefined;
181
+ };
182
+ branchEligibility: BranchEligibilityResult;
183
+ effectiveEstimatedScore: number;
184
+ underlyingPotentialScore: number;
185
+ blockedBy: ScoreGateBlocker[];
186
+ gateDeltas: ScoreGateDelta[];
187
+ scenarioPreviews: ScoreScenarioPreview[];
188
+ scoreabilityStatus: "blocked" | "conditionally_scoreable" | "scoreable" | "hold";
189
+ warnings: string[];
190
+ assumptions: string[];
191
+ recommendation: {
192
+ level: "strong_fit" | "reasonable_fit" | "needs_work" | "hold";
193
+ actions: string[];
194
+ };
195
+ };
196
+ export declare function buildScorePreview(args: {
197
+ input: ScorePreviewInput;
198
+ repo: RepositoryRecord | null;
199
+ snapshot: ScoringModelSnapshotRecord;
200
+ contributorEvidence?: ContributorEvidenceRecord | null | undefined;
201
+ }): ScorePreviewResult;
202
+ export declare function makeScorePreviewRecord(input: ScorePreviewInput, snapshot: ScoringModelSnapshotRecord, result: ScorePreviewResult): ScorePreviewRecord;
203
+ /** True when `label` matches the configured multiplier `pattern` under the SAME case-insensitive fnmatch glob
204
+ * semantics scoring uses to resolve label multipliers (see {@link labelPatternToRegExp}). Exported so the
205
+ * signals surfaces that audit configured label keys (config-quality, label-audit) match them as the GLOBS they
206
+ * are: a `type:*` key must count `type:bug-fix` as observed/configured, not silently report it missing because
207
+ * the literal pattern never appears verbatim on a real issue/PR. A literal key (no glob metacharacter) still
208
+ * matches only its exact label, so existing configs behave identically. */
209
+ export declare function labelMatchesPattern(label: string, pattern: string): boolean;
210
+ export declare const LABEL_PATTERN_REGEXP_CACHE_MAX_ENTRIES = 256;
211
+ export declare function clearLabelPatternRegExpCacheForTest(): void;
212
+ export declare function labelPatternRegExpCacheKeysForTest(): string[];
213
+ /**
214
+ * Project the standard linked-issue multiplier decision under the assumption that a planned PR
215
+ * becomes the merged solver of the given issue(s). Reuses {@link decideLinkedIssueMultiplier} — the
216
+ * same eligibility rule used by buildScorePreview — so standalone validators stay consistent with
217
+ * the scoring engine. The numeric multiplier on the returned decision is private; callers that are
218
+ * public-safe should surface only `eligible`/`status`/`reason`.
219
+ */
220
+ export declare function projectLinkedIssueMultiplierForPlannedSolve(issueNumbers: number[]): LinkedIssueMultiplierDecision;
221
+ /**
222
+ * Resolve a repo's time-decay curve: each parameter is the repo's per-repo override (from the registry's
223
+ * `scoring.time_decay`) when present, else the global default constant from the live scoring snapshot.
224
+ * Mirrors upstream's `resolve_time_decay` (RepoTimeDecayConfig overlaid on the module constants).
225
+ *
226
+ * Parity note (#1320): upstream coerces ONLY `grace_period_hours` to an integer
227
+ * (`grace_period_hours=int(pick(...))`) while the three curve params stay floats. A maintainer may legally
228
+ * configure a fractional grace (upstream validates `0 <= grace_period_hours <= 168`), so the resolved grace
229
+ * must be truncated toward zero to match the validator — otherwise a PR aged between `trunc(grace)` and
230
+ * `grace` is treated as fresh in the preview but already decaying upstream.
231
+ */
232
+ export declare function resolveTimeDecay(constants: Record<string, number>, overrides?: RepoTimeDecayOverrides | null): {
233
+ gracePeriodHours: number;
234
+ sigmoidMidpointDays: number;
235
+ sigmoidSteepness: number;
236
+ minMultiplier: number;
237
+ };
238
+ /**
239
+ * Upstream gittensor's sigmoid time-decay multiplier (#703), ported verbatim from the validator's
240
+ * `calculate_time_decay` (gittensor/validator/utils/datetime_utils.py): for the first grace-period hours the
241
+ * multiplier is exactly 1.0 (hard cutoff); after that it follows a logistic on days-since-merge centred at
242
+ * the sigmoid midpoint (50% at that point), floored at the minimum multiplier. The curve params are
243
+ * resolved PER-REPO (overrides ?? snapshot defaults), so each maintainer's registry hyperparameters apply.
244
+ * Pure + deterministic.
245
+ */
246
+ export declare function calculateTimeDecay(prAgeHours: number, constants: Record<string, number>, overrides?: RepoTimeDecayOverrides | null): number;