A single plant within a grow. The plant is the lifecycle unit: it references the `org.cannadb.grow` it belongs to and (optionally) the `org.cannadb.strain` it is. Its lifecycle stage is NOT stored as a mutable field here — stage transitions are append-only `org.cannadb.growEntry` events (kind "stage"), and the AppView computes the current stage from the latest such event. Measured harvest outcomes, once known, are recorded in the optional `harvest` object so the AppView can aggregate real cultivation data across many grows of the same strain ("growers' average flowering time / yield"). Publishing this record IS the claim — every field is contextualized by the publisher DID at display time.
tid
Timestamp-based ID
Properties
createdAt
string
datetime
Required
Client-declared timestamp when this plant record was originally created.
grow
string
at-uri
Required
AT-URI reference to the `org.cannadb.grow` this plant belongs to. The grow is expected to be published by the same DID. (The lexicon spec does not enforce collection constraints on at-uri; consumers should validate the ref resolves to an `org.cannadb.grow` record.)
harvest
ref
#harvest
Optional
Measured harvest outcomes for this plant, recorded once the run completes. Optional and entirely additive — a plant in veg has no harvest object. The AppView aggregates these across grows of the same strain.
isClone
boolean
Optional
Whether this plant is a clone (cut) rather than grown from seed. When true, `parentPlant` may reference the plant it was cut from.
label
string
Optional
Short label distinguishing this plant within the grow, e.g., "WC #1". Optional — the AppView falls back to the strain name plus an index.
maxLength: 2000 bytesmaxGraphemes: 200 graphemesparentPlant
string
at-uri
Optional
For clones: AT-URI reference to the `org.cannadb.plant` this plant was cut from. `parentPlantName` is the display fallback. (Consumers should validate the ref resolves to an `org.cannadb.plant` record.)
parentPlantName
string
Optional
Display fallback for the parent plant when `parentPlant` is absent or unresolved.
startedAt
string
datetime
Optional
When this plant's life began for the grower (germination or the date the clone/seed was planted). Optional.
strain
string
at-uri
Optional
AT-URI reference to the `org.cannadb.strain` record (any `kind`) this plant is a grow of. Canonical when present and resolvable; `strainName` is the display fallback. This is the seam to the strain library — the same ref that an Isley import keys on. (The lexicon spec does not enforce collection constraints on at-uri; consumers should validate the ref resolves to an `org.cannadb.strain` record.)
strainName
string
Optional
Display fallback for the strain name. Used when no `strain` ref is available, when the ref does not resolve, or for bag-seed / unknown genetics with no atproto presence.
View raw schema
{
"key": "tid",
"type": "record",
"record": {
"type": "object",
"required": [
"grow",
"createdAt"
],
"properties": {
"grow": {
"type": "string",
"format": "at-uri",
"description": "AT-URI reference to the `org.cannadb.grow` this plant belongs to. The grow is expected to be published by the same DID. (The lexicon spec does not enforce collection constraints on at-uri; consumers should validate the ref resolves to an `org.cannadb.grow` record.)"
},
"label": {
"type": "string",
"maxLength": 2000,
"description": "Short label distinguishing this plant within the grow, e.g., \"WC #1\". Optional — the AppView falls back to the strain name plus an index.",
"maxGraphemes": 200
},
"strain": {
"type": "string",
"format": "at-uri",
"description": "AT-URI reference to the `org.cannadb.strain` record (any `kind`) this plant is a grow of. Canonical when present and resolvable; `strainName` is the display fallback. This is the seam to the strain library — the same ref that an Isley import keys on. (The lexicon spec does not enforce collection constraints on at-uri; consumers should validate the ref resolves to an `org.cannadb.strain` record.)"
},
"harvest": {
"ref": "#harvest",
"type": "ref",
"description": "Measured harvest outcomes for this plant, recorded once the run completes. Optional and entirely additive — a plant in veg has no harvest object. The AppView aggregates these across grows of the same strain."
},
"isClone": {
"type": "boolean",
"description": "Whether this plant is a clone (cut) rather than grown from seed. When true, `parentPlant` may reference the plant it was cut from."
},
"createdAt": {
"type": "string",
"format": "datetime",
"description": "Client-declared timestamp when this plant record was originally created."
},
"startedAt": {
"type": "string",
"format": "datetime",
"description": "When this plant's life began for the grower (germination or the date the clone/seed was planted). Optional."
},
"strainName": {
"type": "string",
"description": "Display fallback for the strain name. Used when no `strain` ref is available, when the ref does not resolve, or for bag-seed / unknown genetics with no atproto presence."
},
"parentPlant": {
"type": "string",
"format": "at-uri",
"description": "For clones: AT-URI reference to the `org.cannadb.plant` this plant was cut from. `parentPlantName` is the display fallback. (Consumers should validate the ref resolves to an `org.cannadb.plant` record.)"
},
"parentPlantName": {
"type": "string",
"description": "Display fallback for the parent plant when `parentPlant` is absent or unresolved."
}
}
},
"description": "A single plant within a grow. The plant is the lifecycle unit: it references the `org.cannadb.grow` it belongs to and (optionally) the `org.cannadb.strain` it is. Its lifecycle stage is NOT stored as a mutable field here — stage transitions are append-only `org.cannadb.growEntry` events (kind \"stage\"), and the AppView computes the current stage from the latest such event. Measured harvest outcomes, once known, are recorded in the optional `harvest` object so the AppView can aggregate real cultivation data across many grows of the same strain (\"growers' average flowering time / yield\"). Publishing this record IS the claim — every field is contextualized by the publisher DID at display time."
}