You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Soliciting feedback on a draft schema that defines the universal frontmatter / top-level JSON convention for all artifacts produced by and ingested into the claude-skills plugin. This schema is load-bearing for v0.5.0+ — adapter authors, memory system consumers, and Workflow Profile evidence artifacts all conform to it.
Why this matters
Every artifact the plugin produces or ingests — backend adapter output (Jira tickets, GitHub issues, Notion pages, local markdown), Workflow Profile evidence (review verdicts, merge decisions), memory system nodes (dialectical, procedural, episodic), article production artifacts, external source adapters (Slack, email, PDF) — carries the same universal fields. One contract, two serializations (YAML frontmatter for markdown files, top-level JSON for structured artifacts).
The bet: if the schema is right, adapter authors can write against a stable contract. Memory retrieval, audit walks, GRC tooling, and cross-system interop all traverse schema-conformant content with one parser. If the schema is wrong, every consumer rewrites their own.
What I'm asking for
Most valuable feedback is from anyone who would (or has) authored an adapter against an external system. Specifically:
Missing fields. What external-system metadata does your adapter need to preserve that the current schema doesn't capture?
Friction points. Is there a field that will be hard to populate from real-world external sources?
Type discriminator vocabulary. Does the type / subtype list match what you'd produce? Anything missing or over-specified?
Ingestion extension (original_metadata). Per-subtype sub-schema (I recommend this) vs. free-form object?
Confidence derivation. Currently arbitrary 0.0–1.0. How would you calibrate it for your source?
The two serializations (YAML frontmatter + top-level JSON) question. Any tooling concerns?
Status: Draft Created: 2026-04-21 Author: Jeff Smolinski
Purpose
A universal frontmatter convention that every artifact in the claude-skills ecosystem conforms to. One contract, two serializations (YAML frontmatter for markdown files, top-level JSON for structured artifacts), many consumers.
Why this is load-bearing:
Ingestion: external sources (Notion, Jira, Confluence, GitHub, Slack, email, PDFs) are normalized to the base schema by adapters. No adapter = no ingestion. No schema = no adapters.
Interop: memory retrieval, audit walks, compliance tooling, and external integrations all traverse schema-conformant content. One parser serves all.
Decoupling: consumers (memory system, Workflow Profile, article cycle) don't depend on each other — they depend on the schema. Substrate changes without rewrites.
Why this is a v0.5.0 prerequisite:
Layer 1 adapters (Chunk 1, #119) read/write tickets and docs to external systems. Those reads and writes need a target/source format. The base schema is that format. Chunk 1 cannot meaningfully land without the schema being defined first.
New types may be added over time. Consumers MUST ignore unknown type values rather than erroring.
Type-Specific Extensions
Fields below are appended to the universal set when type matches.
dialectical
thesis: slug-or-identifierthesis_statement: "Prose form of the thesis"thesis_src: path/to/source/or/session-refantithesis: slug-or-identifierantithesis_statement: "Prose form of the antithesis"antithesis_src: path/to/source/or/session-refsynthesis: "Prose form of the resolution"defeated_position: "What was rejected and why"evidence: path/to/supporting/evidence.mdresolved: 2026-04-21# Date the synthesis was reachededge_type: resolved_via_synthesis | superseded | in_tension
procedural
Base procedural extension:
applies_to: [discovery, planning, execution] # Phases/contexts where this appliessupersedes: null | <id> # If this replaces an earlier versionreview_cadence: per-epic | per-sprint | annual | ad-hoc
origin_url: https://notion.so/... # Or non-URL ref if no URL existsorigin_format: notion-page # Matches one of the ingested subtypesoriginal_metadata: # Preserves external structured data verbatimnotion_page_id: abc123notion_last_edited: 2026-04-20T10:00:00Znotion_author: user@example.comingestion_date: 2026-04-21ingestion_adapter: notion-adapter@1.2.0 # Which adapter produced this artifact
Promotion rule: artifacts with sensitivity: client-confidential or restricted MUST be sanitized (engagement-specific IDs stripped, client identifiers removed, roles substituted for specifics) before any content is promoted to a general vault. The /promote command is responsible for enforcing this rule.
Sanitization output: a new artifact with sensitivity: internal (or public if further cleared), referencing the original only by workstream and date — never by client name or asset ID.
Provenance: the source Field
Every artifact records its origins. source is an array (artifacts can have multiple upstream sources).
type — matches the ingested subtype vocabulary or one of local-markdown, session, skill-output, derived
Derived content (e.g., a runbook distilled from process notes) records its upstream process-notes files as sources.
Cache / Staleness
Two orthogonal mechanisms:
TTL (absolute expiration):ttl: 2026-10-21 means the artifact should be re-validated after that date. ttl: never means no automatic expiration.
Cache key (content-derived invalidation):cache_key is a hash (typically SHA-256) of the relevant source refs. When any source changes, consumers recompute the expected cache_key; mismatch flags the artifact as potentially stale regardless of TTL.
Typical usage:
Raw ingested content: ttl: 2026-10-21, cache_key derived from external version/etag
Dialectical nodes: ttl: never (resolved decisions persist), cache_key derived from thesis/antithesis sources
Derived specs / runbooks: ttl: per-epic-cadence, cache_key derived from upstream dialectical and process-note refs
Process notes: ttl: never, cache_key bumped on each entry
Stale-content handling is the consumer's responsibility. A retrieval layer may de-rank stale artifacts; a spec pipeline may refuse to use them; an audit walk may surface them for review.
Two Serializations
YAML Frontmatter (markdown files)
Standard --- fenced YAML at the top of .md files:
---id: dialectical-websockets-for-realtime-synctype: dialecticalsubtype: nodeschemaVersion: "1"created: 2026-04-15updated: 2026-04-15sensitivity: internaltags: [realtime, transport, architecture]project: acme-paymentsworkstream: acme-payments-apisession: 2026-04-15-session-42confidence: 0.92style: atomicpromoted_to_general: falsettl: nevercache_key: sha256:abc...source:
- ref: raw/specs/realtime-sync.mdtype: local-markdownthesis: websockets-for-realtime-syncthesis_statement: "WebSockets are the right transport for real-time sync"# ... full dialectical extension ...---# Dialectical Node: WebSockets for Real-Time Sync
(body content goes here)
Top-Level JSON (structured artifacts)
Universal and type-specific fields live as top-level keys in the JSON:
A JSON Schema describing this base schema and its extensions SHALL be maintained alongside this document.
Adapter obligations:
Adapters MUST emit conformant artifacts. Validation is part of the adapter contract.
Adapters MUST fail loudly if they cannot produce a conformant artifact from an input.
Adapters SHOULD preserve external structured data in original_metadata for round-trip fidelity.
Consumer permissions:
Consumers MAY rely on conformance — no need to handle missing universal fields.
Consumers SHOULD ignore unknown type-specific fields (forward compatibility).
Consumers MUST ignore unknown type values rather than erroring.
Schema Versioning
schemaVersion: "1" is the initial release.
Breaking changes bump the version. Artifacts retain their original schemaVersion.
Consumers SHOULD be version-aware: either handle multiple versions explicitly or refuse to consume unsupported versions.
Migrations between versions are scripted; a migration tool walks the vault, rewrites frontmatter/JSON, and bumps schemaVersion + updated.
Open Questions
Confidence score derivation. The confidence: 0.0–1.0 field is currently arbitrary. Before any promotion logic relies on it, a calibration rule is needed. Candidates: evidence-weighted score from the-fool's evidence audit; agent-reviewer consensus; elapsed time since last challenge; human calibration rating. Unscoped.
original_metadata schema per ingested subtype. Should each subtype (notion-page, jira-ticket, etc.) have its own sub-schema for original_metadata, or is it a free-form object? Recommend per-subtype sub-schemas so adapters can validate their output and consumers can query known fields.
Non-textual content. Images, PDFs, binary attachments — do they live alongside the markdown (as referenced files) or are they represented as schema artifacts with type: ingested? Recommend the former for most cases; schema only when the binary IS the artifact.
External adapter registry. How do third-party adapters declare themselves to the system? A manifest file? A convention-based directory scan? TBD.
ID stability and migration.id is supposed to be stable across edits, but what happens when a vault is renamed or a project is merged with another? Recommend: IDs are stable within a vault scope; merge operations generate redirect records. Unscoped for v1.
How to respond
Field-level feedback: quote the field + line and propose a change
Structural feedback: top-level comment
"I'll write an adapter against this": comment saying which external system and I'll circle back for a test integration
Thanks for reading. This is a sketch — pushback is the point.
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
Soliciting feedback on a draft schema that defines the universal frontmatter / top-level JSON convention for all artifacts produced by and ingested into the claude-skills plugin. This schema is load-bearing for v0.5.0+ — adapter authors, memory system consumers, and Workflow Profile evidence artifacts all conform to it.
Why this matters
Every artifact the plugin produces or ingests — backend adapter output (Jira tickets, GitHub issues, Notion pages, local markdown), Workflow Profile evidence (review verdicts, merge decisions), memory system nodes (dialectical, procedural, episodic), article production artifacts, external source adapters (Slack, email, PDF) — carries the same universal fields. One contract, two serializations (YAML frontmatter for markdown files, top-level JSON for structured artifacts).
The bet: if the schema is right, adapter authors can write against a stable contract. Memory retrieval, audit walks, GRC tooling, and cross-system interop all traverse schema-conformant content with one parser. If the schema is wrong, every consumer rewrites their own.
What I'm asking for
Most valuable feedback is from anyone who would (or has) authored an adapter against an external system. Specifically:
type/subtypelist match what you'd produce? Anything missing or over-specified?original_metadata). Per-subtype sub-schema (I recommend this) vs. free-form object?What's out of scope
Draft schema
Base Schema: Universal Frontmatter Convention
Status: Draft
Created: 2026-04-21
Author: Jeff Smolinski
Purpose
A universal frontmatter convention that every artifact in the claude-skills ecosystem conforms to. One contract, two serializations (YAML frontmatter for markdown files, top-level JSON for structured artifacts), many consumers.
Why this is load-bearing:
Why this is a v0.5.0 prerequisite:
Layer 1 adapters (Chunk 1, #119) read/write tickets and docs to external systems. Those reads and writes need a target/source format. The base schema is that format. Chunk 1 cannot meaningfully land without the schema being defined first.
Architecture
Universal Fields (required in every artifact)
Every schema-conformant artifact MUST carry these fields, regardless of type or serialization.
idtypeschemaVersion"1".createdupdatedsourcesensitivityA file missing any of these is non-conformant. Consumers MAY reject non-conformant input.
Strongly Recommended Fields
Most artifacts should carry these. Consumers rely on them for retrieval, indexing, and promotion.
subtypettl"never"cache_keytagsprojectnullnullfor general-vault / cross-project content.workstreamnullsessionnullconfidencestyleatomicorlogatomic= one subject per file;log= chronological write-append.promoted_to_generalType Discriminators
Top-level
typevalues and their defined subtypes:typedialecticalnode(default),decision,architectureproceduralrunbook,playbook,process-notes,rulesemanticdefinition,concept,entityepisodicsession-log,event,observationarticle-artifactraw-material,whirlybird,outline,draft,judge-report,fool-report,final-draftworkflow-evidenceimpl-plan,review-verdict,qa-verdict,merge-decision,compliance-artifact,test-resultsfeaturespec,requirementsdecisionadr,decision-recordtopicstub,canonicalingestednotion-page,confluence-page,jira-ticket,github-issue,github-pr,slack-message,email,pdf,urlNew types may be added over time. Consumers MUST ignore unknown
typevalues rather than erroring.Type-Specific Extensions
Fields below are appended to the universal set when
typematches.dialecticalproceduralBase procedural extension:
Subtype
process-notes(chronological workstream log):Subtype
runbook:Subtype
playbook:article-artifactworkflow-evidenceingestedSensitivity Levels
publicinternalclient-confidentialrestrictedPromotion rule: artifacts with
sensitivity: client-confidentialorrestrictedMUST be sanitized (engagement-specific IDs stripped, client identifiers removed, roles substituted for specifics) before any content is promoted to a general vault. The/promotecommand is responsible for enforcing this rule.Sanitization output: a new artifact with
sensitivity: internal(orpublicif further cleared), referencing the original only by workstream and date — never by client name or asset ID.Provenance: the
sourceFieldEvery artifact records its origins.
sourceis an array (artifacts can have multiple upstream sources).Each
sourceentry carries:ref— string identifier (path, URL, ticket key, session ID, tool name)type— matches theingestedsubtype vocabulary or one oflocal-markdown,session,skill-output,derivedDerived content (e.g., a runbook distilled from process notes) records its upstream process-notes files as sources.
Cache / Staleness
Two orthogonal mechanisms:
TTL (absolute expiration):
ttl: 2026-10-21means the artifact should be re-validated after that date.ttl: nevermeans no automatic expiration.Cache key (content-derived invalidation):
cache_keyis a hash (typically SHA-256) of the relevant source refs. When any source changes, consumers recompute the expected cache_key; mismatch flags the artifact as potentially stale regardless of TTL.Typical usage:
ttl: 2026-10-21,cache_keyderived from external version/etagttl: never(resolved decisions persist),cache_keyderived from thesis/antithesis sourcesttl: per-epic-cadence,cache_keyderived from upstream dialectical and process-note refsttl: never,cache_keybumped on each entryStale-content handling is the consumer's responsibility. A retrieval layer may de-rank stale artifacts; a spec pipeline may refuse to use them; an audit walk may surface them for review.
Two Serializations
YAML Frontmatter (markdown files)
Standard
---fenced YAML at the top of.mdfiles:Top-Level JSON (structured artifacts)
Universal and type-specific fields live as top-level keys in the JSON:
{ "id": "TICKET-123-review-verdict", "type": "workflow-evidence", "subtype": "review-verdict", "schemaVersion": "1", "created": "2026-04-21T14:00:00Z", "updated": "2026-04-21T14:00:00Z", "sensitivity": "internal", "tags": ["review", "TICKET-123"], "project": "acme-payments", "workstream": "acme-payments-api", "session": "2026-04-21-session-42", "ttl": "never", "cache_key": "sha256:def...", "source": [ {"ref": "git-diff:TICKET-123", "type": "derived"}, {"ref": "test-results.json", "type": "derived"} ], "ticket": "TICKET-123", "phase": "review", "verdict": "blocking", "findings": [ {"severity": "blocking", "category": "security", "description": "..."} ] }Validation and Conformance
A JSON Schema describing this base schema and its extensions SHALL be maintained alongside this document.
Adapter obligations:
original_metadatafor round-trip fidelity.Consumer permissions:
typevalues rather than erroring.Schema Versioning
schemaVersion: "1"is the initial release.schemaVersion.schemaVersion+updated.Open Questions
Confidence score derivation. The
confidence: 0.0–1.0field is currently arbitrary. Before any promotion logic relies on it, a calibration rule is needed. Candidates: evidence-weighted score from the-fool's evidence audit; agent-reviewer consensus; elapsed time since last challenge; human calibration rating. Unscoped.Promotion threshold(s).
promoted_to_general: truegating uses a confidence threshold (0.85suggested). Needs calibration alongside Add GraphQL Expert skill #1.original_metadataschema per ingested subtype. Should each subtype (notion-page,jira-ticket, etc.) have its own sub-schema fororiginal_metadata, or is it a free-form object? Recommend per-subtype sub-schemas so adapters can validate their output and consumers can query known fields.Non-textual content. Images, PDFs, binary attachments — do they live alongside the markdown (as referenced files) or are they represented as schema artifacts with
type: ingested? Recommend the former for most cases; schema only when the binary IS the artifact.External adapter registry. How do third-party adapters declare themselves to the system? A manifest file? A convention-based directory scan? TBD.
ID stability and migration.
idis supposed to be stable across edits, but what happens when a vault is renamed or a project is merged with another? Recommend: IDs are stable within a vault scope; merge operations generate redirect records. Unscoped for v1.How to respond
Thanks for reading. This is a sketch — pushback is the point.
All reactions