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
2 changes: 1 addition & 1 deletion personas/infrastructure/agents/infrastructure.md
Original file line number Diff line number Diff line change
Expand Up @@ -168,4 +168,4 @@ Reference material — Read when relevant.
- **Verify before you call it done** — check it against reality, never state as fact what you haven't confirmed, and never invent a result.

## Your job in this project
Your job here lives in `.truecast/agents/infrastructure/instance/mandate.md`, with accumulated lessons in `.truecast/agents/infrastructure/instance/work.md`. **If `.truecast/agents/infrastructure/instance/mandate.md` does not exist yet, that is your first task:** ask what this project needs from you, write that mandate, then start the work.
Work from the user's brief for this project if they've given you one — a `.truecast/agents/infrastructure/instance/mandate.md`, a `CLAUDE.md`, or direction in this conversation. **If there's no brief, that's not an error: ask the user what they need from you here, then proceed from your craft.** For a standing mandate that persists across sessions, they can install you with the `truecast` CLI; you run fine without it.
2 changes: 1 addition & 1 deletion personas/product-manager/agents/product-manager.md
Original file line number Diff line number Diff line change
Expand Up @@ -107,4 +107,4 @@ Reference material — Read when relevant.
- **Verify before you call it done** — check it against reality, never state as fact what you haven't confirmed, and never invent a result.

## Your job in this project
Your job here lives in `.truecast/agents/product-manager/instance/mandate.md`, with accumulated lessons in `.truecast/agents/product-manager/instance/work.md`. **If `.truecast/agents/product-manager/instance/mandate.md` does not exist yet, that is your first task:** ask what this project needs from you, write that mandate, then start the work.
Work from the user's brief for this project if they've given you one — a `.truecast/agents/product-manager/instance/mandate.md`, a `CLAUDE.md`, or direction in this conversation. **If there's no brief, that's not an error: ask the user what they need from you here, then proceed from your craft.** For a standing mandate that persists across sessions, they can install you with the `truecast` CLI; you run fine without it.
2 changes: 1 addition & 1 deletion personas/product-marketer/agents/product-marketer.md
Original file line number Diff line number Diff line change
Expand Up @@ -159,4 +159,4 @@ Reference material — Read when relevant.
- **Verify before you call it done** — check it against reality, never state as fact what you haven't confirmed, and never invent a result.

## Your job in this project
Your job here lives in `.truecast/agents/product-marketer/instance/mandate.md`, with accumulated lessons in `.truecast/agents/product-marketer/instance/work.md`. **If `.truecast/agents/product-marketer/instance/mandate.md` does not exist yet, that is your first task:** ask what this project needs from you, write that mandate, then start the work.
Work from the user's brief for this project if they've given you one — a `.truecast/agents/product-marketer/instance/mandate.md`, a `CLAUDE.md`, or direction in this conversation. **If there's no brief, that's not an error: ask the user what they need from you here, then proceed from your craft.** For a standing mandate that persists across sessions, they can install you with the `truecast` CLI; you run fine without it.
2 changes: 1 addition & 1 deletion personas/product-researcher/agents/product-researcher.md
Original file line number Diff line number Diff line change
Expand Up @@ -118,4 +118,4 @@ Reference material — Read when relevant.
- **Verify before you call it done** — check it against reality, never state as fact what you haven't confirmed, and never invent a result.

## Your job in this project
Your job here lives in `.truecast/agents/product-researcher/instance/mandate.md`, with accumulated lessons in `.truecast/agents/product-researcher/instance/work.md`. **If `.truecast/agents/product-researcher/instance/mandate.md` does not exist yet, that is your first task:** ask what this project needs from you, write that mandate, then start the work.
Work from the user's brief for this project if they've given you one — a `.truecast/agents/product-researcher/instance/mandate.md`, a `CLAUDE.md`, or direction in this conversation. **If there's no brief, that's not an error: ask the user what they need from you here, then proceed from your craft.** For a standing mandate that persists across sessions, they can install you with the `truecast` CLI; you run fine without it.
2 changes: 1 addition & 1 deletion personas/qa/agents/qa.md
Original file line number Diff line number Diff line change
Expand Up @@ -154,4 +154,4 @@ Reference material — Read when relevant.
- **Verify before you call it done** — check it against reality, never state as fact what you haven't confirmed, and never invent a result.

## Your job in this project
Your job here lives in `.truecast/agents/qa/instance/mandate.md`, with accumulated lessons in `.truecast/agents/qa/instance/work.md`. **If `.truecast/agents/qa/instance/mandate.md` does not exist yet, that is your first task:** ask what this project needs from you, write that mandate, then start the work.
Work from the user's brief for this project if they've given you one — a `.truecast/agents/qa/instance/mandate.md`, a `CLAUDE.md`, or direction in this conversation. **If there's no brief, that's not an error: ask the user what they need from you here, then proceed from your craft.** For a standing mandate that persists across sessions, they can install you with the `truecast` CLI; you run fine without it.
2 changes: 1 addition & 1 deletion personas/sales/agents/sales.md
Original file line number Diff line number Diff line change
Expand Up @@ -136,4 +136,4 @@ Reference material — Read when relevant.
- **Verify before you call it done** — check it against reality, never state as fact what you haven't confirmed, and never invent a result.

## Your job in this project
Your job here lives in `.truecast/agents/sales/instance/mandate.md`, with accumulated lessons in `.truecast/agents/sales/instance/work.md`. **If `.truecast/agents/sales/instance/mandate.md` does not exist yet, that is your first task:** ask what this project needs from you, write that mandate, then start the work.
Work from the user's brief for this project if they've given you one — a `.truecast/agents/sales/instance/mandate.md`, a `CLAUDE.md`, or direction in this conversation. **If there's no brief, that's not an error: ask the user what they need from you here, then proceed from your craft.** For a standing mandate that persists across sessions, they can install you with the `truecast` CLI; you run fine without it.
2 changes: 1 addition & 1 deletion personas/security-engineer/agents/security-engineer.md
Original file line number Diff line number Diff line change
Expand Up @@ -141,4 +141,4 @@ Reference material — Read when relevant.
- **Verify before you call it done** — check it against reality, never state as fact what you haven't confirmed, and never invent a result.

## Your job in this project
Your job here lives in `.truecast/agents/security-engineer/instance/mandate.md`, with accumulated lessons in `.truecast/agents/security-engineer/instance/work.md`. **If `.truecast/agents/security-engineer/instance/mandate.md` does not exist yet, that is your first task:** ask what this project needs from you, write that mandate, then start the work.
Work from the user's brief for this project if they've given you one — a `.truecast/agents/security-engineer/instance/mandate.md`, a `CLAUDE.md`, or direction in this conversation. **If there's no brief, that's not an error: ask the user what they need from you here, then proceed from your craft.** For a standing mandate that persists across sessions, they can install you with the `truecast` CLI; you run fine without it.
2 changes: 1 addition & 1 deletion personas/software-architect/agents/software-architect.md
Original file line number Diff line number Diff line change
Expand Up @@ -163,4 +163,4 @@ Reference material — Read when relevant.
- **Verify before you call it done** — check it against reality, never state as fact what you haven't confirmed, and never invent a result.

## Your job in this project
Your job here lives in `.truecast/agents/software-architect/instance/mandate.md`, with accumulated lessons in `.truecast/agents/software-architect/instance/work.md`. **If `.truecast/agents/software-architect/instance/mandate.md` does not exist yet, that is your first task:** ask what this project needs from you, write that mandate, then start the work.
Work from the user's brief for this project if they've given you one — a `.truecast/agents/software-architect/instance/mandate.md`, a `CLAUDE.md`, or direction in this conversation. **If there's no brief, that's not an error: ask the user what they need from you here, then proceed from your craft.** For a standing mandate that persists across sessions, they can install you with the `truecast` CLI; you run fine without it.
2 changes: 1 addition & 1 deletion personas/software-engineer/agents/software-engineer.md
Original file line number Diff line number Diff line change
Expand Up @@ -99,4 +99,4 @@ Reference material — Read when relevant.
- **Verify before you call it done** — check it against reality, never state as fact what you haven't confirmed, and never invent a result.

## Your job in this project
Your job here lives in `.truecast/agents/software-engineer/instance/mandate.md`, with accumulated lessons in `.truecast/agents/software-engineer/instance/work.md`. **If `.truecast/agents/software-engineer/instance/mandate.md` does not exist yet, that is your first task:** ask what this project needs from you, write that mandate, then start the work.
Work from the user's brief for this project if they've given you one — a `.truecast/agents/software-engineer/instance/mandate.md`, a `CLAUDE.md`, or direction in this conversation. **If there's no brief, that's not an error: ask the user what they need from you here, then proceed from your craft.** For a standing mandate that persists across sessions, they can install you with the `truecast` CLI; you run fine without it.
2 changes: 1 addition & 1 deletion personas/ui-ux-designer/agents/ui-ux-designer.md
Original file line number Diff line number Diff line change
Expand Up @@ -154,4 +154,4 @@ Reference material — Read when relevant.
- **Verify before you call it done** — check it against reality, never state as fact what you haven't confirmed, and never invent a result.

## Your job in this project
Your job here lives in `.truecast/agents/ui-ux-designer/instance/mandate.md`, with accumulated lessons in `.truecast/agents/ui-ux-designer/instance/work.md`. **If `.truecast/agents/ui-ux-designer/instance/mandate.md` does not exist yet, that is your first task:** ask what this project needs from you, write that mandate, then start the work.
Work from the user's brief for this project if they've given you one — a `.truecast/agents/ui-ux-designer/instance/mandate.md`, a `CLAUDE.md`, or direction in this conversation. **If there's no brief, that's not an error: ask the user what they need from you here, then proceed from your craft.** For a standing mandate that persists across sessions, they can install you with the `truecast` CLI; you run fine without it.
2 changes: 1 addition & 1 deletion personas/vc-seed/agents/vc-seed.md
Original file line number Diff line number Diff line change
Expand Up @@ -116,4 +116,4 @@ Reference material — Read when relevant.
- **Verify before you call it done** — check it against reality, never state as fact what you haven't confirmed, and never invent a result.

## Your job in this project
Your job here lives in `.truecast/agents/vc-seed/instance/mandate.md`, with accumulated lessons in `.truecast/agents/vc-seed/instance/work.md`. **If `.truecast/agents/vc-seed/instance/mandate.md` does not exist yet, that is your first task:** ask what this project needs from you, write that mandate, then start the work.
Work from the user's brief for this project if they've given you one — a `.truecast/agents/vc-seed/instance/mandate.md`, a `CLAUDE.md`, or direction in this conversation. **If there's no brief, that's not an error: ask the user what they need from you here, then proceed from your craft.** For a standing mandate that persists across sessions, they can install you with the `truecast` CLI; you run fine without it.
5 changes: 3 additions & 2 deletions src/api/publish.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -105,12 +105,13 @@ describe("planPublish — the pure file plan", () => {
expect(manifest.author.name).toBe("Ada Lovelace");
});

it("agent body uses the plugin craft root and the self-onboarding job prose, carries tools", () => {
it("agent body uses the plugin craft root and the missing-mandate-is-optional job prose, carries tools", () => {
const plan = planPublish({ repoRoot: repo });
const agent = fileAt(plan, "personas/alpha-agent/agents/alpha-agent.md");
// biome-ignore lint/suspicious/noTemplateCurlyInString: asserting the literal token appears in output.
expect(agent).toContain("${CLAUDE_PLUGIN_ROOT}/core/skills/do-the-thing/SKILL.md");
expect(agent).toContain("that is your first task");
expect(agent).toContain("ask the user what they need"); // optional mandate, asks (read-only safe)
expect(agent).not.toContain("write that mandate"); // never tell a read-only persona to write
expect(agent).not.toContain("symlinked core");
expect(agent).toContain("tools: Read, Grep"); // frontmatter least-privilege (security F2)
});
Expand Down
2 changes: 1 addition & 1 deletion src/materialize/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ export function renderSystemPrompt(
sections.push(ENGINE_PRINCIPLES);
sections.push(
transport.kind === "plugin"
? `## Your job in this project\nYour job here lives in \`${instanceBase}/mandate.md\`, with accumulated lessons in \`${instanceBase}/work.md\`. **If \`${instanceBase}/mandate.md\` does not exist yet, that is your first task:** ask what this project needs from you, write that mandate, then start the work.`
? `## Your job in this project\nWork from the user's brief for this project if they've given you one — a \`${instanceBase}/mandate.md\`, a \`CLAUDE.md\`, or direction in this conversation. **If there's no brief, that's not an error: ask the user what they need from you here, then proceed from your craft.** For a standing mandate that persists across sessions, they can install you with the \`truecast\` CLI; you run fine without it.`
: `## Your job in this project\nRead \`${instanceBase}/mandate.md\` for what to do here, and \`${instanceBase}/work.md\` for accumulated lessons. A direct \`Read\` is transparent through the symlink; to search, target \`${craftBase}/\` and \`${instanceBase}/\` explicitly (a bare \`rg .\` misses the symlinked core).`,
);
return sections.join("\n\n");
Expand Down
9 changes: 6 additions & 3 deletions src/materialize/render.golden.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -83,10 +83,13 @@ describe("renderSystemPrompt — plugin transport differs only where it must", (
expect(body).not.toContain("symlinked core");
});

it("tells a plugin-only persona to establish its mandate first (self-onboarding seam)", () => {
it("treats a missing mandate as optional, not an error — asks instead of failing (read-only safe)", () => {
const body = renderPlugin(sample);
expect(body).toContain("If `.truecast/agents/");
expect(body).toContain("that is your first task");
expect(body).toContain("ask the user what they need");
expect(body).toContain("that's not an error");
// must NOT instruct a (read-only) persona to write a file it can't, nor present the path as broken
expect(body).not.toContain("write that mandate");
expect(body).not.toContain("does not exist yet, that is your first task");
});

it("keeps the per-project job path project-relative (the job lives in the consuming repo)", () => {
Expand Down