okf:validate · v1.0 · 2026-06-27 · sha256 66a82a981274fe75

okf:validate v1.0A

Immutable. This exact content never changes and is served at /api/v1/blob/66a82a981274fe75.

---
name: okf:validate
version: "1.0"
description: >
  Validate an OKF bundle for conformance with the current spec. Usage: /okf:validate [bundle-path]
---

You are validating an OKF (Open Knowledge Format) bundle for conformance.

## 1. Setup

Determine the bundle root:
- If `$ARGUMENTS` contains a path, use it as the bundle root.
- Otherwise use the current working directory.

Find the OKF specification:
- Look for `SPEC.md` at the bundle root.
- If not found, search parent directories up to the filesystem root.
- If still not found, fetch it from the upstream repository:
  `https://raw.githubusercontent.com/GoogleCloudPlatform/knowledge-catalog/main/okf/SPEC.md`
- Extract the conformance rules from §9 of that file. This ensures validation always reflects the current version of the spec, not hardcoded rules.

If `SPEC.md` cannot be found or fetched, report the error and stop.

## 2. Scan the bundle

Collect all `.md` files in the bundle tree recursively. Classify each as:
- **Reserved**: filename is `index.md` or `log.md` (at any level).
- **Infrastructure**: `README.md` or `SPEC.md` located directly at the bundle root, or any file inside a hidden directory (path component starting with `.`, e.g. `.claude/`). These are not OKF concept files and must be silently skipped — do not validate them and do not report them as errors.
- **Concept**: all other `.md` files.

## 3. Hard conformance checks (errors — make the bundle non-conformant per §9)

For each **concept** file:
- [ ] File contains a valid YAML frontmatter block delimited by `---`.
- [ ] Frontmatter contains a non-empty `type` field.

For each **`index.md`**:
- [ ] Contains no frontmatter, EXCEPT the bundle-root `index.md` which MAY have frontmatter containing `okf_version`.
- [ ] Body uses the list format described in §6 (headings + bullet list of links).

For each **`log.md`**:
- [ ] Date headings are in ISO 8601 `YYYY-MM-DD` format as described in §7.

## 4. Soft checks (warnings — spec guidance, not hard requirements)

For each concept file:
- [ ] Has a `title` field (recommended).
- [ ] Has a `description` field (recommended).
- [ ] `timestamp`, if present, is a valid ISO 8601 datetime.
- [ ] Cross-links to other `.md` files within the bundle resolve to existing files.

For each directory:
- [ ] An `index.md` exists (not required, but recommended).
- [ ] All concept files in the directory are listed in the local `index.md`, when one exists.

## 5. Report

Print the report in this exact format:

```
OKF Validation Report
─────────────────────────────────────────
Bundle : <absolute bundle root path>
Spec   : OKF <version from SPEC.md, e.g. 0.1>
Scanned: <N> concept files, <M> reserved files

ERRORS (<count>)
  path/to/file.md — Missing frontmatter
  path/to/file.md — Missing required field: type
  path/to/index.md — Frontmatter present on non-root index

WARNINGS (<count>)
  path/to/file.md — Missing recommended field: title
  path/to/file.md — Broken link → ./missing.md
  tables/ — index.md missing entries for: orders.md, customers.md

RESULT: ✓ Conformant   (or)   ✗ Not conformant — <N> error(s)
Skill version : 1.0
```

## 6. Offer to fix

After reporting:
- If there are **errors**: ask the user whether to fix them automatically (add missing frontmatter skeleton with a placeholder `type: Unknown`, fix malformed date headings in log.md, etc.). Apply fixes only with user approval.
- If there are only **warnings**: offer to auto-fix safe ones (add missing `index.md` entries, sort log entries by date descending). Apply only with user approval.
- If the bundle has a git repository at its root, after any fixes offer to stage and commit the changes with a message like `fix: OKF conformance corrections (okf:validate)`.

## 7. Write invocation log

Follow `okf:_okf-skill-write-log` with:
- `skill`: `okf:validate`, `version`: `1.0`
- `bundle`: absolute path to the bundle root validated
- `outcome`: `success`
- `concepts_added`: `null`
- `concepts_updated`: `null`
- `concepts_split`: `null`
- `conflicts`: `null`
- `note`: `"Conformant"` if the bundle passed all hard checks; `"Not conformant — <N> error(s)"` otherwise