Skip to content

Commit 4b0ba97

Browse files
committed
Overhaul Neckbeard prompt
Rewrite Neckbeard identity: hygiene / pedantry with receipts and no fixes, blinders-on to the brief, no tool-schema restatement or fake caps. Keep package id/path as neckbeard. Closes CL-7034
1 parent 02a3f85 commit 4b0ba97

2 files changed

Lines changed: 79 additions & 15 deletions

File tree

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

Lines changed: 53 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,51 @@ describe("neckbeardPackage", () => {
1515
expect(neckbeardPackage.systemPrompt).toMatch(/PRIMARY INTENT/i);
1616
});
1717

18-
test("systemPrompt names NeckbeardDirector and never-fix stance", () => {
19-
expect(neckbeardPackage.systemPrompt).toMatch(/NeckbeardDirector/);
20-
expect(neckbeardPackage.systemPrompt).toMatch(/never fix/i);
21-
expect(neckbeardPackage.systemPrompt).toContain("build (to fix)");
18+
test("systemPrompt identity is Neckbeard / NeckbeardDirector (package id stays neckbeard)", () => {
19+
const p = neckbeardPackage.systemPrompt;
20+
expect(p).toMatch(/NeckbeardDirector \(Neckbeard\)/);
21+
expect(p).toMatch(/hygiene lane only/i);
22+
});
23+
24+
test("systemPrompt is hygiene / pedantry with receipts, never-fix", () => {
25+
const p = neckbeardPackage.systemPrompt;
26+
expect(p).toMatch(/hygiene \/ pedantry with receipts/i);
27+
expect(p).toMatch(/never fix/i);
28+
expect(p).toMatch(/Receipts \(every finding\)/i);
29+
expect(p).toContain("route to build");
30+
expect(p).toContain("route to critique");
31+
expect(p).toContain("route to greybeard");
32+
});
33+
34+
test("systemPrompt has blinders-on / brief-scoped hygiene", () => {
35+
const p = neckbeardPackage.systemPrompt;
36+
expect(p).toMatch(/BLINDERS ON/i);
37+
expect(p).toMatch(/success_criteria/i);
38+
expect(p).toMatch(/Do not wander/i);
39+
expect(p).toMatch(/invent nits from vibes/i);
40+
});
41+
42+
test("systemPrompt separates taste from defects and ranks hygiene", () => {
43+
const p = neckbeardPackage.systemPrompt;
44+
expect(p).toMatch(/defect vs taste/i);
45+
expect(p).toMatch(/must-clean/i);
46+
expect(p).toMatch(/should-clean/i);
47+
expect(p).toMatch(/genuinely fine/i);
48+
expect(p).toMatch(/signal over volume/i);
49+
});
50+
51+
test("systemPrompt has no tool-schema restatement or fake caps", () => {
52+
const p = neckbeardPackage.systemPrompt;
53+
expect(p).not.toMatch(/parameters?:/i);
54+
expect(p).not.toMatch(/fan-out/i);
55+
expect(p).not.toMatch(/at most \d+/i);
56+
expect(p).not.toMatch(/turn budget/i);
57+
expect(p).not.toMatch(/scheduler/i);
58+
expect(p).not.toMatch(/Prefer grep\/search_files/i);
59+
expect(p).not.toMatch(/Shell find\/rg/i);
60+
expect(p).not.toMatch(/Write tools are not mounted/i);
61+
expect(p).not.toMatch(/via run_shell/i);
62+
expect(p).not.toMatch(/Findings: ranked nits/i);
2263
});
2364

2465
test("spawn.maySpawn is false", () => {
@@ -28,6 +69,7 @@ describe("neckbeardPackage", () => {
2869
test("denies product write tools", () => {
2970
const allow = neckbeardPackage.tools?.allow ?? [];
3071
expect(allow).toContain("read_file");
72+
expect(allow).not.toContain("use_skill");
3173
expect(allow).not.toContain("write_file");
3274
expect(allow).not.toContain("edit_file");
3375
expect(allow).not.toContain("delete_file");
@@ -42,9 +84,15 @@ describe("neckbeardPackage", () => {
4284
});
4385

4486
test("primaryIntent and outOfLane match neckbeard lane", () => {
45-
expect(neckbeardPackage.primaryIntent).toBe("Adversarial pedantic review; never fix");
87+
expect(neckbeardPackage.primaryIntent).toBe(
88+
"Hygiene / pedantry with receipts; never fix",
89+
);
4690
expect(neckbeardPackage.outOfLane).toContain("applying fixes");
4791
expect(neckbeardPackage.outOfLane).toContain("product implementation");
4892
expect(neckbeardPackage.outOfLane).toContain("architecture ownership");
93+
expect(neckbeardPackage.outOfLane).toContain("rewriting product code");
94+
expect(neckbeardPackage.outOfLane).toContain(
95+
"correctness-severity ownership (critique)",
96+
);
4997
});
5098
});

src/agent/directors/neckbeard/package.ts

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

44
/**
5-
* Adversarial pedantic review leaf (CL-5820).
6-
* Hygiene, nits, refactor proposals — never product fixes; not architecture gate.
5+
* Neckbeard leaf (CL-5820 / CL-7034).
6+
* Hygiene / pedantry with receipts — never product fixes; not architecture or defect-severity gate.
7+
* Package id/path stays `neckbeard` (global rename is out of scope).
78
*/
89
export const neckbeardPackage: DirectorPackage = {
910
id: "neckbeard",
10-
primaryIntent: "Adversarial pedantic review; never fix",
11+
primaryIntent: "Hygiene / pedantry with receipts; never fix",
1112
outOfLane: [
1213
"applying fixes",
1314
"product implementation",
1415
"architecture ownership",
1516
"rewriting product code",
17+
"correctness-severity ownership (critique)",
1618
],
17-
description: "Adversarial review leaf",
19+
description: "Hygiene / pedantry review leaf",
1820
optionalSkills: ["style", "philosophy"],
1921
tools: { allow: REVIEW_TOOLS },
2022
spawn: { maySpawn: false },
2123
tier: "leaf",
2224
modelRole: "review",
23-
systemPrompt: `You are NeckbeardDirector, a specialist in Corbits Code.
25+
systemPrompt: `You are NeckbeardDirector (Neckbeard), a specialist in Corbits Code.
2426
25-
PRIMARY INTENT: adversarial pedantic review. Surface hygiene issues, nits, and refactor proposals with evidence. Never fix product code. You are not the architecture owner (that is Greybeard). You are not the defect-severity owner (that is Critique).
27+
PRIMARY INTENT: hygiene / pedantry with receipts. Surface naming drift, comment rot, type escape hatches, boundary validation gaps, off-by-ones, unicode/width/escape fiddliness, dead paths, and taste-vs-defect separation — each with evidence. Never fix product code. You are not the architecture owner (that is Greybeard). You are not the defect-severity owner (that is Critique).
2628
27-
Be pedantic on purpose: naming drift, comment rot, type escape hatches, boundary validation, off-by-ones, unicode/width/escape fiddliness, dead paths, and taste-vs-defect separation. Cite file paths and concrete snippets. Separate genuine defects from taste; label each finding.
29+
You are the hygiene lane only — not an implementer, not Critique, not Greybeard. Do not ship fixes. Do not become build or critique as your primary job.
2830
29-
Do not apply fixes. Optional skills style/philosophy may sharpen the nit lens — do not load them to rewrite the product.
31+
BLINDERS ON: Stay on the brief's success_criteria and the hygiene scope under review. Do not wander into unrelated files, invent nits from vibes, run architecture campaigns, or expand into correctness severity ownership outside the ask.
3032
31-
OUT OF LANE → report Blockers naming the right director: build (to fix), critique (correctness defects), greybeard (architecture), plan (change plans).
33+
Receipts (every finding):
34+
- Cite path + line/symbol + the concrete smell (name, comment, escape hatch, dead path, boundary gap).
35+
- Separate genuine defects from taste; label each finding (defect vs taste/nit).
36+
- Rank: must-clean (blocks readability/maintainability), should-clean, optional taste.
37+
- "This is genuinely fine" is a valid finding when true — do not pad the list.
38+
- Call out gaps: what you did not cover so the parent does not assume closed.
3239
33-
Findings: ranked nits with evidence.`,
40+
Pedantic on purpose, evidence-bound:
41+
- Naming drift, comment rot, \`any\` / type escapes, missing arktype at boundaries, off-by-ones, unicode/width/escape fiddliness, dead paths, inconsistent error surfaces.
42+
- Prefer signal over volume. Three receipted nits beat fifteen speculative ones.
43+
- Optional skills style/philosophy sharpen the nit lens — do not load them to rewrite the product.
44+
45+
OUT OF LANE → refuse or reclassify under Blockers:
46+
- applying fixes / rewriting product code (route to build)
47+
- correctness defects with severity ownership (route to critique)
48+
- architecture ownership (route to greybeard)
49+
- change plans (route to plan)`,
3450
};

0 commit comments

Comments
 (0)