Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
35 changes: 35 additions & 0 deletions agents/prober/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# @corbits/code-agent-prober

## What this is

Ready `@corbits/code-agent-prober` agent + independently importable components:
`agent`, `defineAgent`, `director`, `tools`, `systemPrompt`, `config`.

## Consume (runLocal)

```ts
import { agent } from "@corbits/code-agent-prober";
const run = runLocal(defining(agent), env);
```

## Consume (deploy runWorkflow / hub / sidecar)

Hand the same `AgentDefinition` to a workflow — the package never exports a
workflow itself.

## Remix components

```ts
import { director, tools, systemPrompt, config } from "@corbits/code-agent-prober";
defineAgent({ director, ... }); // or swap tools / systemPrompt / config
```

Each of `director`, `tools`, `systemPrompt`, and `config` is a named,
independently importable part.

## Single authority

`prompt.ts` `systemPrompt.build()` is byte-stable (the raw card, no formatting).
`toolset.ts` `tools` literal equals the `REVIEW_TOOLS` surface constant in
`src/agent/directors/tool-sets.ts`; drift is enforced by the in-tree drift-guard
`src/agent/directors/prober/package.test.ts`.
13 changes: 13 additions & 0 deletions agents/prober/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
{
"name": "@corbits/code-agent-prober",
"version": "0.1.0",
"private": true,
"type": "module",
"license": "SEE LICENSE IN LICENSE.md",
"exports": {
".": {
"types": "./src/index.ts",
"default": "./src/index.ts"
}
}
}
17 changes: 17 additions & 0 deletions agents/prober/src/agent.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import {
defineAgent as coreDefineAgent,
type AgentDefinition,
} from "@intx/agent";
import { systemPrompt } from "./prompt.js";

export const agent: AgentDefinition = defineAgent();

export function defineAgent(): AgentDefinition {
return coreDefineAgent({
id: "prober",
systemPrompt: systemPrompt.build(),
tools: [],
capabilities: [],
inference: { sources: [] },
});
}
9 changes: 9 additions & 0 deletions agents/prober/src/config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
export const config = {
spawn: { maySpawn: false },
tier: "leaf",
modelRole: "test",
} as const satisfies {
spawn: { maySpawn: boolean };
tier: string;
modelRole: string;
};
22 changes: 22 additions & 0 deletions agents/prober/src/director.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { tools } from "./toolset.js";
import { systemPrompt } from "./prompt.js";
import { config } from "./config.js";

export const director = {
id: "prober",
primaryIntent:
"Measure latency and behavior distributions per family/model; never ship product code, never tune prompts or policy",
outOfLane: [
"shipping product code",
"tuning prompts or model-family policy",
"building a new eval harness",
"fleet orchestration",
"architecture essays without measurements",
],
description: "Measure-only latency/behavior prober per family/model",
systemPrompt: systemPrompt.build(),
tools: { allow: [...tools] },
spawn: config.spawn,
tier: config.tier,
modelRole: config.modelRole,
} as const;
5 changes: 5 additions & 0 deletions agents/prober/src/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
export { agent, defineAgent } from "./agent.js";
export { director } from "./director.js";
export { tools } from "./toolset.js";
export { systemPrompt } from "./prompt.js";
export { config } from "./config.js";
Original file line number Diff line number Diff line change
@@ -1,24 +1,6 @@
import type { DirectorPackage } from "../types.js";
import { REVIEW_TOOLS } from "../tool-sets.js";
// The app formats the identity header via formatDirectorSystemPrompt.

/**
* Prober worker (CL-7656).
* Measure-only latency/behavior prober — report distributions per
* family/model; never ship product code, never tune prompts or policy.
*/
export const proberPackage: DirectorPackage = {
id: "prober",
primaryIntent:
"Measure latency and behavior distributions per family/model; never ship product code, never tune prompts or policy",
outOfLane: [
"shipping product code",
"tuning prompts or model-family policy",
"building a new eval harness",
"fleet orchestration",
"architecture essays without measurements",
],
description: "Measure-only latency/behavior prober per family/model",
systemPrompt: `You are ProberDirector (Prober), a specialist in Corbits Code.
const CARD = `You are ProberDirector (Prober), a specialist in Corbits Code.

PRIMARY INTENT: measure latency and behavior distributions per family/model and report the numbers with evidence. Never ship product code. Never tune prompts or model-family policy. Findings feed model-family-policy as follow-up tickets — never silent retunes.

Expand Down Expand Up @@ -67,9 +49,9 @@ retunes, or orchestration.

OUT OF LANE: shipping product code, tuning prompts or model-family
policy (route to follow-up tickets), building a new harness, fleet
orchestration, architecture essays without measurements.`,
tools: { allow: REVIEW_TOOLS },
spawn: { maySpawn: false },
tier: "leaf",
modelRole: "test",
orchestration, architecture essays without measurements.`;

export const systemPrompt = {
theme: "prober",
build: (): string => CARD,
};
15 changes: 15 additions & 0 deletions agents/prober/src/toolset.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
export const tools: readonly string[] = [
"read_file",
"grep",
"search_files",
"list_dir",
"lsp",
"run_shell",
"web_fetch",
"web_search",
"skill_search",
"use_skill",
"write_file",
"edit_file",
"delete_file",
] as const;
7 changes: 7 additions & 0 deletions agents/prober/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"extends": "../../tsconfig.base.json",
"compilerOptions": {
"noEmit": true
},
"include": ["src/**/*.ts"]
}
4 changes: 4 additions & 0 deletions bun.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions scripts/dead-export-allowlist.txt
Original file line number Diff line number Diff line change
Expand Up @@ -65,3 +65,7 @@ agents/shakespeare/src/index.ts: agent
agents/shakespeare/src/index.ts: defineAgent
agents/shakespeare/src/config.ts: satisfies
agents/shakespeare/src/config.ts: boolean
agents/prober/src/index.ts: agent
agents/prober/src/index.ts: defineAgent
agents/prober/src/config.ts: satisfies
agents/prober/src/config.ts: boolean
2 changes: 1 addition & 1 deletion scripts/dead-export-guard.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"tsconfig": "tsconfig.json",
"tsPruneArgs": ["-p", "tsconfig.json"],
"minScannedFiles": 1130
"minScannedFiles": 1240
}
47 changes: 47 additions & 0 deletions src/agent/directors/prober/package.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import { describe, expect, test } from "bun:test";

import {
director,
tools,
config,
systemPrompt,
} from "@corbits/code-agent-prober";
import { REVIEW_TOOLS } from "../tool-sets.js";
import { DIRECTOR_REGISTRY } from "../registry.js";
import type { DirectorPackage } from "../types.js";

describe("proberPackage", () => {
test("workspace package satisfies the director contract and feeds the registry", () => {
const asDirector: DirectorPackage = director;
expect(asDirector.id).toBe("prober");
expect(DIRECTOR_REGISTRY.prober).toBe(director);
expect([...director.tools.allow]).toEqual([...REVIEW_TOOLS]);
expect(new Set(director.tools.allow).size).toBe(
director.tools.allow.length,
);
});

test("spawn/tier/modelRole match config", () => {
expect(director.spawn).toEqual(config.spawn);
expect(director.tier).toBe(config.tier);
expect(director.modelRole).toBe(config.modelRole);
expect(director.spawn.maySpawn).toBe(false);
});

test("prompt authority is byte-stable", () => {
expect(director.systemPrompt).toBe(systemPrompt.build());
expect(systemPrompt.build()).toBe(systemPrompt.build());
});

test("tools surface matches the tool-sets constant and is leaf-scoped", () => {
expect([...tools]).toEqual([...REVIEW_TOOLS]);
expect(tools).not.toContain("spawn_agent");
expect(tools).not.toContain("ask_operator");
expect(tools).not.toContain("wait_agents");
expect(tools).not.toContain("search_agents");
});

test("tools allowlist has no duplicates", () => {
expect(new Set([...tools]).size).toBe(tools.length);
});
});
4 changes: 2 additions & 2 deletions src/agent/directors/registry.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import { director as shakespeareDirector } from "@corbits/code-agent-shakespeare";
import { director as proberDirector } from "@corbits/code-agent-prober";
import type { AgentProfile, CapabilityFilter } from "../profile-types.js";
import { director as artistDirector } from "@corbits/code-agent-artist";
import { coderPackage } from "./coder/package.js";
import { designerPackage } from "./designer/package.js";
import { dispatchPackage } from "./dispatch/package.js";
import { explorerPackage } from "./explorer/package.js";
import { plannerPackage } from "./planner/package.js";
import { proberPackage } from "./prober/package.js";
import { qaLeadPackage } from "./qa-lead/package.js";
import { reviewerPackage } from "./reviewer/package.js";
import { wardenPackage } from "./warden/package.js";
Expand Down Expand Up @@ -46,7 +46,7 @@ export const DIRECTOR_REGISTRY: Readonly<Record<DirectorId, DirectorPackage>> =
artist: artistDirector,
warden: wardenPackage,
shakespeare: shakespeareDirector,
prober: proberPackage,
prober: proberDirector,
"qa-lead": qaLeadPackage,
};

Expand Down
1 change: 1 addition & 0 deletions tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
"paths": {
"@corbits/code-agent-artist": ["./agents/artist/src/index.ts"],
"@corbits/code-agent-shakespeare": ["./agents/shakespeare/src/index.ts"],
"@corbits/code-agent-prober": ["./agents/prober/src/index.ts"],
"@corbits/provider-opencode-go": ["./packages/opencode-go/src/index.ts"],
"@corbits/first-class-providers": [
"./packages/first-class-providers/src/index.ts"
Expand Down
Loading