diff --git a/plugins/compound-engineering/agents/ce-python-package-readme-writer.agent.md b/plugins/compound-engineering/agents/ce-python-package-readme-writer.agent.md
index ea8a453..a4e52ad 100644
--- a/plugins/compound-engineering/agents/ce-python-package-readme-writer.agent.md
+++ b/plugins/compound-engineering/agents/ce-python-package-readme-writer.agent.md
@@ -1,6 +1,6 @@
---
name: ce-python-package-readme-writer
-description: "Use this agent when you need to create or update README files following concise documentation style for Python packages. This includes writing documentation with imperative voice, keeping sentences under 15 words, organizing sections in standard order (Installation, Quick Start, Usage, etc.), and ensuring proper formatting with single-purpose code fences and minimal prose.\n\n\nContext: User is creating documentation for a new Python package.\nuser: \"I need to write a README for my new async HTTP client called 'quickhttp'\"\nassistant: \"I'll use the python-package-readme-writer agent to create a properly formatted README following Python package conventions\"\n\nSince the user needs a README for a Python package and wants to follow best practices, use the python-package-readme-writer agent to ensure it follows the template structure.\n\n\n\n\nContext: User has an existing README that needs to be reformatted.\nuser: \"Can you update my package's README to be more scannable?\"\nassistant: \"Let me use the python-package-readme-writer agent to reformat your README for better readability\"\n\nThe user wants cleaner documentation, so use the specialized agent for this formatting standard.\n\n"
+description: "Use this agent when you need to create or update README files following concise documentation style for Python packages. Writes documentation with imperative voice, keeps sentences under 15 words, organizes sections in standard order (Installation, Quick Start, Usage, etc.), and uses single-purpose code fences with minimal prose. Use when creating a README for a new Python package, reformatting an existing README for scannability, or enforcing a concise documentation standard across a repo."
model: inherit
---
diff --git a/plugins/compound-engineering/agents/ce-tiangolo-fastapi-reviewer.agent.md b/plugins/compound-engineering/agents/ce-tiangolo-fastapi-reviewer.agent.md
index 9965e8e..c6635fe 100644
--- a/plugins/compound-engineering/agents/ce-tiangolo-fastapi-reviewer.agent.md
+++ b/plugins/compound-engineering/agents/ce-tiangolo-fastapi-reviewer.agent.md
@@ -1,6 +1,6 @@
---
name: ce-tiangolo-fastapi-reviewer
-description: "Use this agent when you need a brutally honest FastAPI code review from the perspective of Sebastián Ramírez (tiangolo). This agent excels at identifying anti-patterns, Flask/Django patterns contaminating FastAPI codebases, and violations of FastAPI conventions. Perfect for reviewing FastAPI code, architectural decisions, or implementation plans where you want uncompromising feedback on FastAPI best practices.\n\n\nContext: The user wants to review a recently implemented FastAPI endpoint for adherence to FastAPI conventions.\nuser: \"I just implemented user authentication using Flask-Login patterns and storing user state in a global request context\"\nassistant: \"I'll use the tiangolo FastAPI reviewer agent to evaluate this implementation\"\n\nSince the user has implemented authentication with Flask patterns (global request context, Flask-Login), the tiangolo-fastapi-reviewer agent should analyze this critically.\n\n\n\n\nContext: The user is planning a new FastAPI feature and wants feedback on the approach.\nuser: \"I'm thinking of using dict parsing and manual type checking instead of Pydantic models for request validation\"\nassistant: \"Let me invoke the tiangolo FastAPI reviewer to analyze this approach\"\n\nManual dict parsing instead of Pydantic is exactly the kind of thing the tiangolo-fastapi-reviewer agent should scrutinize.\n\n\n\n\nContext: The user has written a FastAPI service and wants it reviewed.\nuser: \"I've created a sync database call inside an async endpoint and I'm using global variables for configuration\"\nassistant: \"I'll use the tiangolo FastAPI reviewer agent to review this implementation\"\n\nSync calls in async endpoints and global state are anti-patterns in FastAPI, making this perfect for tiangolo-fastapi-reviewer analysis.\n\n"
+description: "Brutally honest FastAPI code review from the perspective of Sebastián Ramírez (tiangolo). Identifies anti-patterns, Flask/Django patterns contaminating FastAPI codebases, and violations of FastAPI conventions. Use for FastAPI code, architectural decisions, or implementation plans where you want uncompromising feedback on FastAPI best practices — especially when the diff touches Pydantic models, async/await, dependency injection, or OpenAPI contracts."
model: inherit
---
diff --git a/src/data/plugin-legacy-artifacts.ts b/src/data/plugin-legacy-artifacts.ts
index 51977d9..3cdfc3f 100644
--- a/src/data/plugin-legacy-artifacts.ts
+++ b/src/data/plugin-legacy-artifacts.ts
@@ -28,6 +28,7 @@ const EXTRA_LEGACY_ARTIFACTS_BY_PLUGIN: Record =
"ce-andrew-kane-gem-writer",
"ce-changelog",
"ce-deploy-docs",
+ "ce-dhh-rails-style",
"ce-dspy-ruby",
"ce-every-style-editor",
"ce-onboarding",
@@ -129,8 +130,16 @@ const EXTRA_LEGACY_ARTIFACTS_BY_PLUGIN: Record =
"architecture-strategist",
"best-practices-researcher",
"bug-reproduction-validator",
+ "ce-ankane-readme-writer",
"ce-bug-reproduction-validator",
- "ce-lint",
+ "ce-data-migration-expert",
+ "ce-design-implementation-reviewer",
+ "ce-design-iterator",
+ "ce-dhh-rails-reviewer",
+ "ce-figma-design-sync",
+ "ce-kieran-rails-reviewer",
+ "ce-performance-oracle",
+ "ce-security-sentinel",
"cli-agent-readiness-reviewer",
"cli-readiness-reviewer",
"code-simplicity-reviewer",
diff --git a/src/utils/legacy-cleanup.ts b/src/utils/legacy-cleanup.ts
index 9309aa0..0eadd3b 100644
--- a/src/utils/legacy-cleanup.ts
+++ b/src/utils/legacy-cleanup.ts
@@ -90,6 +90,7 @@ export const STALE_SKILL_DIRS = [
"ce-andrew-kane-gem-writer",
"ce-changelog",
"ce-deploy-docs",
+ "ce-dhh-rails-style",
"ce-dspy-ruby",
"ce-every-style-editor",
"ce-onboarding",
@@ -97,6 +98,18 @@ export const STALE_SKILL_DIRS = [
/** Old agent names (used as generated skill dirs or flat .md files). */
const STALE_AGENT_NAMES = [
+ // Fork-specific: ce-* agents that were removed from this fork during the
+ // v3.0.3 upstream merge. These existed upstream but the fork dropped them.
+ "ce-ankane-readme-writer",
+ "ce-data-migration-expert",
+ "ce-design-implementation-reviewer",
+ "ce-design-iterator",
+ "ce-dhh-rails-reviewer",
+ "ce-figma-design-sync",
+ "ce-kieran-rails-reviewer",
+ "ce-performance-oracle",
+ "ce-security-sentinel",
+
// Legacy agent names that were renamed from to ce-
"adversarial-document-reviewer",
"adversarial-reviewer",
diff --git a/tests/legacy-cleanup.test.ts b/tests/legacy-cleanup.test.ts
index c9bf71e..d4b6c14 100644
--- a/tests/legacy-cleanup.test.ts
+++ b/tests/legacy-cleanup.test.ts
@@ -319,25 +319,30 @@ describe("cleanupStaleAgents", () => {
test("removes .agent.md files (Copilot format)", async () => {
const root = await fs.mkdtemp(path.join(os.tmpdir(), "cleanup-agents-copilot-"))
+ // Fork-specific: security-sentinel and performance-oracle were deleted in the
+ // v3.0.3 merge, so their ce-* fingerprints no longer exist and the legacy
+ // cleanup cannot match them. Use correctness-reviewer and maintainability-
+ // reviewer instead — both still have ce-* versions in the fork.
await createFile(
- path.join(root, "security-sentinel.agent.md"),
+ path.join(root, "correctness-reviewer.agent.md"),
agentContent(
- "security-sentinel",
- await pluginDescription("plugins/compound-engineering/agents/ce-security-sentinel.agent.md"),
+ "correctness-reviewer",
+ await pluginDescription("plugins/compound-engineering/agents/ce-correctness-reviewer.agent.md"),
),
)
await createFile(
- path.join(root, "performance-oracle.agent.md"),
+ path.join(root, "maintainability-reviewer.agent.md"),
agentContent(
- "performance-oracle",
- await pluginDescription("plugins/compound-engineering/agents/ce-performance-oracle.agent.md"),
+ "maintainability-reviewer",
+ await pluginDescription("plugins/compound-engineering/agents/ce-maintainability-reviewer.agent.md"),
),
)
const removed = await cleanupStaleAgents(root, ".agent.md")
expect(removed).toBe(2)
- expect(await exists(path.join(root, "security-sentinel.agent.md"))).toBe(false)
+ expect(await exists(path.join(root, "correctness-reviewer.agent.md"))).toBe(false)
+ expect(await exists(path.join(root, "maintainability-reviewer.agent.md"))).toBe(false)
})
test("removes matching Kiro agent configs but preserves same-named user configs", async () => {
@@ -422,17 +427,11 @@ describe("cleanupStaleAgents", () => {
test("removes legacy-only agents that no longer ship a ce-* replacement", async () => {
const root = await fs.mkdtemp(path.join(os.tmpdir(), "cleanup-agents-legacy-only-"))
- // `lint` and `bug-reproduction-validator` were removed in an older plugin
- // release with no ce-* successor. Their fingerprints live in
- // LEGACY_ONLY_AGENT_DESCRIPTIONS so upgrades from pre-removal installs
- // still clean them up.
- await createFile(
- path.join(root, "lint.md"),
- agentContent(
- "lint",
- "Use this agent when you need to run linting and code quality checks on Ruby and ERB files. Run before pushing to origin.",
- ),
- )
+ // Fork-specific: this fork re-introduced `ce-lint` (a Python linter agent), so
+ // `lint` no longer qualifies as legacy-only here — the cleanup logic now takes
+ // its fingerprint from the current `ce-lint.agent.md`. Only
+ // `bug-reproduction-validator` remains as a genuinely legacy-only agent with
+ // a LEGACY_ONLY_AGENT_DESCRIPTIONS fingerprint.
await createFile(
path.join(root, "bug-reproduction-validator.md"),
agentContent(
@@ -443,8 +442,7 @@ describe("cleanupStaleAgents", () => {
const removed = await cleanupStaleAgents(root, ".md")
- expect(removed).toBe(2)
- expect(await exists(path.join(root, "lint.md"))).toBe(false)
+ expect(removed).toBe(1)
expect(await exists(path.join(root, "bug-reproduction-validator.md"))).toBe(false)
})
})
diff --git a/tests/review-skill-contract.test.ts b/tests/review-skill-contract.test.ts
index 82e181f..2c27f07 100644
--- a/tests/review-skill-contract.test.ts
+++ b/tests/review-skill-contract.test.ts
@@ -384,8 +384,6 @@ describe("ce-code-review contract", () => {
"ce-adversarial-reviewer",
"ce-cli-readiness-reviewer",
"ce-previous-comments-reviewer",
- "ce-dhh-rails-reviewer",
- "ce-kieran-rails-reviewer",
"ce-kieran-python-reviewer",
"ce-kieran-typescript-reviewer",
"ce-julik-frontend-races-reviewer",
@@ -414,8 +412,6 @@ describe("ce-code-review contract", () => {
)
for (const agent of [
- "ce-dhh-rails-reviewer",
- "ce-kieran-rails-reviewer",
"ce-kieran-python-reviewer",
"ce-kieran-typescript-reviewer",
"ce-julik-frontend-races-reviewer",
@@ -423,21 +419,10 @@ describe("ce-code-review contract", () => {
expect(content).toContain(agent)
expect(catalog).toContain(agent)
}
-
- expect(content).toContain("## Language-Aware Conditionals")
- expect(content).not.toContain("## Language-Agnostic")
})
test("stack-specific reviewer agents follow the structured findings contract", async () => {
const reviewers = [
- {
- path: "plugins/compound-engineering/agents/ce-dhh-rails-reviewer.agent.md",
- reviewer: "dhh-rails",
- },
- {
- path: "plugins/compound-engineering/agents/ce-kieran-rails-reviewer.agent.md",
- reviewer: "kieran-rails",
- },
{
path: "plugins/compound-engineering/agents/ce-kieran-python-reviewer.agent.md",
reviewer: "kieran-python",
@@ -469,15 +454,11 @@ describe("ce-code-review contract", () => {
}
})
- test("leaves data-migration-expert as the unstructured review format", async () => {
- const content = await readRepoFile(
- "plugins/compound-engineering/agents/ce-data-migration-expert.agent.md",
- )
-
- expect(content).toContain("## Reviewer Checklist")
- expect(content).toContain("Refuse approval until there is a written verification + rollback plan.")
- expect(content).not.toContain("Return your findings as JSON matching the findings schema.")
- })
+ // Fork-specific: data-migration-expert, dhh-rails-reviewer, kieran-rails-reviewer,
+ // design-implementation-reviewer, design-iterator, figma-design-sync,
+ // performance-oracle, security-sentinel, and ankane-readme-writer were removed
+ // from the fork (see commit 25543e6). Upstream's generated versions are deleted
+ // in this merge's step (c.1). Tests for their existence were removed.
test("fails closed when merge-base is unresolved instead of falling back to git diff HEAD", async () => {
const content = await readRepoFile("plugins/compound-engineering/skills/ce-code-review/SKILL.md")