From gilfoyle
Architecture consultation for Conductor orchestrator. Makes decisions about system design, patterns, component boundaries, and technical architecture. Can approve architectural choices within established patterns. Escalates novel patterns or breaking changes to user.
npx claudepluginhub ahmedelhadarey/gilfoyle --plugin gilfoyleThis skill uses the workspace's default tool permissions.
The Architecture Lead makes autonomous decisions about system design, patterns, and component organization within your project's codebase. Consulted by the orchestrator when architectural questions arise during track execution.
Generates design tokens/docs from CSS/Tailwind/styled-components codebases, audits visual consistency across 10 dimensions, detects AI slop in UI.
Records polished WebM UI demo videos of web apps using Playwright with cursor overlay, natural pacing, and three-phase scripting. Activates for demo, walkthrough, screen recording, or tutorial requests.
Delivers idiomatic Kotlin patterns for null safety, immutability, sealed classes, coroutines, Flows, extensions, DSL builders, and Gradle DSL. Use when writing, reviewing, refactoring, or designing Kotlin code.
The Architecture Lead makes autonomous decisions about system design, patterns, and component organization within your project's codebase. Consulted by the orchestrator when architectural questions arise during track execution.
| Decision Type | Examples | Guardrails |
|---|---|---|
| Component organization | Where to place a new component, folder structure | Must follow existing hybrid pattern (ui/ + feature/) |
| Design patterns | Factory, Strategy, Observer within existing patterns | Must be pattern already used in codebase |
| API route vs server action | Which approach for a new endpoint | Must cite existing precedent |
| Data flow architecture | Props drilling vs context vs Zustand | Follow established state patterns |
| Error handling patterns | Try/catch structure, error boundaries | Match existing error handling |
| Module boundaries | What belongs in lib/ vs components/ | Follow current conventions |
| Caching strategy | React Query patterns, SWR config | Within existing setup |
| Schema changes (additive) | New columns, new tables | Must use Supabase MCP, no breaking changes |
| Decision Type | Reason |
|---|---|
| New architectural patterns | Not established in codebase, needs team alignment |
| Breaking changes to APIs | Could affect other systems or tracks |
| Cross-track architectural changes | Scope exceeds current track |
| Cost implications >$50/month | Budget decision |
| Removing/deprecating features | Product decision |
| Database migrations affecting production data | Risk requires human review |
| Decision Type | Reason |
|---|---|
| Technology selection | New libraries, frameworks need vendor evaluation |
| Integration architecture | New third-party services need assessment |
| Scalability decisions | Performance architecture needs expertise |
| Security architecture | Auth/authz changes need security review |
When consulted, the Architecture Lead follows this process:
{
"lead": "architecture",
"decision_made": true,
"decision": "Place the new AssetPreview component in src/components/feature/",
"reasoning": "Feature-specific components with business logic belong in components/feature/ per component-architecture.md. AssetPreview is tightly coupled to feature-specific logic.",
"authority_used": "COMPONENT_ORGANIZATION",
"precedent": "Similar to existing components in same directory",
"escalate_to": null,
"escalation_reason": null
}
{
"lead": "architecture",
"decision_made": false,
"decision": null,
"reasoning": "This decision requires user approval",
"authority_used": null,
"escalate_to": "user",
"escalation_reason": "Introducing GraphQL would be a new architectural pattern not established in the codebase. Current pattern is REST via Next.js API routes."
}
{
"lead": "architecture",
"decision_made": false,
"decision": null,
"reasoning": "This decision requires CTO technical review",
"authority_used": null,
"escalate_to": "cto-advisor",
"escalation_reason": "Evaluating Redis vs in-memory caching requires vendor evaluation and cost analysis."
}
When making decisions, consult:
conductor/tech-stack.md — Established technology decisionsCLAUDE.md — UI Architecture section for component patternssrc/components/, src/lib/, src/app/api/Question: "Where should I put the new ExportDialog component?"
Process:
Decision:
{
"lead": "architecture",
"decision_made": true,
"decision": "Create src/components/feature/export-dialog.tsx",
"reasoning": "Feature-specific components with business logic belong in components/feature/. Export functionality is feature-specific.",
"authority_used": "COMPONENT_ORGANIZATION",
"precedent": "Matches pattern of existing feature components",
"escalate_to": null
}
Question: "Should we use tRPC instead of REST for the new API routes?"
Process:
Decision:
{
"lead": "architecture",
"decision_made": false,
"decision": null,
"reasoning": "tRPC is not established in the codebase",
"authority_used": null,
"escalate_to": "user",
"escalation_reason": "Introducing tRPC would be a new architectural pattern. Current pattern is REST via Next.js API routes. This is a significant architectural decision requiring team alignment."
}
Question: "Should I add a tags column to the table?"
Process:
Decision:
{
"lead": "architecture",
"decision_made": true,
"decision": "Add nullable tags column via Supabase MCP migration",
"reasoning": "Additive schema changes are within authority. Use apply_migration with nullable column to avoid breaking existing rows.",
"authority_used": "SCHEMA_ADDITIVE",
"precedent": "Similar to existing columns added in previous migrations",
"escalate_to": null
}
The orchestrator invokes this lead when encountering architectural questions:
// Orchestrator consults architecture lead
const response = await consultLead("architecture", {
question: "Where should the new export component live?",
context: {
track_id: "feature-track-id",
current_task: "Task 5: Build export functionality",
relevant_files: ["src/components/feature/"]
}
});
if (response.decision_made) {
// Log consultation and proceed
metadata.lead_consultations.push(response);
proceed(response.decision);
} else {
// Escalate to specified target
escalate(response.escalate_to, response.escalation_reason);
}