# Delphi Validator

> Validates all SimpleORM Delphi source files for Delphi 10.2 Tokyo+ compatibility. Checks inline vars, unit scoping, generics E2506, uses completeness, memory safety, .dpr structure, and conditional compilation. Run anytime to "lint" the project.

- Skill: `academiadocodigo/delphi-validator` (Agent Skill)
- Install (CLI): `npx skillmds@latest add academiadocodigo/delphi-validator`
- Raw SKILL.md: https://api.skillmd.com/api/skills/academiadocodigo/delphi-validator/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: academiadocodigo (https://skillmd.com/u/academiadocodigo)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/academiadocodigo/delphi-validator

---


# Delphi 10.2+ Compatibility Validator

Validates the SimpleORM codebase against Delphi 10.2 Tokyo+ compatibility rules. Acts as a static analyzer / linter since we cannot compile in this environment.

## What It Checks (7 Categories)

| Code | Category | Severity | Description |
|------|----------|----------|-------------|
| INLINE-VAR | Inline Variables | ERRO | `var`/`const` inside begin/end, `for var` — require 10.3+ |
| SCOPE-AMBIGUITY | Unit Scoping | WARN | Bare `Format(` with SimpleAttributes in uses, missing unit qualifications |
| GENERICS-E2506 | Generics Restrictions | ERRO | Implementation-local symbols used in generic class methods |
| USES-VISIBILITY | Uses Completeness | ERRO | Types used in interface section but unit only in implementation uses |
| MEMORY-SAFETY | Memory Management | WARN | Leaked objects, swallowed exceptions, bare Free in destructors |
| DPR-STRUCTURE | Program File Structure | ERRO | Invalid .dpr structure (unit keyword, interface/implementation sections) |
| CONDITIONAL-COMPAT | Conditional Compilation | ERRO | Unguarded 10.3+/10.4+ features without RTLVERSION check |

## How to Run

When this skill is invoked, dispatch the `delphi-compatibility-checker` subagent:

```
Agent(
  subagent_type = "delphi-compatibility-checker",
  prompt = "Analyze ALL .pas and .dpr files in src/ for Delphi 10.2+ compatibility. Apply all 7 rule categories. Report every finding with file:line, category, and severity. End with a summary.",
  description = "Delphi 10.2+ compatibility check"
)
```

## After Results

1. **Present the report** to the user as-is
2. **If errors found**: Ask the user if they want you to fix them automatically
3. **If fixing**: Apply fixes following the patterns in `.claude/rules/` and the fix guidance in each finding
4. **After fixing**: Re-run the validator to confirm all issues are resolved

## Quick Reference: Common Fixes

### INLINE-VAR Fix
```pascal
// BEFORE (10.3+ only):
begin
  var LName: String := 'value';
  for var I := 0 to 10 do ...

// AFTER (10.2 compatible):
var
  LName: String;
  I: Integer;
begin
  LName := 'value';
  for I := 0 to 10 do ...
```

### SCOPE-AMBIGUITY Fix
```pascal
// BEFORE (ambiguous):
aErrors.Add(Format(sMSG, [aValue]));

// AFTER (explicit):
aErrors.Add(System.SysUtils.Format(sMSG, [aValue]));
```

### GENERICS-E2506 Fix
```pascal
// BEFORE (local function — triggers E2506):
implementation
function LocalHelper(...): ...; // only in implementation
// used by TSimpleXxx<T>.SomeMethod

// AFTER (promote to interface):
interface
function LocalHelper(...): ...;
implementation
function LocalHelper(...): ...; // implementation stays
```

### USES-VISIBILITY Fix
```pascal
// BEFORE:
interface
uses SimpleInterface; // SimpleTypes NOT here
type
  TMyClass = class
    FCallback: TSimpleErrorCallback; // defined in SimpleTypes!
  end;
implementation
uses SimpleTypes; // too late for interface declarations

// AFTER:
interface
uses SimpleInterface, SimpleTypes; // moved here
```

