Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
125 commits
Select commit Hold shift + click to select a range
8c6b049
Add Rush reporter repository configuration
TheLarkInn Aug 28, 2026
b4f0fc1
Add Rush reporter frontend controls
TheLarkInn Aug 28, 2026
2450d5f
Fix reporter frontend integration
TheLarkInn Aug 28, 2026
c6b0349
Emit shadow Rush lifecycle events
TheLarkInn Aug 28, 2026
b80a277
Add feature-flagged operation event adapter
TheLarkInn Aug 28, 2026
481b4f5
Fix operation reporter stream edge cases
TheLarkInn Aug 28, 2026
cbff953
Harden reporter demo integration
TheLarkInn Aug 28, 2026
8a64282
Harden AI reporter qualification gates
TheLarkInn Aug 28, 2026
0ad2e30
Fix reporter frontend argument and close lifecycle
TheLarkInn Aug 28, 2026
4cb2448
Preserve Rush CLI reporter compatibility
TheLarkInn Aug 28, 2026
00f16e1
Refine reporter flag ownership
TheLarkInn Aug 28, 2026
a5f1f7c
Tolerate value-less custom reporter flags
TheLarkInn Aug 28, 2026
e83fa59
Fix operation stream review findings
TheLarkInn Aug 28, 2026
5aa1d2c
Fix reporter demo review findings
TheLarkInn Aug 28, 2026
965e0db
Fix reporter watch and lock handling
TheLarkInn Aug 28, 2026
ae5c475
Fix overlapping reporter watch cycles
TheLarkInn Aug 28, 2026
5fd4d10
Fix AI fallback privacy gates
TheLarkInn Aug 28, 2026
3250879
Redact secret reporter envelope context
TheLarkInn Aug 28, 2026
f093fbf
Stop execution after parser initialization failure
TheLarkInn Sep 3, 2026
7f47181
Isolate overlapping reporter watch cycles
TheLarkInn Sep 3, 2026
a87994b
Preserve reporter cycles across stream callbacks
TheLarkInn Sep 3, 2026
8431367
Redact secret human reporter messages
TheLarkInn Sep 3, 2026
61a3e54
Force nonzero parser failure exits
TheLarkInn Sep 3, 2026
23de51a
Expose scoped RushSession reporter producers
TheLarkInn Aug 28, 2026
023cf7e
Emit registrations for collapsed iterations
TheLarkInn Sep 3, 2026
04d04cc
Keep operation sink callbacks compatible
TheLarkInn Sep 3, 2026
2139b32
Keep operation stream callbacks compatible
TheLarkInn Sep 3, 2026
745843b
Align reporter completion with failure exit
TheLarkInn Sep 3, 2026
853470e
Complete shadow reporter parity coverage
TheLarkInn Aug 28, 2026
ccd34f3
Forward daemon operation completion events
TheLarkInn Sep 3, 2026
0ef86fa
Finalize machine privacy and zero-work cycles
TheLarkInn Sep 3, 2026
0debf23
Complete collapsed daemon operation cycles
TheLarkInn Sep 3, 2026
6af34ca
Add direct Rush reporter demo path
TheLarkInn Aug 28, 2026
384eab3
Preserve iteration callback compatibility
TheLarkInn Sep 3, 2026
9e90abf
Protect secret logs and callback compatibility
TheLarkInn Sep 3, 2026
6223f0d
Add deterministic AI reporter qualification gates
TheLarkInn Aug 28, 2026
90977fb
Preserve local-sensitive producer identity
TheLarkInn Sep 3, 2026
3b005ee
Isolate reporter configuration test fixtures from shared cleanup
TheLarkInn Sep 7, 2026
7e9a1cd
Add Rush reporter frontend controls
TheLarkInn Aug 28, 2026
43908fe
Fix reporter frontend integration
TheLarkInn Aug 28, 2026
b0056ee
Fix reporter frontend argument and close lifecycle
TheLarkInn Aug 28, 2026
c3dc2c1
Preserve Rush CLI reporter compatibility
TheLarkInn Aug 28, 2026
352aa37
Refine reporter flag ownership
TheLarkInn Aug 28, 2026
034f22d
Tolerate value-less custom reporter flags
TheLarkInn Aug 28, 2026
2c1d786
Stop execution after parser initialization failure
TheLarkInn Sep 3, 2026
c8637e5
Expose scoped RushSession reporter producers
TheLarkInn Aug 28, 2026
32562c8
Emit shadow Rush lifecycle events
TheLarkInn Aug 28, 2026
fde0436
Isolate overlapping reporter watch cycles
TheLarkInn Sep 3, 2026
1bc68af
Keep operation sink callbacks compatible
TheLarkInn Sep 3, 2026
3776ee9
Align reporter completion with failure exit
TheLarkInn Sep 3, 2026
707a019
Complete shadow reporter parity coverage
TheLarkInn Aug 28, 2026
8d665d9
Add feature-flagged operation event adapter
TheLarkInn Aug 28, 2026
3055cfb
Fix operation reporter stream edge cases
TheLarkInn Aug 28, 2026
daec75c
Fix operation stream review findings
TheLarkInn Aug 28, 2026
bf2379e
Preserve reporter cycles across stream callbacks
TheLarkInn Sep 3, 2026
e94c944
Emit registrations for collapsed iterations
TheLarkInn Sep 3, 2026
66110fa
Keep operation stream callbacks compatible
TheLarkInn Sep 3, 2026
4375f9f
Forward daemon operation completion events
TheLarkInn Sep 3, 2026
e38163f
Complete collapsed daemon operation cycles
TheLarkInn Sep 3, 2026
1c2a87f
Add direct Rush reporter demo path
TheLarkInn Aug 28, 2026
7c0fffd
Harden reporter demo integration
TheLarkInn Aug 28, 2026
52c50f8
Force nonzero parser failure exits
TheLarkInn Sep 3, 2026
7fb53ea
Fix reporter demo review findings
TheLarkInn Aug 28, 2026
fbbaae7
Fix reporter watch and lock handling
TheLarkInn Aug 28, 2026
b1eaa85
Fix overlapping reporter watch cycles
TheLarkInn Aug 28, 2026
cce4eb1
Redact secret human reporter messages
TheLarkInn Sep 3, 2026
4293aa3
Finalize machine privacy and zero-work cycles
TheLarkInn Sep 3, 2026
898b55f
Preserve iteration callback compatibility
TheLarkInn Sep 3, 2026
4d141b8
Protect secret logs and callback compatibility
TheLarkInn Sep 3, 2026
30a7814
Sync reporter PR #5999 with its restacked parent
TheLarkInn Sep 7, 2026
5bba19c
Add the missing reporter change note for R2B JSON controls
TheLarkInn Sep 7, 2026
e3bf1e7
Expose scoped RushSession reporter producers
TheLarkInn Aug 28, 2026
ce66517
Emit shadow Rush lifecycle events
TheLarkInn Aug 28, 2026
cd2e907
Isolate overlapping reporter watch cycles
TheLarkInn Sep 3, 2026
a5fd68e
Keep operation sink callbacks compatible
TheLarkInn Sep 3, 2026
b556aec
Align reporter completion with failure exit
TheLarkInn Sep 3, 2026
cc02a14
Complete shadow reporter parity coverage
TheLarkInn Aug 28, 2026
32bf313
Add feature-flagged operation event adapter
TheLarkInn Aug 28, 2026
6ee64ef
Fix operation reporter stream edge cases
TheLarkInn Aug 28, 2026
0ee3e23
Fix operation stream review findings
TheLarkInn Aug 28, 2026
17d5263
Preserve reporter cycles across stream callbacks
TheLarkInn Sep 3, 2026
ccad744
Emit registrations for collapsed iterations
TheLarkInn Sep 3, 2026
5ce23dd
Keep operation stream callbacks compatible
TheLarkInn Sep 3, 2026
f26743e
Forward daemon operation completion events
TheLarkInn Sep 3, 2026
f741114
Complete collapsed daemon operation cycles
TheLarkInn Sep 3, 2026
8e50a42
Add direct Rush reporter demo path
TheLarkInn Aug 28, 2026
8981d22
Harden reporter demo integration
TheLarkInn Aug 28, 2026
09a9fa1
Fix reporter demo review findings
TheLarkInn Aug 28, 2026
306fa70
Fix reporter watch and lock handling
TheLarkInn Aug 28, 2026
fb15ddc
Fix overlapping reporter watch cycles
TheLarkInn Aug 28, 2026
2d80a11
Redact secret human reporter messages
TheLarkInn Sep 3, 2026
41816e7
Finalize machine privacy and zero-work cycles
TheLarkInn Sep 3, 2026
2bc9601
Preserve iteration callback compatibility
TheLarkInn Sep 3, 2026
1c84401
Protect secret logs and callback compatibility
TheLarkInn Sep 3, 2026
2e4a8ca
Sync reporter PR #5999 with parent release metadata
TheLarkInn Sep 7, 2026
d57e66b
Expose scoped RushSession reporter producers
TheLarkInn Aug 28, 2026
e64ea11
Emit shadow Rush lifecycle events
TheLarkInn Aug 28, 2026
6dcfc56
Isolate overlapping reporter watch cycles
TheLarkInn Sep 3, 2026
21f0f0b
Keep operation sink callbacks compatible
TheLarkInn Sep 3, 2026
f7909be
Align reporter completion with failure exit
TheLarkInn Sep 3, 2026
a575d19
Complete shadow reporter parity coverage
TheLarkInn Aug 28, 2026
220da37
Add feature-flagged operation event adapter
TheLarkInn Aug 28, 2026
a1fa10d
Fix operation reporter stream edge cases
TheLarkInn Aug 28, 2026
87b8f81
Fix operation stream review findings
TheLarkInn Aug 28, 2026
e18f03f
Preserve reporter cycles across stream callbacks
TheLarkInn Sep 3, 2026
8e1e7fd
Emit registrations for collapsed iterations
TheLarkInn Sep 3, 2026
4efd6f5
Keep operation stream callbacks compatible
TheLarkInn Sep 3, 2026
646cb72
Forward daemon operation completion events
TheLarkInn Sep 3, 2026
7aa321f
Complete collapsed daemon operation cycles
TheLarkInn Sep 3, 2026
3cbffdf
Record Reporter operation forwarding release note
TheLarkInn Sep 7, 2026
ec08144
Add direct Rush reporter demo path
TheLarkInn Aug 28, 2026
562fbb0
Harden reporter demo integration
TheLarkInn Aug 28, 2026
1fe6931
Fix reporter demo review findings
TheLarkInn Aug 28, 2026
daa5ddd
Fix reporter watch and lock handling
TheLarkInn Aug 28, 2026
d6ff4f1
Fix overlapping reporter watch cycles
TheLarkInn Aug 28, 2026
aa6d91f
Redact secret human reporter messages
TheLarkInn Sep 3, 2026
7b96732
Finalize machine privacy and zero-work cycles
TheLarkInn Sep 3, 2026
9dab133
Preserve iteration callback compatibility
TheLarkInn Sep 3, 2026
26c2ac0
Protect secret logs and callback compatibility
TheLarkInn Sep 3, 2026
0e2c1f6
Merge aligned Reporter parent into R8A
TheLarkInn Sep 7, 2026
68622dd
Merge corrected R5B parent into R8
TheLarkInn Sep 9, 2026
f6e4546
Merge corrected Reporter presentation into R8
TheLarkInn Sep 9, 2026
8bc6c3e
Enforce truthful AI qualification and invocation output budgets
TheLarkInn Sep 9, 2026
feaa0bf
Retain secret-alias privacy in the corrected AI qualification branch
TheLarkInn Sep 9, 2026
f637c70
Coalesce superseded AI start status for native Windows qualification
TheLarkInn Sep 9, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"changes": [
{
"packageName": "@rushstack/rush-reporter",
"comment": "Add adversarial deterministic AI reporter qualification gates and privacy-safe actionable context.",
"type": "minor"
}
],
"packageName": "@rushstack/rush-reporter",
"email": "TheLarkInn@users.noreply.github.com"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"changes": [
{
"packageName": "@rushstack/rush-reporter",
"comment": "Coalesce buffered start acknowledgements superseded by final results without dropping final context or log references, keeping native Windows AI output within the unchanged raw-byte qualification budget.",
"type": "patch"
}
],
"packageName": "@rushstack/rush-reporter"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"changes": [
{
"packageName": "@rushstack/rush-reporter",
"comment": "Measure actual AI output bytes, enforce the invocation-wide NDJSON budget, and qualify retained fallback context and exact remediation without inflating baselines.",
"type": "patch"
}
],
"packageName": "@rushstack/rush-reporter"
}
129 changes: 129 additions & 0 deletions common/reviews/api/rush-reporter.api.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,12 @@
import type { Readable } from 'node:stream';
import type { Writable } from 'node:stream';

// @beta
export const AI_REPORTER_QUALIFICATION_SCHEMA_VERSION: '1.0';

// @beta
export const AI_REPORTER_QUALIFICATION_THRESHOLDS: IAiReporterQualificationThresholds;

// @beta
export class AiReporter implements IReporter {
constructor(options: IAiReporterOptions);
Expand Down Expand Up @@ -139,6 +145,9 @@ export function detectAgent(env: Record<string, string | undefined>, configuredV
// @beta
export function encodeNdjsonRecord(value: unknown, options?: INdjsonOptions): string;

// @beta
export function evaluateAiReporterQualification(cases: readonly IAiReporterQualificationCaseResult[], thresholds?: IAiReporterQualificationThresholds): IAiReporterQualificationResult;

// @beta
export function evaluatePluginApplyGate(manifests: readonly IRushPluginManifest[], options: IPluginApplyGateOptions): IPluginApplyDecision[];

Expand Down Expand Up @@ -170,6 +179,9 @@ export class FileReporter implements IReporter {
// @beta
export function filterEventsForLogLevel(logLevel: ReporterLogLevel, events: readonly IReporterEventEnvelope<unknown>[]): IReporterEventEnvelope<unknown>[];

// @beta
export function formatAiReporterQualificationFailures(result: IAiReporterQualificationResult): string;

// @beta
export function getBlockedPlugins(decisions: readonly IPluginApplyDecision[]): IPluginApplyDecision[];

Expand All @@ -182,6 +194,9 @@ export function getLogLevelRank(level: ReporterLogLevel): number;
// @beta
export function getPrivacyClassificationRank(classification: ReporterPrivacyClassification): number;

// @beta
export function getQualifiedAiReporterDecision(env: Record<string, string | undefined>, configuredAgentEnvironmentVariables: readonly string[], qualification: IAiReporterQualificationResult | undefined, privacyPrerequisiteAccepted?: boolean): IQualifiedAiReporterDecision;

// @beta
export function getReporterMigrationPhase(id: ReporterMigrationPhaseId): IReporterMigrationPhase;

Expand Down Expand Up @@ -219,11 +234,18 @@ export interface IAiDiagnostic {
// (undocumented)
readonly code: string;
// (undocumented)
readonly context?: Readonly<Record<string, ReporterJsonValue | '[local-sensitive]' | '[secret]'>>;
// (undocumented)
readonly detailKey?: string;
// (undocumented)
readonly diagnosticId?: string;
// (undocumented)
readonly remediation?: readonly IRushRemediationAction[];
// (undocumented)
readonly severity: string;
// (undocumented)
readonly summary?: string;
readonly summaryKey?: string;
}

// @beta
Expand Down Expand Up @@ -280,6 +302,98 @@ export interface IAiReporterOptions {
readonly write: (text: string) => void;
}

// @beta
export interface IAiReporterQualificationCaseResult {
// (undocumented)
readonly actionable: boolean;
// (undocumented)
readonly aiOutputBytes: number;
// (undocumented)
readonly deterministic: boolean;
// (undocumented)
readonly expectedResult: 'succeeded' | 'failed';
// (undocumented)
readonly failures: readonly string[];
// (undocumented)
readonly fullLogValid: boolean;
// (undocumented)
readonly legacyOutputBytes: number;
// (undocumented)
readonly name: string;
// (undocumented)
readonly normalizedAiOutputSha256: string;
// (undocumented)
readonly plaintextOutputBytes: number;
// (undocumented)
readonly privacySafe: boolean;
// (undocumented)
readonly scenario: string;
// (undocumented)
readonly stdoutContractValid: boolean;
// (undocumented)
readonly warningContractValid: boolean;
}

// @beta
export interface IAiReporterQualificationGateResult {
// (undocumented)
readonly actual: number;
// (undocumented)
readonly failedCases: readonly string[];
// (undocumented)
readonly id: string;
// (undocumented)
readonly passed: boolean;
// (undocumented)
readonly threshold: string;
}

// @beta
export interface IAiReporterQualificationResult {
// (undocumented)
readonly cases: readonly IAiReporterQualificationCaseResult[];
// (undocumented)
readonly gates: readonly IAiReporterQualificationGateResult[];
// (undocumented)
readonly passed: boolean;
// (undocumented)
readonly schemaVersion: typeof AI_REPORTER_QUALIFICATION_SCHEMA_VERSION;
// (undocumented)
readonly thresholds: IAiReporterQualificationThresholds;
}

// @beta
export interface IAiReporterQualificationThresholds {
// (undocumented)
readonly deterministicRunCount: number;
// (undocumented)
readonly maximumAggregateAiToLegacyPercent: number;
// (undocumented)
readonly maximumAggregateAiToPlaintextPercent: number;
// (undocumented)
readonly maximumCompactCaseAiOutputBytes: number;
// (undocumented)
readonly maximumOutputBytesPerCase: number;
// (undocumented)
readonly maximumPerCaseAiToBaselinePercent: number;
// (undocumented)
readonly minimumActionableFailurePercent: number;
// (undocumented)
readonly minimumComparableBaselineBytes: number;
// (undocumented)
readonly minimumControlCases: number;
// (undocumented)
readonly minimumFailureCases: number;
// (undocumented)
readonly minimumFullLogPassPercent: number;
// (undocumented)
readonly minimumPrivacyPassPercent: number;
// (undocumented)
readonly minimumStdoutContractPassPercent: number;
// (undocumented)
readonly minimumWarningContractPassPercent: number;
}

// @beta
export interface IAutomaticReporterPlan {
readonly emergencyDestination: 'stderr';
Expand Down Expand Up @@ -702,6 +816,18 @@ export interface IProblemMatcherResult {
readonly unmatchedLineCount: number;
}

// @beta
export interface IQualifiedAiReporterDecision {
// (undocumented)
readonly agentDetected: boolean;
// (undocumented)
readonly eligible: boolean;
// (undocumented)
readonly reason: 'RUSH_REPORTER=legacy' | 'agent not detected' | 'qualification unavailable' | 'qualification failed' | 'privacy prerequisite unavailable' | 'qualified';
// (undocumented)
readonly reporter?: 'ai';
}

// @beta
export interface IRenderLiveRegionOptions {
readonly color: IColorizer;
Expand Down Expand Up @@ -1468,6 +1594,9 @@ export function resolveReporterCompatibility(frontend: IReporterFrontendDescript
// @beta
export function resolveReporterSelection(input: IReporterSelectionInput): IReporterSelection;

// @beta
export function runAiReporterQualificationCorpusAsync(): Promise<IAiReporterQualificationResult>;

// @beta
export function runProblemMatchers(events: readonly IReporterEventEnvelope<unknown>[], matchers: readonly IProblemMatcher[], options?: IRunProblemMatchersOptions): IProblemMatcherResult;

Expand Down
49 changes: 49 additions & 0 deletions libraries/reporter/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,55 @@ Canonical event protocol, reporter manager, and built-in reporters for Rush.

This package is released as a public beta. Exported contracts may change before the stable release.

## AI reporter qualification

The network-free qualification corpus runs representative bootstrap/version, configuration, input,
dependency-tool, operation, cache, network/auth, plugin, cancellation, and internal failures plus
successful and warning-only controls through the AI, detailed plaintext, legacy, and full-log reporters.
Scenario-specific external output is included only where the real failure or control would produce it.

| Gate | Blocking threshold |
| --- | --- |
| Failure/control coverage | At least 10 failure cases and 2 successful controls |
| Actionability | 100% of failures retain stable code, category, context, and remediation |
| Output size | At most 64 KiB per case; compact cases at most 2 KiB; AI no larger than comparable per-case baselines; aggregate AI bytes at most 50% of legacy and plaintext |
| Determinism | Byte-identical normalized AI output across 3 runs |
| Privacy | 100% secret redaction and no private producer identity leakage |
| Full log | 100% absolute, existing, owner-only where supported, complete, and failure-correlated |
| Stdout/warnings | 100% payload-only NDJSON and warning suppression/detail compliance |

Run `rushx build && node scripts/runAiReporterQualification.js` from this project to print the
machine-readable result. Byte gates measure the actual emitted UTF-8 strings, including absolute paths and
NDJSON delimiters. Paths are normalized only for deterministic comparison/hashing and are not stored.
Separate near-limit and sustained-watch probes enforce the invocation budget without adding artificial
baseline volume to the comparison corpus. Passing
these gates only produces a reusable qualification decision; it does not enable environment-based automatic
reporter selection. That decision also requires the separate telemetry privacy prerequisite to be accepted.
The pre-major Rush frontend remains explicit/repository-opt-in, and `RUSH_REPORTER=legacy` remains
authoritative.
The Jest setup hook has a bounded 15-second allowance for the three file-backed corpus passes, matching
the integration test setup policy. This allowance does not change any quality gate or production deadline.

AI output reserves final-record space, including its supplied log reference, before emitting progress.
Progress is buffered within the invocation byte limit until the primary log reservation is known, or until
close if no log is supplied. Excess progress/details set `truncated`; the final result remains valid JSON.
An unrendered start acknowledgement is coalesced into a known final result. Ongoing commands still expose
buffered status at the next non-terminal event or explicit flush; watch history and every final field,
including the supplied log reference, are retained. No path shortening or measurement normalization is used.
The final scope carries the command name, and standard `diagnostic.<code>.summary` keys are implicit rather
than repeated alongside the same code. Custom summary keys are preserved.

AI fallback message text is emitted only for public envelopes. Its context retains the known command, and
the usage-review action invokes that command's help (or `rush --help` when the command is unavailable).
Qualification checks exact expected context, remediation commands/URLs, descriptions, and execution safety;
summary-only failures and unrelated actions do not qualify. Non-public fallback errors remain countable
and refer to the protected full-detail log. JSON oversized-record markers preserve the original privacy
classification and omit non-public source and scope metadata.

Secret envelopes retain only protocol, event identity, ordering, timing, type, privacy, and fully redacted
source and payload fields. Contextual parent, command, operation, project, phase, and scope metadata is
removed.

## Links

- [CHANGELOG.md](https://github.com/microsoft/rushstack/blob/main/libraries/reporter/CHANGELOG.md) - Find out
Expand Down
20 changes: 20 additions & 0 deletions libraries/reporter/scripts/runAiReporterQualification.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
// See LICENSE in the project root for license information.

const {
formatAiReporterQualificationFailures,
runAiReporterQualificationCorpusAsync
} = require('../lib-commonjs');

runAiReporterQualificationCorpusAsync()
.then((result) => {
process.stdout.write(`${JSON.stringify(result, undefined, 2)}\n`);
if (!result.passed) {
process.stderr.write(`${formatAiReporterQualificationFailures(result)}\n`);
process.exitCode = 1;
}
})
.catch((error) => {
process.stderr.write(`${error.stack || error.message}\n`);
process.exitCode = 1;
});
16 changes: 16 additions & 0 deletions libraries/reporter/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -337,6 +337,22 @@ export {
isWithinMemoryBudget
} from './perf/PerformanceBudgets';

export type {
IAiReporterQualificationThresholds,
IAiReporterQualificationCaseResult,
IAiReporterQualificationGateResult,
IAiReporterQualificationResult,
IQualifiedAiReporterDecision
} from './qualification/AiReporterQualification';
export {
AI_REPORTER_QUALIFICATION_SCHEMA_VERSION,
AI_REPORTER_QUALIFICATION_THRESHOLDS,
evaluateAiReporterQualification,
formatAiReporterQualificationFailures,
getQualifiedAiReporterDecision
} from './qualification/AiReporterQualification';
export { runAiReporterQualificationCorpusAsync } from './qualification/AiReporterQualificationCorpus';

export type { ReporterMigrationPhaseId, IReporterMigrationPhase } from './migration/MigrationPhase';
export { REPORTER_MIGRATION_PHASES, getReporterMigrationPhase } from './migration/MigrationPhase';
export type {
Expand Down
Loading