go-architect — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited go-architect (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
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.
Read the Hexagonal Directory Structure pattern in patterns.md when creating this.
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:
BEGIN / COMMIT / ROLLBACKsession.WithTransaction()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.
Read .plan/<feature-slug>/FEATURE.md to understand what needs to be built.
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:
NNN_*.sql)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:
Reference .plan/<feature-slug>/API_DESIGN.md in the relevant task-<id>.md files under "Relevant Code Files".
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:
.claude/skills/adr-*/SKILL.md and find the highest number..claude/skills/adr-NNN/SKILL.md following the ADR template. Read the ADR Skill Template pattern in patterns.md when creating this..claude/settings.json under the skills key so it's discoverable.Examples of decisions that warrant ADRs:
When to update an existing ADR vs create a new one:
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.
Write .plan/<feature-slug>/TASKS.md. Read the TASKS.md Template pattern in patterns.md when creating this.
For each task, write .plan/<feature-slug>/task-<id>.md. Read the Individual Task File Template pattern in patterns.md when creating this.
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-1When a feature has both HTTP and gRPC endpoints:
inbound/http/ and inbound/grpc/ handler stubs + proto filedon't share init.go wiring — otherwise sequential
protoc) is part of the scaffold task, not a separate taskThe runner dispatches independent tasks in parallel for speed. To make this safe:
xxx_unit_test.go and xxx_contract_test.go) so they don't conflict.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.
Each task-<id>.md needs these sections (the subagent relies on them to do its work):
.plan/<feature-slug>/task-<dep>_SUMMARY.md files from dependency tasks. These provide context about what was done in earlier steps.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.
The scaffolding task (task-1) creates:
type XxxID string, func NewXxxID() XxxID)"called not defined XxxFunc")t.Skip("TODO: waiting for red")t.Skip("TODO: waiting for security-advisor red")var _ Interface = (*Impl)(nil)After scaffolding: go build ./... passes, go test ./... shows all new tests as SKIP.
The separation between QA and dev exists so tests are an independent specification, not circular self-validation:
_test.go and *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..go files — if dev "fixes" a test to match their implementation, the test loses its value as a contract.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.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.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.