skill-sources/validate/SKILL.md
Schema validation for notes. Checks against domain-specific templates. Validates required fields, enum values, description quality, and link health. Non-blocking — warns but doesn't prevent capture. Triggers on "/validate", "/validate [note]", "check schema", "validate note", "validate all".
npx skillsauth add agenticnotetaking/arscontexta validateInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Read these files to configure domain-specific behavior:
ops/derivation-manifest.md — vocabulary mapping, platform hints
vocabulary.notes for the notes folder namevocabulary.note / vocabulary.note_plural for note type referencesvocabulary.topic_map for MOC referencesvocabulary.templates for the templates folder pathops/config.yaml — processing depth
processing.depth: deep | standard | quickIf these files don't exist, use universal defaults.
Processing depth adaptation:
| Depth | Validation Behavior | |-------|---------------------| | deep | Full schema validation. All checks enabled including composability analysis and cross-reference verification | | standard | Full validation — all checks enabled | | quick | Basic schema validation only — required fields, YAML validity, enum values |
Target: $ARGUMENTS
Parse immediately:
--handoff: output RALPH HANDOFF block at endExecute these steps:
Determine which template applies to the target note:
type field in frontmatter — specialized types may have dedicated templatesops/templates/ or domain-specific path from derivation manifest)_schema block, read it — this is the authoritative schema definitionIf no template is found, use the default schema checks below.
Read the target note's full YAML frontmatter. Parse:
Run ALL validation checks. Each check produces PASS, WARN, or FAIL.
START NOW.
| Check | Rule | How to Verify |
|-------|------|---------------|
| description | Must exist and be non-empty | Check YAML frontmatter for description: field with non-empty value |
| Topics | Must link to at least one {DOMAIN:topic map} | Check for topics: in YAML or Topics: section in footer. Must contain at least one wiki link |
A missing required field is a hard failure. The note cannot pass validation without these.
| Check | Rule | How to Verify | |-------|------|---------------| | Length | Should be ~50-200 characters | Count characters in description value | | New information | Must add context beyond the title | Compare description text against filename/title — if semantically equivalent, WARN | | No trailing period | Convention: descriptions don't end with periods | Check last character | | Single sentence | Should be one coherent statement | Check for sentence-ending punctuation mid-description |
How to check "adds new info": Read the title (filename without .md). Read the description. If the description merely restates the title using different words, it fails this check. A good description adds one of:
Examples:
Bad (restates title):
vector proximity measures surface overlap not deep connectionGood (adds mechanism):
vector proximity measures surface overlap not deep connection| Check | Rule | How to Verify |
|-------|------|---------------|
| Frontmatter delimiters | Must start with --- on line 1 and close with --- | Read first line and scan for closing delimiter |
| Valid YAML | Must parse without errors | Check for common YAML errors: unquoted colons in values, mismatched quotes, bad indentation |
| No duplicate keys | Each YAML key appears only once | Scan for repeated field names |
| No unknown fields | Fields not in the template schema | Compare against _schema.required and _schema.optional if available — unknown fields get WARN |
If the note has fields with enumerated values, check them against the template's _schema.enums block:
| Field | Expected | Severity |
|-------|----------|----------|
| type | Values from template enum (e.g., claim, methodology, tension, problem, learning) | WARN |
| status | Values from template enum (e.g., preliminary, open, dissolved) | WARN |
| classification | Values from template enum (e.g., open, closed) | WARN |
| Custom domain fields | Values from template enum | WARN |
If a field has a value not in the enum list, report the invalid value and list the valid options.
| Check | Rule | How to Verify |
|-------|------|---------------|
| Body wiki-links | Each [[link]] should point to an existing file | Extract all [[...]] patterns from body, check each against file tree |
| Topics links | {DOMAIN:topic map} referenced in Topics must exist | Verify each topic wiki link resolves |
| Relevant notes links | Each note in relevant_notes must exist | Verify each wiki link in relevant_notes resolves |
| Backtick exclusion | Wiki links inside backticks are examples, not real links | Skip [[...]] patterns inside single or triple backtick blocks |
How to verify link resolution: For each [[link text]], check if a file named link text.md exists anywhere in the vault. Wiki links resolve by filename, not path.
| Check | Rule | Severity |
|-------|------|----------|
| Format | Array with context: ["[[note]] -- relationship"] | WARN |
| Context phrase present | Each entry should include -- or — followed by relationship description | WARN |
| Relationship type | Standard types: extends, foundation, contradicts, enables, example | INFO |
| No bare links | ["[[note]]"] without context is a bare link — useless for navigation | WARN |
| Check | Rule | How to Verify |
|-------|------|---------------|
| Title test | Can you complete "This note argues that [title]"? | Read the title as a sentence fragment — does it make a claim? |
| Specificity | Is the claim specific enough to disagree with? | Could someone reasonably argue the opposite? |
| Prose fitness | Would since [[title]] read naturally in another note? | Check if the title works as an inline wiki link |
Topic labels vs claims:
When validating all notes (target is "all" or "notes"):
Batch output format:
## Validation Summary
Checked: N notes
- PASS: M (X%)
- WARN: K (Y%)
- FAIL: J (Z%)
### FAIL Items (immediate attention)
| Note | Check | Detail |
|------|-------|--------|
| [[note]] | description | Missing |
| [[note]] | topics | No topics footer |
### Top WARN Patterns
- Description restates title: N notes
- Missing context phrases in relevant_notes: N notes
- Enum value not in template: N notes
### Notes Needing Attention
1. [[note]] — 2 FAIL, 1 WARN
2. [[note]] — 1 FAIL, 3 WARN
=== VALIDATION: [[note title]] ===
PASS:
- description: present, 147 chars, adds mechanism beyond title
- topics: ["[[topic-name]]"] — exists
- yaml: well-formed, valid delimiters
- composability: title works as prose ("This note argues that [title]")
WARN:
- relevant_notes: bare link without context phrase for [[note-x]]
- type: "observation" not in template enum (valid: claim, methodology, tension, problem, learning)
FAIL:
- (none)
Overall: PASS (2 warnings)
===
If WARN or FAIL items exist, include:
### Suggested Fixes
- **relevant_notes**: Add context phrase — e.g., `["[[note-x]] -- extends this by adding..."]`
- **type**: Change to valid enum value or propose adding "observation" to template
When invoked with --handoff, output this structured format at the END:
=== RALPH HANDOFF: validate ===
Target: [[note title]]
Work Done:
- Validated against [template name] schema
- Checks run: N
- Status: PASS | WARN | FAIL
Findings:
- PASS: [list]
- WARN: [list or "none"]
- FAIL: [list or "none"]
Files Modified:
- [task file path] (Validate section updated, if applicable)
Learnings:
- [Friction]: [description] | NONE
- [Surprise]: [description] | NONE
- [Methodology]: [description] | NONE
- [Process gap]: [description] | NONE
Queue Updates:
- Mark: validate done for this task
=== END HANDOFF ===
When a task file is in context (pipeline execution), update the ## Validate section:
## Validate
**Validated:** [UTC timestamp]
Schema check against [template name]:
- description: PASS (147 chars, adds mechanism beyond title)
- topics: PASS (["[[topic-name]]"])
- yaml: PASS (well-formed)
- type: not specified (optional)
- relevant_notes: WARN (bare link for [[note-x]])
- composability: PASS
Overall: PASS (1 warning)
| Level | Meaning | Action | |-------|---------|--------| | PASS | Meets requirement fully | None needed | | WARN | Optional issue or soft violation | Consider fixing, not blocking | | FAIL | Required field missing or invalid format | Must fix before verification passes | | INFO | Informational observation | No action needed |
FAIL blocks pipeline completion. A note with any FAIL-level issue should NOT be marked done in the queue. It stays at current_phase: "verify" (or "validate" if run standalone) for re-validation after fixes.
WARN does not block. Warnings are quality signals, not gates. A note can proceed through the pipeline with warnings.
never:
_schema blocks in templates when they existalways:
_schema as the authoritative source when availabletools
Apply plugin knowledge base updates to an existing generated system. Consults the Ars Contexta research graph for methodology improvements, proposes skill upgrades with research justification. Never auto-implements. Triggers on "/upgrade", "upgrade skills", "check for improvements", "update methodology".
documentation
Interactive walkthrough for new users. Learn by doing — each step creates real content in your vault. Three tracks (researcher, manager, personal) with a universal learning arc. Triggers on "/tutorial", "walk me through", "how do I use this".
testing
Scaffold a complete knowledge system. Detects platform, conducts conversation, derives configuration, generates everything. Validates against 15 kernel primitives. Triggers on "/setup", "/setup --advanced", "set up my knowledge system", "create my vault".
testing
Re-derive your knowledge system from first principles when structural drift accumulates. Analyzes dimension incoherence, vocabulary mismatch, boundary dissolution, and template divergence. Preserves all content while restructuring architecture.