Skip to content
Back to skills

Schema Validate

ASecurity

Use when: kullanıcı "schema validate", "schema doğrula", "frontmatter kontrol", "draft7 audit", "/pseo-driftcheck" der ya da phase gateway öncesi quality gate fired. JSON Schema Draft7 validation across all schemas under schemas/, cross-sheet-invariants 31 rules (F-01..F-15 + D-01..D-03 + M-01..M-02 baseline = 20; F-16..F-22 additive K-02 v1.5-Phase-2 = 27; F-23..F-26 SF MCP additive v1.8 Phase 4 = 31, terminal F-26), and SKILL.md frontmatter compliance under skills/**/. Also use when: yeni s...

  • 27 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added October 2, 2026
ai-agentspythongo

Works with

  • terminal
  • mcp

Security analysis

A100/100

Scanned October 2, 2026

npx -y skills add popiliadam/platinum-seo-engine --skill schema-validate --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Schema Validate?

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

Security grade badge for Schema Validate
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/popiliadam-schema-validate/badge)](https://www.skillsdirectory.com/skills/popiliadam-schema-validate)

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: schema-validate
description: |
  Use when: kullanıcı "schema validate", "schema doğrula", "frontmatter
  kontrol", "draft7 audit", "/pseo-driftcheck" der ya da phase gateway
  öncesi quality gate fired. JSON Schema Draft7 validation across all
  schemas under schemas/, cross-sheet-invariants 31 rules
  (F-01..F-15 + D-01..D-03 + M-01..M-02 baseline = 20; F-16..F-22 additive
  K-02 v1.5-Phase-2 = 27; F-23..F-26 SF MCP additive v1.8 Phase 4 = 31,
  terminal F-26), and SKILL.md frontmatter compliance under skills/**/.
  Also use when: yeni schema eklendi (additive bump), frontmatter
  drift şüphesi, CI quality gate, drift-check öncesi pre-flight,
  Phase 4 sf-mcp-tool-mapping.schema.json + templates/sf-mcp/
  use-case-example.json drift kontrolü.
  Do not use when: master.xlsx invariants (drift-check'in işi),
  glossary terim drift'i (glossary-audit'in işi), build error
  (build-error-resolver). schema-validate read-only audit, master.xlsx
  asla mutate edilmez.
version: "1.0"
status: active
category: governance
inputs:
  schema_path:
    type: string
    required: false
    default: "schemas/"
    description: "Schema dosyalarının kök dizini. Default schemas/. Runtime glob ile *.schema.json enumerate edilir; hardcoded count YOK."
  strict:
    type: boolean
    required: false
    default: true
    description: "True ise herhangi FAIL exit 1; False ise AMBER + report-only. Default true (CI gate semantiği)."
outputs:
  - "outputs/reports/{date}-schema-validate.md"
  - "_state/events.jsonl"
consumes:
  - "init-project:schemas/*.schema.json"
  - "init-project:schemas/cross-sheet-invariants.json"
  - "init-project:skills/**/SKILL.md"
produces: []
triggers:
  manual: ["/pseo-driftcheck"]
  natural_language: |
    "schema validate", "schema doğrula", "frontmatter kontrol",
    "draft7 audit", "schema drift", "schema audit",
    "frontmatter compile", "skill frontmatter check"
  hooks: []
  scheduled: []
mcp_tools:
  required: []
  optional: []
budget:
  uses_paid_mcp: false
  estimated_credits: 0
autonomy:
  confidence: HIGH
  requires_approval: false
  safe_auto_execute: true
---

# schema-validate — governance skill (Phase 13)

Read-only schema audit. Enumerate all `schemas/*.schema.json` via runtime
`glob()` (NOT hardcoded count — count drift is the failure mode this skill
is designed to surface), validate each as a well-formed JSON Schema
Draft7 meta-schema, validate the cross-sheet-invariants instance
document's `rules[]` array (≥20 rule registry, key=`rules` per
S3.5 instance pivot; additive growth via K-02 paterni), and
validate every `skills/**/SKILL.md`
frontmatter block against `schemas/skill-frontmatter.schema.json`.

**Read-only contract:** `master.xlsx` MUST NOT be opened, mutated, or
referenced from `outputs[]`. The skill writes only to
`outputs/reports/{date}-schema-validate.md` (markdown report) and
`_state/events.jsonl` (single `event_kind=audit` row).

## Foundational Principles (3-layer enforce)

This skill operates under the three Foundational Principles
(authority: `rules/schema-first.md` + `rules/single-source-of-truth.md`
+ `rules/append-only-state.md` — schema-first authoritative reference;
applied principles converge in `rules/content-quality.md`):

1. **Truth-verifiable** — every assertion in the report MUST trace back
   to a schema authority (the schema file itself or its
   `Draft7Validator.iter_errors` output). No prose fabrication.
2. **Profile-aware (5-enum)** — the skill respects the project profile
   enum (`solo` / `agency` / `inhouse` / `enterprise` / `pilot`). Strict
   mode default mirrors the agency/enterprise CI gate semantics.
3. **AI suistimal yasağı** — the skill MUST NOT call any LLM tool to
   "explain" a schema error away. Failures surface as-is in the report;
   human judgment owns repair. `mcp_tools=[]` enforces this at the
   contract level.

## DURUR (no fall-back) conditions

1. **DURUR #1 — `import jsonschema` smoke fails** → AMBER + exit 1.
   The skill cannot proceed without the validator library; this is
   an environment defect, not a data defect.
2. **DURUR #2 — `schemas/` directory missing** → exit 1. The skill
   uses a runtime `glob('schemas/*.schema.json')` enumerate (NOT a
   hardcoded count) precisely so that schema additions/removals do
   NOT silently change behaviour. Missing root directory is fatal.
3. **DURUR #3 — strict=true AND any FAIL** → exit 1; non-strict mode
   downgrades to AMBER + report-only (CI gate skipped, manager review
   required). Never silently PASS on FAIL.

## Inputs (frontmatter contract)

| Name           | Type    | Default     | Notes                                                                            |
|----------------|---------|-------------|----------------------------------------------------------------------------------|
| `schema_path`  | string  | `schemas/`  | Root dir for runtime glob enumerate. NOT a count parameter.                      |
| `strict`       | boolean | `true`      | True → any FAIL exits 1. False → AMBER + report.                                 |

## Outputs (artifacts produced)

- `outputs/reports/{date}-schema-validate.md` — human-readable report
  enumerating every schema validated, every cross-sheet-invariants
  rule structurally checked, every SKILL.md frontmatter result.
- `_state/events.jsonl` — single `event_kind=audit` entry
  (`audit_action="accessed"`, `audit_target="schemas:bulk-validate"`,
  `actor="agent:schema-validate"`).

## 8-Step Body Protocol

### Step 1 — `validator_smoke` (DURUR #1)

```python
# Standalone-executable entrypoint (Phase 14 W3-W1 helper exec compliance):
# imports + entrypoint variables init for downstream concat blocks.
import os
import sys
import json
import re
from pathlib import Path

import yaml

# sys.path insert so `scripts.*` packages resolve under subprocess exec.
sys.path.insert(0, os.getcwd())

# Entrypoint variables (placeholder defaults — orchestrator overrides at runtime)
schema_path = "schemas/"
strict = True
project_id = "drifttest"
REPO_ROOT = Path.cwd()
failures: list = []

try:
    import jsonschema
    from jsonschema import Draft7Validator
except ImportError as exc:
    raise SystemExit(f"DURUR #1: jsonschema unavailable: {exc}")
```

`Draft7Validator.check_schema(schema)` is the meta-schema gate; without
it the skill cannot validate anything.

### Step 2 — `enumerate_schemas` (runtime glob, NOT hardcoded count)

```python
schema_root = Path(schema_path)
if not schema_root.exists():
    raise SystemExit(f"DURUR #2: {schema_root} missing")
schema_files = sorted(schema_root.glob("*.schema.json"))
# IMPORTANT: count is computed at runtime; F-13.1 manager finding —
# brief authority claim "19 schema" diverged from filesystem 18.
# Schema authority kazanır (lesson 31+34 schema-first override).
```

Hardcoded counts in this skill body or description WOULD reintroduce
the very drift this skill exists to detect. Count is reported to the
report markdown but never asserted as a constant.

### Step 3 — `meta_validate_each_schema`

```python
for sp in schema_files:
    schema = json.loads(sp.read_text(encoding="utf-8"))
    Draft7Validator.check_schema(schema)  # raises SchemaError on bad meta
```

Each `.schema.json` file must itself be a valid Draft7 meta-schema.
This catches `$ref` typos, malformed `enum`, unrecognized keywords.

### Step 4 — `validate_cross_sheet_invariants_rules`

```python
csi = json.loads((schema_root / "cross-sheet-invariants.json").read_text("utf-8"))
rules = csi["rules"]   # KEY = "rules" — NOT "invariants"
assert isinstance(rules, list)
assert len(rules) >= 1
required_per_rule = {"id", "severity", "category", "rule"}
for entry in rules:
    missing = required_per_rule - set(entry.keys())
    assert not missing, f"rule {entry.get('id', '?')} missing keys: {missing}"
```

The cross-sheet-invariants instance document carries 31 rules
(F-01..F-15 + D-01..D-03 + M-01..M-02 baseline = 20; F-16..F-22 additive
K-02 v1.5-Phase-2 = 27; F-23..F-26 SF MCP cross-sheet additive v1.8
Phase 4 = 31, terminal F-26) per spec §7. Per-rule F-NN ↔ `validate_invariants.py` parity is
enforced separately by `tests/schemas/test_cross_sheet_invariants_sync.py`
(bidirectional + `KNOWN_SCHEMA_ONLY` known-deferred for F-06/F-07). The
top-level key is `rules` per S3.5 pivot — NOT `invariants`. This skill
explicitly exercises that key so a memory-drift typo (the natural
mistake) is caught at the audit step, not silently masked.

### Step 5 — `validate_skill_frontmatter_compliance`

```python
fm_schema = json.loads((schema_root / "skill-frontmatter.schema.json").read_text("utf-8"))
fm_validator = Draft7Validator(fm_schema)
skill_root = REPO_ROOT / "skills"
skill_files = sorted(skill_root.rglob("SKILL.md"))
for skill_md in skill_files:
    text = skill_md.read_text(encoding="utf-8")
    m = re.match(r"^---\n(.*?)\n---\n", text, re.DOTALL)
    if not m:
        # FAIL: frontmatter block missing
        failures.append(f"{skill_md}: no frontmatter block")
        continue
    fm = yaml.safe_load(m.group(1))
    errors = sorted(fm_validator.iter_errors(fm), key=lambda e: list(e.absolute_path))
    # accumulate per-file
    if errors:
        failures.extend(f"{skill_md}: {e.message}" for e in errors)
```

Every `skills/**/SKILL.md` frontmatter is Draft7-validated against
the canonical `skill-frontmatter.schema.json`. The 13 root properties
declared there (name, description, version, status, category, inputs,
outputs, triggers, consumes, produces, mcp_tools, budget, autonomy)
are the contract surface.

### Step 6 — `aggregate_verdict` (DURUR #3)

```python
overall = "GREEN" if not failures else ("RED" if strict else "AMBER")
if strict and failures:
    raise SystemExit(1)   # DURUR #3
```

Strict + FAIL → exit 1. Non-strict + FAIL → AMBER report, no exit.
Never silently PASS on FAIL.

### Step 7 — `render_report`

Write `outputs/reports/{date}-schema-validate.md` with sections:

- **Schemas** — count (runtime), per-file PASS/FAIL with first 3 errors.
- **Cross-Sheet Invariants** — `rules` array length, per-rule structural
  PASS/FAIL.
- **SKILL.md Frontmatter** — count (runtime), per-file PASS/FAIL with
  Draft7 errors.
- **Summary** — overall verdict (GREEN/AMBER/RED).

### Step 8 — `emit_audit_event`

```python
from scripts.state import events_writer
# Documented invocation (orchestrator runs at workflow time):
# events_writer.append_audit(
#     project_id=project_id,
#     audit_action="accessed",
#     audit_target="schemas:bulk-validate",
#     actor="agent:schema-validate",
#     notes=f"verdict={overall} schemas={len(schema_files)} skills={len(skill_files)}",
# )
audit_payload = {
    "event_kind": "audit",
    "audit_action": "accessed",
    "audit_target": "schemas:bulk-validate",
    "actor": "agent:schema-validate",
    "notes": f"verdict={overall} schemas={len(schema_files)} skills={len(skill_files)}",
}
```

The audit event_kind requires the `audit_action + audit_target + actor`
triple per `events.schema.json` allOf rule. `event_type` (the WORK-only
closed 10-value enum) is NOT used here; that field is reserved for
work-tracking events (DONE protocol §21.4) and the schema-first
override (lesson 31+34) directs governance signals to the audit kind.

## v1.8 Phase 1 — sf-mcp-tool-mapping.schema.json (additive enumerate)

The Phase 1 schema `schemas/sf-mcp-tool-mapping.schema.json` (155L,
Screaming Frog 24 native MCP integration contract) is picked up by the
runtime `glob('schemas/*.schema.json')` enumerate (Step 2) automatically
— no enumeration code change required (F-13.1 schema-first override
discipline: count is runtime, not hardcoded).

The companion instance document
`templates/sf-mcp/use-case-example.json` is a SAMPLE instance (Phase 1
scaffold demonstrating the contract). Phase 4 verification: that
sample MUST `Draft7Validator(schema).validate(instance)` cleanly,
otherwise the schema contract is broken. The schema-validate skill
covers this implicitly via the meta-schema gate (Step 3); the dedicated
positive-instance assertion lives in
`tests/skills/test_schema_validate.py::test_sf_mcp_tool_mapping_in_sweep`
(Phase 4 test extension).

The Phase 1 baseline schemas/ count was 18 (per F-13.1); Phase 1
added `sf-mcp-tool-mapping.schema.json` → 19+ depending on prior
additions. The exact number is reported by the runtime glob at every
run — never asserted as a constant.

## Master.xlsx WRITE forbidden

This skill MUST NOT call `transaction.append`, `transaction.update`,
`transaction.delete`, or `wb.save` against `master.xlsx`. It does not
even open the workbook — schemas live under `schemas/` and SKILL.md
files live under `skills/`, both outside the project state tree.
The test suite enforces this by regex grep over the production prose:
the call-site syntax (transaction-dot-append-with-paren etc.) is
forbidden in this body, and the body intentionally references those
tokens WITHOUT the trailing paren to discuss them in negative form.

## Why the `rules` key matters (W-H1 finding F-13.1 reuse)

The cross-sheet-invariants instance document uses the top-level key
`rules` (per spec §3.5 instance pivot). Memory drift naturally
produces the misspelling `invariants` (the document title has
"Invariants" in it). schema-validate explicitly tests the `rules`
key so this drift is caught the moment it appears — schema authority
wins over memory authority (lesson 31+34 schema-first override).

## Why hardcoded schema count is forbidden

The brief's authority claim ("19 schema") diverged from the actual
filesystem count (18). The natural temptation is to lock the count
in a constant; schema-validate explicitly avoids this. `glob()` enumerate
makes the skill self-aware: it reports whatever exists at runtime, and
the report records the count for the manager to cross-check. This is
the lesson 31+34 schema-first override paterni applied to a count
authority.

## Cross-references

- Schemas: `schemas/skill-frontmatter.schema.json`,
  `schemas/cross-sheet-invariants.json`,
  `schemas/events.schema.json` (event_kind=audit branch).
- Cross-modules: `scripts/state/events_writer.py` (audit append),
  `scripts/reporting/render_template.py` (report render).
- Tests: `tests/skills/governance/test_schema_validate.py`.
- Sibling governance skills: `drift-check` (master.xlsx invariants),
  `glossary-audit` (term drift), `load-context` (session wakeup).

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.