Skip to content
Back to skills

Ddw Validate Arch

ASecurity

Validates that the code follows the project's architecture decisions and conventions. An advisory check, not a gate: the graph carries no `arch` condition, so it reports and the orchestrator decides. Produces disambiguation questions when a finding needs the user's context. Trigger: /ddw-validate-arch, during DDW's CODE phase.

  • 13 stars
  • 0 votes
  • 0 copies
  • 3 views
  • Added October 12, 2026
ai-agentsgosqlapisecurityperformance

Works with

  • cli
  • api

Security analysis

A100/100

Scanned October 12, 2026

npx -y skills add DiluxOne/dilux-agentic-workflow --skill ddw-validate-arch --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Ddw Validate Arch?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Ddw Validate Arch
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/diluxone-ddw-validate-arch/badge)](https://www.skillsdirectory.com/skills/diluxone-ddw-validate-arch)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: ddw-validate-arch
description: >
  Validates that the code follows the project's architecture decisions and conventions. An advisory
  check, not a gate: the graph carries no `arch` condition, so it reports and the orchestrator
  decides. Produces disambiguation questions when a finding needs the user's context.
  Trigger: /ddw-validate-arch, during DDW's CODE phase.
---

# Skill: /ddw-validate-arch

## Description
Validates that the code follows the project's architecture decisions and conventions. It is an
**advisory check, not a gate**: `transition-graph.json` carries no `arch` condition on any edge, so
nothing here refuses a transition — it reports, and the orchestrator decides what to do. Naming it
a gate would be the exact failure this pipeline exists to avoid: calling something a lock when it
is a sign. Produces disambiguation questions when a finding needs the user's context.

## Inputs
- The modified files (default) or the whole project (if specified)
- The project's architecture conventions (`AGENTS.md`)

> **This skill has no rules of its own.** Its criteria come from the "Architecture conventions"
> section of the target project's `AGENTS.md`. If that section is empty, say so and report PASSED
> with a warning: there is nothing to validate against, and inventing conventions the project never
> declared is worse than validating nothing. The patterns below are a *starting* checklist to adapt,
> not a fixed catalog. (This is why `validate-arch` has no F-/W- IDs in
> `.ddw/rules/validation-rules.instructions.md` — it is an operational gate, not an artifact
> validator.)

## Execution Protocol

1. Identify which files to analyze:
   - First run in the phase: the whole relevant codebase.
   - Post-block: only the files the block modified.
2. For each file, check:
   - **Module structure:** every file in its correct layer.
   - **Separation of responsibilities:** no business logic in the transport layer.
   - **Language conventions:** typing, imports, naming, formatting.
   - **Correct use of the framework/ORM.**
   - **Data fetching:** server-side pagination, no in-memory filtering.
   - **Basic security:** no hardcoded secrets, no debug logging left in production paths.
3. Classify findings against the explicit criteria (below).
4. **For every FAIL that needs the user's decision, produce a disambiguation question.**

## Search patterns *(adapt to the stack)*

| Category | Look for | Level |
|----------|----------|-------|
| Circular dependencies | Mutual imports between modules | FAIL |
| Logic in transport | Queries or transformations in routes/controllers | FAIL |
| Hardcoded secrets | Strings that look like API keys, passwords, tokens | FAIL |
| In-memory filtering | Full lists filtered client-side with no pagination | FAIL |
| SQL injection | Queries built by string concatenation, unparameterized | FAIL |
| Weak typing | `any`, `Object`, `dynamic` with no justification | WARN |
| Debug logging in production | `console.log`, `print()` outside tests | WARN |
| Unjustified raw SQL | Queries outside the ORM with no comment | WARN |
| Unused import | Imports declared but never referenced | WARN |

## Output Format

```
┌─────────────────────────────────────────────────────────────┐
│  /ddw-validate-arch [scope] — [PASSED | BLOCKED (N quest.)]  │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│  [Category]:                                                 │
│    ✅/❌/⚠️ file:line — [description]                          │
│                                                              │
│  Disambiguation questions:      (only if there are FAILs)    │
│                                                              │
│    Q1: file:line — [concrete question]                       │
│        Options: a) ... b) ... c) ...                         │
│                                                              │
│  ────────────────────────────────────────────────────────────│
│  Total: X passed, Y failed, Z warnings                       │
│  Next: [recommended action] (attempt N/3)                    │
└─────────────────────────────────────────────────────────────┘
```

## FAIL criteria (blocking)

A check is ❌ FAIL when it is a **safe architecture or security violation**:

- Circular dependencies between modules
- Business logic in the transport layer (queries, transformations in routes/controllers)
- Hardcoded secrets (API keys, passwords, tokens, connection strings)
- In-memory filtering with no server-side pagination for potentially large collections
- SQL injection (string concatenation in unparameterized queries)
- A violation of layer separation as defined by the project's architecture
- Files in the wrong layer (e.g. a service inside the routes folder)

## WARN criteria (non-blocking)

A check is ⚠️ WARN when it **needs context and may be valid**:

- Weak typing (`any`, `Object`, `dynamic`) — may be intentional in a catch or in generics
- Debug logging outside tests — may be intentional logging
- Raw SQL outside the ORM — may be justified by performance
- Unused import — may be a side-effect import
- Unconventional naming — may be dictated by an external API

## Disambiguation questions

Produce a question when:
- A FAIL has an obvious fix → a confirmation question: "Shall I move the query in controller.ts:23
  to the service layer?"
- A FAIL has several possible fixes → a question with options: "In-memory filtering in routes.ts:45.
  a) Move it into a SQL query with pagination b) Add limit/offset to the endpoint c) It is
  intentional (the collection is always small)"
- A WARN looks suspicious → an exploratory question: "Is the `any` in service.ts:30 intentional?"

## Result Rules

- **PASSED:** 0 FAILs. It may have WARNs.
- **BLOCKED (N questions):** 1+ FAILs. Each FAIL may produce a question if the fix is not obvious.
- Max 3 correction attempts before escalating to the user.
- The answers guide the automatic correction, or justify the pattern.

## Updating .ddw-state.json
- Does not modify flags directly. The result determines whether work can advance.

## Language

Write the report in the language the user is working in.

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.