Spec-driven development on OpenSpec, with mechanical spec-as-source enforcement: a custom 'spec-as-source' OpenSpec schema adds file-ownership (targets) and test-verification ([@test]) metadata to every capability spec, three scripts (link check, ownership check, manifest build) keep code and specs from drifting apart, plus requirement-gathering, spec-writer, work-review, and a session-handoff skill with a proactive context-warning hook and a packaged handoff memory: the skill ships the exporter, importer, graph model, facts pipeline, Neo4j Compose runtime and operating guide to load handoffs into a local, authenticated Neo4j graph and query them.
68
85%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Low
Low-risk findings worth noting
{
"$comment": "GENERATED FROM SPEC — DO NOT EDIT DIRECTLY; Source: openspec/specs/handoff-graph-export/spec.md",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://example.invalid/handoff-graph-export-v2.schema.json",
"title": "Handoff graph export v2",
"type": "object",
"required": [
"schema_version",
"project",
"session",
"handoff",
"source",
"metadata_profile",
"metadata_origin",
"metadata",
"records"
],
"additionalProperties": false,
"properties": {
"schema_version": {
"type": "integer",
"enum": [
2
]
},
"project": {
"type": "object",
"required": [
"id",
"project_id"
],
"additionalProperties": false,
"properties": {
"id": {
"type": "string",
"pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"
},
"project_id": {
"type": "string",
"minLength": 1
}
}
},
"session": {
"type": "object",
"required": [
"id"
],
"additionalProperties": false,
"properties": {
"id": {
"type": "string",
"pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"
}
}
},
"handoff": {
"type": "object",
"required": [
"id",
"filename"
],
"additionalProperties": false,
"properties": {
"id": {
"type": "string",
"pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"
},
"filename": {
"type": "string",
"pattern": "^HANDOFF-[0-9]+\\.md$"
}
}
},
"source": {
"type": "object",
"required": [
"directory",
"file",
"collection"
],
"additionalProperties": false,
"properties": {
"directory": {
"type": "string",
"minLength": 1
},
"file": {
"type": "string",
"pattern": "^HANDOFF-[0-9]+\\.md$"
},
"collection": {
"type": [
"string",
"null"
],
"minLength": 1
}
}
},
"metadata_profile": {
"type": "string",
"enum": [
"new",
"historical"
]
},
"metadata_origin": {
"type": "string",
"enum": [
"frontmatter",
"meta",
"frontmatter+meta"
]
},
"metadata": {
"type": "object",
"required": [
"handoff",
"project_id",
"date",
"continues",
"agent_session",
"parent_session",
"operator",
"client",
"work_context",
"track",
"plan_entry",
"change",
"deadline"
],
"additionalProperties": false,
"properties": {
"handoff": {
"type": "string",
"pattern": "^HANDOFF-[0-9]+$"
},
"project_id": {
"type": "string",
"minLength": 1
},
"date": {
"type": [
"string",
"null"
],
"pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}(T[0-9]{2}:[0-9]{2}(:[0-9]{2}(\\.[0-9]+)?)?(Z|[+-][0-9]{2}:[0-9]{2})?)?$"
},
"continues": {
"type": [
"string",
"null"
],
"pattern": "^HANDOFF-[0-9]+$"
},
"agent_session": {
"type": [
"string",
"null"
],
"minLength": 1
},
"parent_session": {
"type": [
"string",
"null"
],
"minLength": 1
},
"operator": {
"type": "object",
"required": [
"person",
"provider",
"models"
],
"additionalProperties": false,
"properties": {
"person": {
"type": [
"string",
"null"
],
"minLength": 1
},
"provider": {
"type": [
"string",
"null"
],
"minLength": 1
},
"models": {
"type": [
"array",
"null"
],
"items": {
"type": "string",
"minLength": 1
}
}
}
},
"client": {
"type": [
"string",
"null"
],
"minLength": 1
},
"work_context": {
"type": [
"array",
"null"
],
"items": {
"type": "string",
"minLength": 1
}
},
"track": {
"type": [
"string",
"null"
],
"minLength": 1
},
"plan_entry": {
"type": [
"string",
"null"
],
"minLength": 1
},
"change": {
"type": [
"string",
"null"
],
"minLength": 1
},
"deadline": {
"type": [
"string",
"null"
],
"minLength": 1
}
}
},
"records": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"type",
"text",
"provenance"
],
"additionalProperties": false,
"properties": {
"id": {
"type": "string",
"pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"
},
"type": {
"type": "string",
"enum": [
"decision",
"durable_fact",
"next_action",
"failure"
]
},
"text": {
"type": "string",
"minLength": 1
},
"provenance": {
"type": "object",
"required": [
"file",
"section",
"directory"
],
"additionalProperties": false,
"properties": {
"file": {
"type": "string",
"pattern": "^HANDOFF-[0-9]+\\.md$"
},
"section": {
"type": "string",
"minLength": 1
},
"directory": {
"type": "string",
"minLength": 1
}
}
}
}
}
}
}
}.tessl-plugin
rules
skills
handoff
handoff-skill
openspec-apply-change
openspec-archive-change
openspec-explore
openspec-propose
openspec-sync-specs
plan-judge
plan-mode
prompt-engineer
prompt-loop
requirement-gathering
spec-as-source-setup
templates
openspec-schema
spec-as-source
templates
spec-ci-sync
spec-loop
spec-rebuild
spec-verify
spec-writer
work-review