TaskMetadata
Canonical JSON document anchored on-chain by FrontierRegistry task.metadataHash.
A document of this kind carries a schema field matching xny://schemas/task-metadata/<major>.<minor> — the version is part of the URI, and it is the only place a document's version is recorded.
Canonical JSON document anchored on-chain by FrontierRegistry task.metadataHash. The exact bytes uploaded to metadataUri define the hash — see Metadata Hash Rules in docs/architecture/protocol-v2-design.md §6.1.
Fields
| Field | Type | Required | Description |
|---|---|---|---|
schema | string | yes | Per-kind versioned schema identifier. Format: xny://schemas/task-metadata/<major.minor>. This is the single source of truth for document version; do not use schema_version. |
kind | string | yes | Document kind discriminator. Always 'task-metadata' for this schema. |
publisher | string | yes | DID of the entity that published this document. Pseudonymous identifier written to the permanent Arweave layer. DID-to-identity mapping exists only in an off-chain deletable layer (GDPR note: deletion right does not cover this field). |
published_at | string | yes | RFC 3339 / ISO 8601 UTC timestamp of document publication. |
tags | object | yes | Free-form key-value metadata tags for indexing and filtering. Bounded to 32 entries with keys up to 64 characters — conservative structural limits to keep the anchored document small, not a semantic constraint on tag content. Values are permanently written to Arweave alongside the rest of this document: do not put personal data in a tag (see CONVENTIONS.md's GDPR Note). |
task_id | string | yes | Off-chain identifier (snowflake). On-chain bytes32 = keccak256(utf8 of this string). |
campaign_id | string | yes | Parent campaign identifier. |
owner_did_id | string | yes | uint128 DID id of the task creator (controls updateTaskMetadata), serialised as decimal string. |
task_key | string | yes | Stable key used by depends_on references within the same campaign. |
name | string | yes | Human-readable task name. Permanently written to Arweave — do not put personal data in it (see CONVENTIONS.md's GDPR Note). |
description | — | — | Free-text task description. Permanently written to Arweave — do not put personal data in it (see CONVENTIONS.md's GDPR Note). |
task_type | submission | validation | yes | |
execution | human | agent | yes | |
origin | manual | auto_generated | yes | |
template_id | — | — | |
template_version | — | — | |
annotation_config_uri | — | — | URI to LabelStudio-style XML annotation config (kept out of the JSON to keep metadataHash stable across whitespace edits to the XML). |
data_requirements | object | — | Free-form, task-type specific input requirements. |
data_display | object | — | Free-form display config (frontend rendering hints). |
reward | object | yes | |
acceptance_rule | — | yes | Discriminated union by 'type'. |
max_count | integer | yes | |
duplicate_permission | integer | yes | Max submissions per contributor under this task (1 = no duplicates allowed). |
depends_on | array of string | yes | Upstream task_key values within the same campaign. |
position | integer | yes | |
qualification_override | — | — | Per-task override of campaign-level qualification; null = inherit from campaign. |
Example
1 rejection case is kept alongside the schema in docs/schemas/examples/, exercised by validate_schemas.py.
Last updated