Skip to content

Commit 64500c6

Browse files
refactor(gaasbot): restore OG voice and mandatory preload (#1122)
1 parent 55666ae commit 64500c6

2 files changed

Lines changed: 67 additions & 1 deletion

File tree

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

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,4 +105,61 @@ describe("gaasbotPackage", () => {
105105
);
106106
expect(gaasbotPackage.outOfLane).toContain("applying product fixes");
107107
});
108+
109+
test("CTO voice keeps verbatim colorful phrasing and no-pad directness", () => {
110+
const p = gaasbotPackage.systemPrompt;
111+
expect(p).toContain(
112+
'occasionally colorful phrasing ("just yeet this", "appease the lint gods")',
113+
);
114+
expect(p).toContain(
115+
"Don't pad feedback with excessive praise or hedge with softeners. When something is wrong, say so clearly and move on.",
116+
);
117+
expect(p).toMatch(/No emojis/);
118+
});
119+
120+
test("CTO voice names and thanks external contributors without redefining user", () => {
121+
const p = gaasbotPackage.systemPrompt;
122+
expect(p).toContain("Use their name (usually their GitHub handle).");
123+
expect(p).toContain(
124+
"Thank external contributors for their work before giving feedback.",
125+
);
126+
expect(p).toMatch(/external contributors only/);
127+
expect(p).toMatch(/parent\/operator/);
128+
});
129+
130+
test("systemPrompt has Session Initialization block before PRIMARY INTENT", () => {
131+
const p = gaasbotPackage.systemPrompt;
132+
expect(p).toContain("Session Initialization");
133+
expect(p).toContain("Load the style skill with use_skill");
134+
expect(p).toContain("Load the philosophy skill with use_skill");
135+
expect(p).toContain(
136+
"Do not do anything else before you have done all steps above. Skills are active constraints, not background documentation.",
137+
);
138+
expect(p).toContain("Before substantial advisory work");
139+
expect(p).toContain("native-integration");
140+
expect(p.indexOf("Session Initialization")).toBeLessThan(
141+
p.indexOf("PRIMARY INTENT"),
142+
);
143+
});
144+
145+
test("new restored lines grant no ship/implement/merge-block/spawn powers", () => {
146+
const p = gaasbotPackage.systemPrompt;
147+
const sessionBlock = p.slice(
148+
p.indexOf("Session Initialization"),
149+
p.indexOf("PRIMARY INTENT"),
150+
);
151+
expect(sessionBlock).not.toMatch(
152+
/you (may|can|will|should) (ship|implement|merge|spawn|block)/i,
153+
);
154+
const advisoryLine =
155+
p.slice(p.indexOf("Before substantial advisory work")).split("\n")[0] ??
156+
"";
157+
expect(advisoryLine).not.toMatch(
158+
/you (may|can|will|should) (ship|implement|merge|spawn|block)/i,
159+
);
160+
expect(advisoryLine).not.toMatch(/go ahead and (ship|implement|merge)/i);
161+
expect(advisoryLine).not.toMatch(
162+
/act as (a|the) (gate|implementer|orchestrator)/i,
163+
);
164+
});
108165
});

src/agent/directors/gaasbot/package.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,11 @@ export const gaasbotPackage: DirectorPackage = {
2525
modelRole: "plan",
2626
systemPrompt: `You are GaasbotDirector (Gaasbot), a specialist in Corbits Code.
2727
28+
Session Initialization — complete before anything else:
29+
1. Load the style skill with use_skill.
30+
2. Load the philosophy skill with use_skill.
31+
Do not do anything else before you have done all steps above. Skills are active constraints, not background documentation.
32+
2833
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.
2934
3035
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.
@@ -40,7 +45,9 @@ DONE GATE: Stop when the brief's risk/sequencing ask is answered OR Blockers are
4045
4146
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.
4247
43-
CTO VOICE (ported from the GaaS original): direct, conversational, professional without stuffy. Plain language, occasionally colorful. No padding, no hedged softeners — when something is wrong, say so and move on. "user" means the parent/operator. No emojis.
48+
CTO VOICE (ported from the GaaS original): direct, conversational, professional without stuffy. Plain language, occasionally colorful phrasing ("just yeet this", "appease the lint gods"). Don't pad feedback with excessive praise or hedge with softeners. When something is wrong, say so clearly and move on. "user" means the parent/operator. No emojis.
49+
50+
Use their name (usually their GitHub handle). Thank external contributors for their work before giving feedback. This name-and-thanks practice is for external contributors only — "user" still means the parent/operator.
4451
4552
Git discipline: squash PR commits before merging. Git hooks must be on — a commit that bypasses checks means the setup is broken. Run the repo check gate before opening a PR.
4653
@@ -52,5 +59,7 @@ Push back when: complexity is proposed for a hypothetical future; type assertion
5259
5360
How to respond: be direct and specific — what to change and why, with codebase references and a concrete alternative. Reason architecture from the principles above; weigh prioritization against business impact and simplicity. Say "I don't know" over feigning certainty. Call out symptom-chasing and redirect to the owning layer.
5461
62+
Before substantial advisory work: follow native-integration conventions — load with skill_search + use_skill only when the brief needs it.
63+
5564
Findings: risk and sequencing advice — blockers, ship-with-note, filed-for-later, and the unraised miss.`,
5665
};

0 commit comments

Comments
 (0)