{
  "schema_version": 1,
  "description": "Hanging Context public data snapshots. Each window JSON provides top-level context for agents: visual panels have JSON twins, claims are sourced to primary primitives, and rolling-window fields are built for reasoning systems. Fields may be added at the same schema_version; renames or semantic changes bump the version.",
  "fields": {
    "window": "Window name, e.g. '24h' | '7d'",
    "window_label": "Human-readable label",
    "window_days": "Integer day count",
    "window_hours": "Exact rolling window length in hours, e.g. 24 or 168",
    "window_coverage": "Window coverage mode; rolling windows use 'rolling'",
    "snapshot_kind": "Optional payload kind. windows/<window>.home.json uses 'homepage_render', windows/<window>.buyer.json uses 'buyer_lenses_render', windows/<window>.tags.json uses 'public_tag_terrain_render', and windows/<window>.entities.json uses 'primitive_leaderboard_render'. Render payloads keep page-specific public arrays while omitting unrelated heavyweight fields.",
    "full_snapshot": "Present on some render payloads; points to the complete public window JSON.",
    "omitted_fields": "Present on homepage render payloads; names fields available only in full_snapshot.",
    "buyer_lenses_file": "Present on data/index.json window entries; points to the lightweight buyer-lenses render payload for that window.",
    "tag_terrain_file": "Present on data/index.json window entries; points to the public-safe narrative terrain payload for that window.",
    "entities_file": "Present on data/index.json window entries; points to the lightweight primitive leaderboard and stream-relationship render payload for that window.",
    "range": "{start, end} ISO-8601 UTC timestamps",
    "as_of": "When this snapshot was generated (ISO-8601 UTC)",
    "refresh_analysis": "Deterministic comparison against the previous on-disk refresh: {kind, comparison_basis, previous_as_of, elapsed_hours, summary, panel_changes}. Comparison basis is rolling_window_vs_previous_build, not disjoint cadence slices.",
    "claims_by_day_analysis": "Deterministic rebuild note for the volume chart: {kind, comparison_basis, generated_at, range, summary, paragraphs, metrics}. Regenerated with every 12-hour build and written as a short monitoring note about context graph movement, active domains, leading streams, source channels, source formats, and primitive activity.",
    "totals": "Counts of claims, manifests, records, entities, sources, domains",
    "claims_by_day": "Array of {day, claims}. Entries are aligned to claim.published_date, a DATE column; 7d uses seven observed source dates and 24h uses the latest source-published date.",
    "top_entities": "Ranked entities by claim count: complete for rolling windows unless an explicit build limit is configured; capped at the monthly primitive limit when monthly snapshots are built with --monthly-primitives. Shape: {tag_id, name, type, claim_count, slug=<kebab(name)>-<type>}",
    "top_sources": "Ranked sources by claim count, complete for the rolling window unless an explicit build limit is configured: {source_name, source_display, claim_count, record_count, manifest_count}. source_name is the raw source key; source_display is the cleaned/public label.",
    "top_streams": "Ranked streams by claim count, complete for the rolling window unless an explicit build limit is configured: {stream_id, stream_slug, stream_display, claim_count, channels: [{channel_slug, channel_display, claim_count}]}. Claims matching >1 stream count in each.",
    "stream_trend": "Per-bucket claim counts for every ranked stream. Keyed by str(stream_id): [{day, claims}]. Powers the stream panel trend direction labels.",
    "stream_filter_shapes": "{dimensions: [{key, label}], streams: [{stream_id, stream_slug, stream_display, claim_count, manifest_count, breakdowns: {confidence: [{value, label, claim_count}], evidence: [...], featured: [...]}, filters: {source_channel: [{value, label, manifest_count, claim_count, breakdowns: {...}, examples: [{claim_id, text, source, source_url, source_channel_display, published_date, confidence, evidence_type, featured, media_type, claim_type}]}], media_type: [...], claim_type: [...]}}]}. Homepage stream-filter explorer: click a stream, then click a filter bucket to inspect breakdowns and example claims.",
    "primitive_scope": "Monthly snapshots only: documents whether top_entities, tag_terrain, and stream_tag_graph were built for the file. The 12-hour current-month hot rebuild skips monthly primitives; closed-month finalizers/backfills can include top_entities with --monthly-primitives while graph-like relationship fields remain rolling-window only.",
    "stream_tag_graph": "{streams: [{stream_id, stream_slug, stream_display, manifest_count}], tags: [{tag_id, name, type, slug=<kebab(name)>-<type>, manifest_count}], edges: [{stream_id, tag_id, manifest_count}]}. Homepage network: streams on one side, canonical org/person/place/topic tags on the other.",
    "buyer_lenses": "{window_label, generated_at, lenses:[{id, slug, kicker, title, card_title, card_sub, hero_kind, summary, domains:[home_domain], topic_pack:[{slug,name}], metrics:{claims,manifests,sources,organizations}, claims_by_day:[{day,claims}], source_cohorts:[{key,label,claim_count,manifest_count,source_count}], cohort_mix:{label:claim_count}, cohort_topic_matrix:{cohort_label:{topic_name:claim_count}}, top_sources:[{source_name,source_display,cohort,cohort_label,claim_count,record_count,manifest_count}], top_organizations:[{tag_id,slug,name,claim_count,manifest_count}], top_topics:[{tag_id,slug,name,claim_count,manifest_count,is_seed}], org_topic_graph:{stream_label,streams:[source streams],tags:[organization|person|place|topic primitives],edges:[stream-to-primitive manifest counts]}, sample_claims:[{claim_id,text,source,source_display,source_url,published_date,confidence,evidence_type,domain,cohort,cohort_label,topics:[name],organizations:[name]}]}]}. Buyer-facing drilldowns built from domain + canonical topic packs + derived source cohorts. Ranked arrays and org_topic_graph are complete for the matched lens window unless an explicit lens-level limit is configured; sample_claims remains sampled. Legacy JSON count aliases are retained for backward compatibility.",
    "claim_types": "Dict of claim_type -> count",
    "evidence_types": "Dict of evidence_type -> count",
    "confidence_levels": "Dict of confidence -> count",
    "sentiment_levels": "Dict of manifest sentiment -> claim count (claim-weighted via signal manifests)",
    "domains": "Dict of home_domain -> count for every observed domain",
    "tag_terrain": "Public-safe narrative terrain for the tag drilldown: {inventory:{primitive_band, edge_band, public_terrain_count, public_bridge_count}, scope, terrains:[{id,label,kicker,description,why_agents_care,activity,primitive_band,anchors:[{name,type,activity}],type_mix}], bridges:[{source,target,label,strength,connection_band}]}. Exhaustive tags, raw edge weights, rare-tail nodes, and full co-occurrence inventory are deliberately omitted from public payloads.",
    "highlights": "Curated high-confidence claims with source URLs + entities",
    "verified_samples": "Homepage sample-claim cards: 10 claims verified in the last 12h via record.synorb_ingested_at. Fields: {claim_id, text, source, source_display, source_url, source_channel_display, published_date, verified_at, sentiment, confidence, evidence_type, media_type, claim_type}.",
    "samples": "Recent claims (any confidence) for the /explore view"
  },
  "notes": [
    "Every visual panel has a JSON twin at windows/<window>.json",
    "Homepage pages may load windows/<window>.home.json first so browsers do not block on unrelated fields",
    "Buyer drilldown pages may load windows/<window>.buyer.json first so browsers do not block on the complete public window JSON",
    "Tag and entity drilldown pages may load windows/<window>.tags.json and windows/<window>.entities.json first so browsers do not block on unrelated fields",
    "Hanging Context provides top-level context for agents and reasoning systems; sources are primary primitives and direct-source channels",
    "Schema is stable within schema_version=1; agents should branch on it",
    "Generated every 12h by the HCAggregator Hatchet workflow on the worker box, rsynced to the API box"
  ]
}