Skip to content

Commit cb795e1

Browse files
Overhaul Gaasbot prompt (#648)
Rewrite Gaasbot as risk counsel with blinders-on lane discipline, ship-risk buckets, and no tool-schema restatement or fake caps. Keep package id/path gaasbot. Closes CL-7028
1 parent d7256c0 commit cb795e1

2 files changed

Lines changed: 71 additions & 14 deletions

File tree

src/agent/directors/gaasbot/package.test.ts

Lines changed: 55 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { describe, expect, test } from "bun:test";
22
import { gaasbotPackage } from "./package.js";
33

44
describe("gaasbotPackage", () => {
5-
test("id matches directory", () => {
5+
test("id matches directory (keep gaasbot path; identity is Gaasbot)", () => {
66
expect(gaasbotPackage.id).toBe("gaasbot");
77
});
88

@@ -15,6 +15,54 @@ describe("gaasbotPackage", () => {
1515
expect(gaasbotPackage.systemPrompt).toMatch(/PRIMARY INTENT/i);
1616
});
1717

18+
test("systemPrompt identity is Gaasbot / GaasbotDirector (risk counsel)", () => {
19+
const p = gaasbotPackage.systemPrompt;
20+
expect(p).toMatch(/GaasbotDirector \(Gaasbot\)/);
21+
expect(p).toMatch(/risk-counsel lane only|risk counsel/i);
22+
expect(p).not.toMatch(/CTO advice leaf/i);
23+
});
24+
25+
test("systemPrompt teaches sequencing / ship-risk buckets", () => {
26+
const p = gaasbotPackage.systemPrompt;
27+
expect(p).toMatch(/blocks a release|blocks a ship/i);
28+
expect(p).toMatch(/ship with (an )?explicit note|ships with a note/i);
29+
expect(p).toMatch(/filed for later/i);
30+
expect(p).toMatch(/most likely getting wrong/i);
31+
expect(p).toMatch(/do not ship/i);
32+
expect(p).toMatch(/not a hard gate/i);
33+
});
34+
35+
test("systemPrompt is blinders-on risk counsel (no implement / gate / plan / orchestrate)", () => {
36+
const p = gaasbotPackage.systemPrompt;
37+
expect(p).toMatch(/Blinders on/i);
38+
expect(p).toMatch(/Do not spawn specialists/i);
39+
expect(p).toMatch(/not Builder/i);
40+
expect(p).toMatch(/not Critic/i);
41+
expect(p).toMatch(/not Greybeard/i);
42+
expect(p).toMatch(/not Counsel/i);
43+
expect(p).toMatch(/not an orchestrator/i);
44+
});
45+
46+
test("systemPrompt has DONE GATE for risk ask completeness", () => {
47+
const p = gaasbotPackage.systemPrompt;
48+
expect(p).toContain("DONE GATE");
49+
expect(p).toMatch(/[Ss]top when/);
50+
expect(p).toContain("Blockers");
51+
});
52+
53+
test("systemPrompt has no tool-schema restatement or fake caps", () => {
54+
const p = gaasbotPackage.systemPrompt;
55+
expect(p).not.toMatch(/parameters?:/i);
56+
expect(p).not.toMatch(/fan-out/i);
57+
expect(p).not.toMatch(/at most \d+/i);
58+
expect(p).not.toMatch(/turn budget/i);
59+
expect(p).not.toMatch(/scheduler/i);
60+
expect(p).not.toMatch(/Prefer grep\/search_files/i);
61+
expect(p).not.toMatch(/Shell find\/rg/i);
62+
expect(p).not.toMatch(/Write tools are not mounted/i);
63+
expect(p).not.toMatch(/via run_shell/i);
64+
});
65+
1866
test("spawn.maySpawn is false", () => {
1967
expect(gaasbotPackage.spawn.maySpawn).toBe(false);
2068
});
@@ -35,9 +83,13 @@ describe("gaasbotPackage", () => {
3583
expect(gaasbotPackage.optionalSkills).toEqual(["philosophy"]);
3684
});
3785

38-
test("primaryIntent and outOfLane match CTO advice lane", () => {
39-
expect(gaasbotPackage.primaryIntent).toMatch(/CTO advice/i);
86+
test("primaryIntent and outOfLane match risk counsel lane", () => {
87+
expect(gaasbotPackage.primaryIntent).toMatch(/[Rr]isk counsel/i);
88+
expect(gaasbotPackage.description).toMatch(/[Rr]isk counsel/i);
4089
expect(gaasbotPackage.outOfLane).toContain("blocking merges");
4190
expect(gaasbotPackage.outOfLane).toContain("shipping product code as implementer");
91+
expect(gaasbotPackage.outOfLane).toContain("replacing greybeard architecture review");
92+
expect(gaasbotPackage.outOfLane).toContain("replacing plan eng change plans");
93+
expect(gaasbotPackage.outOfLane).toContain("applying product fixes");
4294
});
4395
});

src/agent/directors/gaasbot/package.ts

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,36 +2,41 @@ import type { DirectorPackage } from "../types.js";
22
import { REVIEW_TOOLS } from "../tool-sets.js";
33

44
/**
5-
* CTO advice leaf (CL-5826).
6-
* Strategic risk/sequencing counsel — not a hard gate, not implement, not greybeard/plan.
5+
* Risk counsel leaf (CL-7028). Package id/path remains `gaasbot`.
6+
* Strategic risk/sequencing advice — not a hard gate, not implement, not Greybeard/Counsel.
77
*/
88
export const gaasbotPackage: DirectorPackage = {
99
id: "gaasbot",
10-
primaryIntent: "CTO advicerisk and sequencing; not a hard gate",
10+
primaryIntent: "Risk counselsequencing and ship risk; not a hard gate",
1111
outOfLane: [
1212
"blocking merges",
1313
"shipping product code as implementer",
1414
"replacing greybeard architecture review",
1515
"replacing plan eng change plans",
1616
"applying product fixes",
1717
],
18-
description: "CTO advice leaf — strategic counsel, not a gate",
18+
description: "Risk counsel leaf — strategic ship/sequencing advice, not a gate",
1919
optionalSkills: ["philosophy"],
2020
tools: { allow: REVIEW_TOOLS },
2121
spawn: { maySpawn: false },
2222
tier: "leaf",
2323
modelRole: "plan",
24-
systemPrompt: `You are GaasbotDirector, a specialist in Corbits Code.
24+
systemPrompt: `You are GaasbotDirector (Gaasbot), a specialist in Corbits Code.
2525
26-
PRIMARY INTENT: strategic CTO advice — risk, sequencing, what blocks a release, what ships with a note, what is filed for later. You are counsel, not a hard gate.
26+
PRIMARY INTENT: risk counsel — sequencing, release risk, what blocks a ship, what ships with a note, what is filed for later. You are advice, not a hard gate.
2727
28-
You do not implement product code. You do not replace Greybeard (architecture review) or Plan (eng change plans). You do not block merges by force; you recommend clearly, including "do not ship" when warranted.
28+
You are the risk-counsel lane only — not Builder, not Critic, not Greybeard, not Counsel, not an orchestrator. Do not spawn specialists. Do not implement product code. Do not own architecture sign-off or eng change plans. Do not block merges by force; recommend clearly, including "do not ship" when warranted.
2929
30-
Given findings from others (or the brief): what actually blocks a release? What ships with a note? What is filed? Ask what the team is most likely getting wrong that nobody raised. Prefer hearing "do not ship" early over a late surprise.
30+
Blinders on — stay on the risk ask:
31+
1. From the brief and any findings: what actually blocks a release?
32+
2. What can ship with an explicit note?
33+
3. What is filed for later?
34+
4. Surface what the team is most likely getting wrong that nobody raised.
35+
5. Prefer an early "do not ship" over a late surprise.
3136
32-
Load philosophy when judgment trade-offs matter. Stay advice-only.
37+
DONE GATE: Stop when the brief's risk/sequencing ask is answered OR Blockers are explicit. Do not expand into implementation, architecture gate theater, eng-plan authorship, or fleet orchestration.
3338
34-
OUT OF LANE: implementing, architecture gate ownership, eng plan authorship as PlanDirector, merge-block theater without evidence.
39+
OUT OF LANE: shipping product code, architecture gate ownership (Greybeard), eng plan authorship (Counsel), merge-block theater without evidence, becoming Builder/Critic/orchestrator as primary.
3540
36-
Findings: risk and sequencing advice.`,
41+
Findings: risk and sequencing advice — blockers, ship-with-note, filed-for-later, and the unraised miss.`,
3742
};

0 commit comments

Comments
 (0)