refactor(ai-judge): group src modules into domain directories

- move evidence.ts and conversation.ts into evidence/ as bash.ts and conversation.ts
- move prompt.ts and model.ts into judge/
- move highrisk.ts and judge.ts into authority/, renaming judge.ts to enforce.ts to avoid clashing with the judge/ directory
- move review.ts and audit.ts into telemetry/
- move config.ts and catalog.ts into config/ as judge.ts and catalog.ts
- rewrite static and dynamic imports across src, tools, and tests to the new paths
- fix the models-catalog.json relative URL broken by the move (caught by fallow unresolved-import)
- update the PIEXTENSIO-12 module map in the ADR to the new paths
- add editorconfig for 4-space ts indentation
This commit is contained in:
2026-08-22 01:34:29 +08:00
parent c479f51469
commit 99e953664d
26 changed files with 48 additions and 44 deletions
@@ -1,4 +1,4 @@
import type { TelemetryHealth } from "./review";
import type { TelemetryHealth } from "../telemetry/review";
/**
* Enforce truth table (PIEXTENSIO-3 cat.4 / M5; ADR 0008 / PIEXTENSIO-23).
@@ -267,5 +267,5 @@ export function classifyModel(
/** Package-root catalog path (data, not source; beside reports/). */
export const DEFAULT_CATALOG_PATH: string = fileURLToPath(
new URL("../models-catalog.json", import.meta.url),
new URL("../../models-catalog.json", import.meta.url),
);
@@ -1,6 +1,6 @@
import { readFileSync } from "node:fs";
import { join } from "node:path";
import { DEFAULT_TIMEOUT_MS, MAX_TIMEOUT_MS, MIN_TIMEOUT_MS } from "./model";
import { DEFAULT_TIMEOUT_MS, MAX_TIMEOUT_MS, MIN_TIMEOUT_MS } from "../judge/model";
/**
* Judge configuration (PIEXTENSIO-3 Config acceptance, PIEXTENSIO-11
+10 -10
View File
@@ -11,31 +11,31 @@ import {
type AuthorizerLog,
type AuthorizerVerdict,
} from "@gotgenes/pi-permission-system";
import { buildBashJudgmentEvidence, type BashJudgmentEvidence } from "./evidence";
import { buildBashJudgmentEvidence, type BashJudgmentEvidence } from "./evidence/bash";
import {
createModelAvailability,
requestStructuredVerdict,
type ModelAvailability,
type ModelAttempt,
} from "./model";
import { PROMPT_VERSION, TOOL_SCHEMA_VERSION } from "./prompt";
import { loadJudgeConfig, type EffectiveJudgeConfig } from "./config";
import { createReviewSink, type ReviewSink } from "./review";
import { createAuditLog, type AuditLog } from "./audit";
} from "./judge/model";
import { PROMPT_VERSION, TOOL_SCHEMA_VERSION } from "./judge/prompt";
import { loadJudgeConfig, type EffectiveJudgeConfig } from "./config/judge";
import { createReviewSink, type ReviewSink } from "./telemetry/review";
import { createAuditLog, type AuditLog } from "./telemetry/audit";
import {
buildConversationEvidence,
conversationProbeFromSession,
type ConversationEvidence,
} from "./conversation";
import { classifyHighRisk, type HighRiskMatch } from "./highrisk";
import { evaluateEnforceAuthority, type EnforceGateState } from "./judge";
} from "./evidence/conversation";
import { classifyHighRisk, type HighRiskMatch } from "./authority/highrisk";
import { evaluateEnforceAuthority, type EnforceGateState } from "./authority/enforce";
import {
classifyModel,
loadModelCatalog,
DEFAULT_CATALOG_PATH,
type ModelCatalogClassification,
type LoadedModelCatalog,
} from "./catalog";
} from "./config/catalog";
const LINK_NAME = "ai-bash-judge";
const REVIEW_SCHEMA_VERSION = 1;
@@ -5,8 +5,8 @@ import type {
} from "@earendil-works/pi-ai";
import type { ModelRegistry } from "@earendil-works/pi-coding-agent";
import { buildJudgeContext, MAX_REASON_CODE_POINTS, REPORT_VERDICT_TOOL_NAME } from "./prompt";
import type { BashJudgmentEvidence } from "./evidence";
import type { ConversationEvidence } from "./conversation";
import type { BashJudgmentEvidence } from "../evidence/bash";
import type { ConversationEvidence } from "../evidence/conversation";
// 15s is the PIEXTENSIO-11 calibrated default (canonical resolution c0b0028d):
// 15,000 ms total wall-clock deadline, accepted config range 5,000–30,000 ms,
@@ -1,6 +1,6 @@
import { Type, type AssistantMessage, type Context, type Tool, type UserMessage } from "@earendil-works/pi-ai";
import type { BashJudgmentEvidence } from "./evidence";
import type { ConversationEvidence } from "./conversation";
import type { BashJudgmentEvidence } from "../evidence/bash";
import type { ConversationEvidence } from "../evidence/conversation";
export const PROMPT_VERSION = "bash-shadow-v4";
export const TOOL_SCHEMA_VERSION = "report-verdict-v1";
@@ -2,7 +2,7 @@ import { mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs";
import { tmpdir } from "node:os";
import { join } from "node:path";
import { afterEach, describe, expect, it } from "vitest";
import { createAuditLog } from "../src/audit";
import { createAuditLog } from "../src/telemetry/audit";
const dirs: string[] = [];
@@ -3,7 +3,7 @@ import {
classifyModel,
loadModelCatalog,
type CatalogDeps,
} from "../src/catalog";
} from "../src/config/catalog";
/**
* PIEXTENSIO-24: the advisory model catalog shipped with the package.
@@ -1,5 +1,5 @@
import { describe, expect, it } from "vitest";
import { loadJudgeConfig, type ConfigLoadDeps } from "../src/config";
import { loadJudgeConfig, type ConfigLoadDeps } from "../src/config/judge";
function deps(files: Record<string, string> = {}): ConfigLoadDeps {
return {
@@ -2,7 +2,7 @@ import { describe, expect, it } from "vitest";
import {
buildConversationEvidence,
type ConversationProbe,
} from "../src/conversation";
} from "../src/evidence/conversation";
function entry(text: string): unknown {
return {
@@ -5,8 +5,8 @@ import {
DEFAULT_TIMEOUT_MS,
MIN_TIMEOUT_MS,
MAX_TIMEOUT_MS,
} from "../src/model";
import { createModelAvailability } from "../src/model";
} from "../src/judge/model";
import { createModelAvailability } from "../src/judge/model";
import {
applyTimeoutOption,
replayCorpus,
@@ -1,6 +1,6 @@
import { describe, expect, it } from "vitest";
import type { PromptPermissionDetails } from "@gotgenes/pi-permission-system";
import { buildBashJudgmentEvidence } from "../src/evidence";
import { buildBashJudgmentEvidence } from "../src/evidence/bash";
function details(
unit: string,
@@ -1,5 +1,5 @@
import { describe, expect, it } from "vitest";
import { classifyHighRisk } from "../src/highrisk";
import { classifyHighRisk } from "../src/authority/highrisk";
describe("classifyHighRisk — data_loss", () => {
it.each([
@@ -2,7 +2,7 @@ import { describe, expect, it } from "vitest";
import {
evaluateEnforceAuthority,
type EnforceGateState,
} from "../src/judge";
} from "../src/authority/enforce";
const ALL_OPEN: EnforceGateState = {
auditHealthy: true,
@@ -41,8 +41,8 @@ const { mockCatalog } = vi.hoisted(() => ({
diagnostics: [] as Array<Record<string, unknown>>,
},
}));
vi.mock("../src/catalog", async (importOriginal) => {
const actual = await importOriginal<typeof import("../src/catalog")>();
vi.mock("../src/config/catalog", async (importOriginal) => {
const actual = await importOriginal<typeof import("../src/config/catalog")>();
return {
...actual,
loadModelCatalog: () => ({
@@ -69,8 +69,8 @@ import {
unpublishPermissionsService,
} from "@gotgenes/pi-permission-system";
import extension from "../src/index";
import type { ModelCatalogEntry } from "../src/catalog";
import { PROMPT_VERSION, TOOL_SCHEMA_VERSION } from "../src/prompt";
import type { ModelCatalogEntry } from "../src/config/catalog";
import { PROMPT_VERSION, TOOL_SCHEMA_VERSION } from "../src/judge/prompt";
function createFakePi(): {
pi: ExtensionAPI;
@@ -5,7 +5,7 @@ import {
createModelAvailability,
requestStructuredVerdict,
type ModelAvailability,
} from "../src/model";
} from "../src/judge/model";
const metadata = {
provider: "test-provider",
@@ -4,7 +4,7 @@ import {
MAX_REASON_CODE_POINTS,
PROMPT_VERSION,
REPORT_VERDICT_TOOL_NAME,
} from "../src/prompt";
} from "../src/judge/prompt";
import type { Context } from "@earendil-works/pi-ai";
describe("buildJudgeContext", () => {
@@ -1,5 +1,5 @@
import { describe, expect, it } from "vitest";
import { createReviewSink, type ReviewSinkDeps } from "../src/review";
import { createReviewSink, type ReviewSinkDeps } from "../src/telemetry/review";
import type { AuthorizerLog } from "@gotgenes/pi-permission-system";
function fakeLog(): AuthorizerLog & {
@@ -29,9 +29,9 @@ import {
MIN_TIMEOUT_MS,
MAX_TIMEOUT_MS,
type ModelAvailability,
} from "../src/model";
import type { BashJudgmentEvidence } from "../src/evidence";
import type { ConversationEvidence } from "../src/conversation";
} from "../src/judge/model";
import type { BashJudgmentEvidence } from "../src/evidence/bash";
import type { ConversationEvidence } from "../src/evidence/conversation";
interface CorpusCase {
readonly id: string;
@@ -491,7 +491,7 @@ async function resolveReplayModel(
);
return 1;
}
const { createModelAvailability } = await import("../src/model");
const { createModelAvailability } = await import("../src/judge/model");
const availability: ModelAvailability = createModelAvailability(found, registry);
if (availability.kind !== "ready") {
process.stderr.write(
@@ -599,7 +599,7 @@ async function main(): Promise<number> {
asOf: new Date().toISOString(),
provider: parsed.provider,
model: parsed.model,
promptVersion: (await import("../src/prompt")).PROMPT_VERSION,
promptVersion: (await import("../src/judge/prompt")).PROMPT_VERSION,
corpusVersion: CORPUS_VERSION,
timeoutMs: parsed.timeoutMs,
strict: parsed.strict,