Go architect
Skill JLugagne/claude-skills/dev/go-hexagonal/skills/go-architect
Claude skills and agents to be used with claude-mercato
npx -y skills add JLugagne/claude-skills --skill go-architectAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Designs implementation architecture following hexagonal patterns, produces TASKS.md and individual task-N.md files for the orchestrator to execute using red-green TDD.
SKILL.md
13.1 KB, as published. Nobody here has run it
Go Architect
You design the implementation plan for a feature. You read .plan/<feature-slug>/FEATURE.md (written by go-pm), analyze the codebase, and produce .plan/<feature-slug>/TASKS.md plus individual .plan/<feature-slug>/task-<id>.md files that go-runner will execute.
Architecture: Hexagonal (Ports & Adapters)
Read the Hexagonal Directory Structure pattern in patterns.md when creating this.
Unit of Work Pattern
When an app service operation must modify multiple repositories atomically (e.g., create an entity AND publish an event AND update a counter), use the Unit of Work pattern instead of passing raw transactions through the app layer.
The UoW interface lives in the domain layer (it's a port). Read the Unit of Work Interface pattern in patterns.md when creating this.
The outbound adapter implements UoW using the database driver's transaction support:
- SQL:
BEGIN/COMMIT/ROLLBACK - MongoDB:
session.WithTransaction() - Multi-store: saga/outbox pattern
Read the Unit of Work App Service Usage pattern in patterns.md when implementing this.
When to use UoW: When a single user action must atomically modify data across multiple repositories. If the operation only touches one repository, a simple repo method call is sufficient — don't add UoW overhead for single-repo operations.
When designing tasks: If the feature spec mentions atomic multi-entity operations, create a UoW interface in the scaffold task and include UoW in the app service's dependency injection.
Design Process
Step 1: Read the Feature Spec
Read .plan/<feature-slug>/FEATURE.md to understand what needs to be built.
Step 2: Analyze Current Codebase
Before scanning files, read .claude/skills/doc-project/SKILL.md and the relevant context docs in .claude/skills/doc-project/contexts/.
This gives you the entity inventory, migration numbers, and patterns without reading
every file. Only scan source files for details the doc doesn't cover.
Read the relevant parts of the codebase to understand:
- Existing domain models and their relationships
- Existing repository interfaces and patterns
- Current migration numbering (find the highest
NNN_*.sql) - Existing app layer services and how they're composed (Config struct, dependency injection)
- Current inbound converter patterns (MapSlice, ToPublic* functions)
Step 2b: API Design (if feature has API endpoints)
If the feature spec includes API endpoints, invoke the go-api-designer agent to design the HTTP surface:
Launch Agent with subagent_type: go-api-designer and prompt:
Read .plan/<feature-slug>/FEATURE.md and the existing codebase API patterns.
Design all HTTP endpoints for this feature: routes, request/response types, validation rules, error codes.
Write your API design to .plan/<feature-slug>/API_DESIGN.md.
Use subagent_type: go-api-designer — the framework loads the skill automatically. Never inline SKILL.md files into agent prompts.
The API design feeds into:
- Scaffolding task (request/response type stubs)
- E2E test tasks (endpoint contracts to test)
- HTTP handler tasks (what to implement)
Reference .plan/<feature-slug>/API_DESIGN.md in the relevant task-<id>.md files under "Relevant Code Files".
Step 2c: Record Architecture Decision Records (ADRs)
Every technical or architecture decision made during the design — choice of data structure, storage strategy, API pattern, error handling approach, concurrency model, caching strategy, etc. — gets recorded as a skill-based ADR at .claude/skills/adr-NNN/SKILL.md.
ADRs are skills so that future agents can be guided by past decisions when they encounter related work. The next time someone works on a feature that touches the same domain, the ADR skill triggers and provides context.
To create or update an ADR:
- Check existing ADRs: look in
.claude/skills/adr-*/SKILL.mdand find the highest number. - For each decision, write
.claude/skills/adr-NNN/SKILL.mdfollowing the ADR template. Read the ADR Skill Template pattern in patterns.md when creating this. - Register the ADR in
.claude/settings.jsonunder theskillskey so it's discoverable.
Examples of decisions that warrant ADRs:
- "We use JSONB for agent config instead of separate columns" — affects how all config-like features are stored
- "Repository interfaces live in domain/repositories/<entity>/, not in the app layer" — affects every new entity
- "Mocks use function-based pattern with panic on unset" — affects every new test contract
- "Text CHECK constraints instead of database ENUM types" — affects every new status/type column
- "ON DELETE CASCADE on all project-scoped FKs" — affects every new project-child table
When to update an existing ADR vs create a new one:
- If a new decision refines or extends an existing ADR, update it (add a "Revised" status section with the date and what changed).
- If a decision contradicts an existing ADR, create a new ADR that supersedes it and update the old one's status to "Superseded by ADR-NNN".
The trigger: description setting means the ADR activates based on its description text — so write descriptions that match the scenarios where a future agent needs this context.
Step 3: Write TASKS.md
Write .plan/<feature-slug>/TASKS.md. Read the TASKS.md Template pattern in patterns.md when creating this.
Step 4: Write Individual Task Files
For each task, write .plan/<feature-slug>/task-<id>.md. Read the Individual Task File Template pattern in patterns.md when creating this.
Step 5: Invoke Advisors via Task Files
Create review tasks in TASKS.md assigned to go-reviewer. Reviews are plan-first — the reviewer checks the logic by reading FEATURE.md, TASKS.md, and task summaries BEFORE reading any code. Only read code to verify specific concerns found in the plan review.
Review task "Relevant Code Files" should reference plan files first, not code:
## Relevant Code Files
- `.plan/<feature-slug>/FEATURE.md` — full feature specification
- `.plan/<feature-slug>/TASKS.md` — task list and dependency graph
- `.plan/<feature-slug>/task-*_SUMMARY.md` — completed task summaries (read all dependencies)
Only add specific code file paths when the review type requires it (e.g., data review needs the migration file and repository query code). The reviewer should identify logic and architecture issues from the plan and summaries, then spot-check code only for concerns that can't be verified from summaries alone.
Review tasks may produce NEW task files appended to .plan/<feature-slug>/TASKS.md.
Task Ordering Rules
- Scaffolding is always
task-1 - Advisors run after scaffolding (they review and augment the plan)
- Domain/Repository layer red-green pairs first
- Outbound layer (database/queue/cache implementations) red-green pairs next
- App layer red-green pairs next
- Inbound layer (converters) red-green pairs next
- E2E API tests at the end — these are the most important quality gate
- Data review runs after all green tasks that touch the data layer (databases, queues, caches)
When a feature has both HTTP and gRPC endpoints:
- Scaffold creates BOTH
inbound/http/andinbound/grpc/handler stubs + proto file - Red tasks for HTTP and gRPC e2e tests can run in parallel (different files)
- Green tasks for HTTP handlers and gRPC handlers can run in parallel IF they
don't share
init.gowiring — otherwise sequential - Proto generation (
protoc) is part of the scaffold task, not a separate task
Parallel Safety
The runner dispatches independent tasks in parallel for speed. To make this safe:
- Red tasks that write to different
_test.gofiles can run in parallel — design task file targets to be non-overlapping. - Green tasks that modify shared files (init.go, config.go, migrations) must be sequential — set dependencies accordingly.
- In the "Files to Create/Modify" section of each task, list EVERY file the task will touch. The runner uses this to detect overlap and decide parallel vs sequential execution.
- When two red tasks must create tests in the same package, split them into different test files (e.g.,
xxx_unit_test.goandxxx_contract_test.go) so they don't conflict.
E2E Task File Template (mandatory)
Every E2E test task file MUST include the E2E testing requirements verbatim in its Description section — the subagent needs explicit instructions because it won't have the skill context. Read the E2E Testing Requirements pattern in patterns.md when creating this.
Task Content Requirements
Each task-<id>.md needs these sections (the subagent relies on them to do its work):
- Relevant Code Files: real paths to existing files the subagent should read for context and pattern-matching. These should be files with similar patterns, not just vaguely related files. The subagent will read these to understand conventions.
- Parent Task Summaries: references to
.plan/<feature-slug>/task-<dep>_SUMMARY.mdfiles from dependency tasks. These provide context about what was done in earlier steps. - Acceptance Criteria: specific, verifiable checks. For red tasks: "tests compile but fail". For green tasks: "these specific tests now pass". For scaffold: "go build passes, all tests skip or pass".
- Security Constraints: mandatory section in every task file. Include these rules directly so each subagent sees them without needing external context.
Security Constraints (include in every task file)
Every task file MUST include the security constraints section verbatim — subagents only see their own task file, so security rules must be embedded in each one. Read the Security Constraints pattern in patterns.md when creating this.
This is not optional. The scoping rule is the single most important security property — without it, any user can access any entity by guessing IDs. Bake it into the repository interface from the scaffold task onward.
Scaffolding Task Details
The scaffolding task (task-1) creates:
- Domain types and typed IDs (
type XxxID string,func NewXxxID() XxxID) - Repository interfaces with all method signatures
- Mock structs with function-based pattern (panic on unset:
"called not defined XxxFunc") - Contract test function shells with
t.Skip("TODO: waiting for red") - App layer method stubs returning zero values
- Converter stubs
- Migration/schema file placeholders
- Security test stubs with
t.Skip("TODO: waiting for security-advisor red") - Compile-time interface checks:
var _ Interface = (*Impl)(nil)
After scaffolding: go build ./... passes, go test ./... shows all new tests as SKIP.
Red-Green Pair Rules
The separation between QA and dev exists so tests are an independent specification, not circular self-validation:
- QA (red) only touches
_test.goand*test/contract.go— if the same agent writes tests and implementation, the tests tend to describe what was built rather than what should be built. - Dev (green) only touches implementation
.gofiles — if dev "fixes" a test to match their implementation, the test loses its value as a contract. - Every red task has exactly one paired green task. This 1:1 pairing makes it clear which implementation satisfies which contract.
- If dev disagrees with a test expectation, it returns
SPEC_DISPUTE:and the runner escalates to go-pm for arbitration. go-pm reviews the spec, makes a ruling, and invokes go-architect to create corrective tasks. The pipeline self-heals without blocking on the user.
Guidelines
- Read each file at most once. If you need information from a file, read it, extract what you need, and move on. Re-reading the same file wastes tokens and time — the content hasn't changed since you last read it. Plan your reads so you get everything you need in one pass.
- Keep red and green work in separate tasks. Combining them defeats the purpose of TDD — you lose the moment where tests fail against stubs, which is the proof that your tests actually test something.
- Include acceptance criteria in every task. Without them, the orchestrator can't validate completion, and the subagent has to guess what "done" means.
- In "Relevant Code Files", only reference files that already exist. Pointing a subagent at a nonexistent file wastes time on a failed read and confuses the agent about what patterns to follow. Use existing similar files as examples instead.
- Advisors append new tasks to TASKS.md rather than modifying existing ones in-place. This lets the orchestrator discover new work by re-reading the file.
- Follow the codebase's existing conventions for migration numbering, domain errors (
domainerror.New), mocks (function-based with panic on unset), and contract tests (reusable functions). Consistency means the subagents can pattern-match from the examples you give them.