2026-08-23 22:07:38 -03:00
{
"$schema" : "https://json-schema.org/draft/2020-12/schema" ,
"$id" : "https://hermes.bstein.dev/contracts/hux/v1/citation.schema.json" ,
"title" : "HUX sources, passages, citations, research notebook" ,
"description" : "Research model (HUX-08). A source is where evidence came from; a passage is the exact excerpt; a citation ties a claim in a message to passages with an explicit support verdict; a notebook collects them per research question with assumptions and unresolved questions kept visible." ,
"$defs" : {
"source" : {
"type" : "object" ,
"additionalProperties" : false ,
2026-08-24 00:04:37 -03:00
"required" : [
"schema" ,
"id" ,
"kind" ,
"title" ,
"classification" ,
"retrieved_at"
] ,
2026-08-23 22:07:38 -03:00
"properties" : {
2026-08-24 00:04:37 -03:00
"schema" : {
"const" : "hux.source.v1"
} ,
"id" : {
"$ref" : "common.schema.json#/$defs/id"
} ,
"kind" : {
"type" : "string" ,
"enum" : [
"web" ,
"document" ,
"artifact" ,
"memory" ,
"tool_output" ,
"dataset"
]
} ,
"uri" : {
"type" : "string" ,
"maxLength" : 2000
} ,
"title" : {
"type" : "string" ,
"minLength" : 1 ,
"maxLength" : 300
} ,
"publisher" : {
"type" : "string" ,
"maxLength" : 200
} ,
"published_at" : {
"$ref" : "common.schema.json#/$defs/timestamp"
} ,
"retrieved_at" : {
"$ref" : "common.schema.json#/$defs/timestamp"
} ,
"classification" : {
"type" : "string" ,
"enum" : [
"primary" ,
"secondary" ,
"unknown"
]
} ,
"content_hash" : {
"$ref" : "common.schema.json#/$defs/sha256"
} ,
"provenance" : {
"$ref" : "common.schema.json#/$defs/provenance"
} ,
"dedupe_key" : {
"type" : "string" ,
"description" : "Stable key used to merge duplicates: sha256 of normalised uri (source), of source_id+text hash (passage), of message_id+claim+passages (citation)." ,
"pattern" : "^sha256:[0-9a-f]{64}$"
2026-08-24 00:27:38 -03:00
} ,
"revision" : {
"$ref" : "common.schema.json#/$defs/revision"
2026-08-24 00:04:37 -03:00
}
2026-08-23 22:07:38 -03:00
}
} ,
"passage" : {
"type" : "object" ,
"additionalProperties" : false ,
2026-08-24 00:04:37 -03:00
"required" : [
"schema" ,
"id" ,
"source_id" ,
"text" ,
"hash"
] ,
2026-08-23 22:07:38 -03:00
"properties" : {
2026-08-24 00:04:37 -03:00
"schema" : {
"const" : "hux.passage.v1"
} ,
"id" : {
"$ref" : "common.schema.json#/$defs/id"
} ,
"source_id" : {
"$ref" : "common.schema.json#/$defs/id"
} ,
"text" : {
"type" : "string" ,
"minLength" : 1 ,
"maxLength" : 4000
} ,
"hash" : {
"$ref" : "common.schema.json#/$defs/sha256"
} ,
2026-08-23 22:07:38 -03:00
"locator" : {
"type" : "object" ,
"additionalProperties" : false ,
"properties" : {
2026-08-24 00:04:37 -03:00
"page" : {
"type" : "integer" ,
"minimum" : 1
} ,
"selector" : {
"type" : "string" ,
"maxLength" : 500
} ,
"line_start" : {
"type" : "integer" ,
"minimum" : 1
} ,
"line_end" : {
"type" : "integer" ,
"minimum" : 1
} ,
"char_start" : {
"type" : "integer" ,
"minimum" : 0
} ,
"char_end" : {
"type" : "integer" ,
"minimum" : 0
}
2026-08-23 22:07:38 -03:00
}
2026-08-24 00:04:37 -03:00
} ,
"dedupe_key" : {
"type" : "string" ,
"description" : "Stable key used to merge duplicates: sha256 of normalised uri (source), of source_id+text hash (passage), of message_id+claim+passages (citation)." ,
"pattern" : "^sha256:[0-9a-f]{64}$"
2026-08-24 00:27:38 -03:00
} ,
"revision" : {
"$ref" : "common.schema.json#/$defs/revision"
2026-08-23 22:07:38 -03:00
}
}
} ,
"citation" : {
"type" : "object" ,
"additionalProperties" : false ,
2026-08-24 00:04:37 -03:00
"required" : [
"schema" ,
"id" ,
"message_id" ,
"claim" ,
"passage_ids" ,
"support"
] ,
2026-08-23 22:07:38 -03:00
"properties" : {
2026-08-24 00:04:37 -03:00
"schema" : {
"const" : "hux.citation.v1"
} ,
"id" : {
"$ref" : "common.schema.json#/$defs/id"
} ,
"message_id" : {
"type" : "string" ,
"minLength" : 1 ,
"maxLength" : 120
} ,
"claim" : {
"type" : "string" ,
"minLength" : 1 ,
"maxLength" : 1000
} ,
"passage_ids" : {
"type" : "array" ,
"minItems" : 1 ,
"maxItems" : 32 ,
"uniqueItems" : true ,
"items" : {
"$ref" : "common.schema.json#/$defs/id"
}
} ,
"support" : {
"type" : "string" ,
"enum" : [
"supports" ,
"partially_supports" ,
"contradicts" ,
"unverified"
]
} ,
"note" : {
"type" : "string" ,
"maxLength" : 500
} ,
"dedupe_key" : {
"type" : "string" ,
"description" : "Stable key used to merge duplicates: sha256 of normalised uri (source), of source_id+text hash (passage), of message_id+claim+passages (citation)." ,
"pattern" : "^sha256:[0-9a-f]{64}$"
2026-08-24 00:27:38 -03:00
} ,
"revision" : {
"$ref" : "common.schema.json#/$defs/revision"
2026-08-24 00:04:37 -03:00
}
2026-08-23 22:07:38 -03:00
}
} ,
"notebook" : {
"type" : "object" ,
"additionalProperties" : false ,
2026-08-24 00:04:37 -03:00
"required" : [
"schema" ,
"id" ,
"conversation_id" ,
"question" ,
"status" ,
"source_ids" ,
"passage_ids" ,
"citation_ids" ,
"assumptions" ,
"unresolved_questions" ,
"updated_at" ,
"notes" ,
"revision"
] ,
2026-08-23 22:07:38 -03:00
"properties" : {
2026-08-24 00:04:37 -03:00
"schema" : {
"const" : "hux.research_notebook.v1"
} ,
"id" : {
"$ref" : "common.schema.json#/$defs/id"
} ,
"conversation_id" : {
"$ref" : "common.schema.json#/$defs/id"
} ,
"question" : {
"type" : "string" ,
"minLength" : 1 ,
"maxLength" : 1000
} ,
"status" : {
"type" : "string" ,
"enum" : [
"open" ,
"answered" ,
"abandoned"
]
} ,
"source_ids" : {
"type" : "array" ,
"uniqueItems" : true ,
"items" : {
"$ref" : "common.schema.json#/$defs/id"
}
} ,
"passage_ids" : {
"type" : "array" ,
"uniqueItems" : true ,
"items" : {
"$ref" : "common.schema.json#/$defs/id"
}
} ,
"citation_ids" : {
"type" : "array" ,
"uniqueItems" : true ,
"items" : {
"$ref" : "common.schema.json#/$defs/id"
}
} ,
"assumptions" : {
"type" : "array" ,
"maxItems" : 64 ,
"items" : {
"type" : "string" ,
"minLength" : 1 ,
"maxLength" : 500
}
} ,
"unresolved_questions" : {
"type" : "array" ,
"maxItems" : 64 ,
"items" : {
"type" : "string" ,
"minLength" : 1 ,
"maxLength" : 500
}
} ,
"updated_at" : {
"$ref" : "common.schema.json#/$defs/timestamp"
} ,
"notes" : {
"type" : "array" ,
"maxItems" : 128 ,
"items" : {
"type" : "object" ,
"additionalProperties" : false ,
"required" : [
"at" ,
"text"
] ,
"properties" : {
"at" : {
"$ref" : "common.schema.json#/$defs/timestamp"
} ,
"text" : {
"type" : "string" ,
"minLength" : 1 ,
"maxLength" : 2000
} ,
"source_id" : {
"$ref" : "common.schema.json#/$defs/id"
}
}
}
} ,
"revision" : {
"$ref" : "common.schema.json#/$defs/revision"
}
2026-08-23 22:07:38 -03:00
}
}
} ,
"oneOf" : [
2026-08-24 00:04:37 -03:00
{
"$ref" : "#/$defs/source"
} ,
{
"$ref" : "#/$defs/passage"
} ,
{
"$ref" : "#/$defs/citation"
} ,
{
"$ref" : "#/$defs/notebook"
}
2026-08-23 22:07:38 -03:00
]
}