org.cannadb.plant

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.

Repository @cannadb.org did:plc:lrtzzib3ycggsodkfidzuorw namespace authority
Details · record, key tid
Kindrecord
Record keytid
Authoritycannadb.org
Indexed

Record

record · key tid

Properties

createdAt

requiredstring · datetime

Client-declared timestamp when this plant record was originally created.

grow

requiredstring · at-uri

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.)

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.

Reference

isClone

boolean

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

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
  • maxGraphemes: 200

parentPlant

string · at-uri

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.)

Display fallback for the parent plant when `parentPlant` is absent or unresolved.

startedAt

string · datetime

When this plant's life began for the grower (germination or the date the clone/seed was planted). Optional.

strain

string · at-uri

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.)

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.

#harvest

object

Measured outcomes of a completed plant. All fields optional. Decimal quantities use the scaled-integer convention from `org.cannadb.strain` (atproto has no float type): weights are in hundredths of a gram, cannabinoid percentages in hundredths of a percent.

Properties

dryWeightG

integer

Final dry/cured weight in hundredths of a gram (e.g., 12500 = 125.00 g). This is the figure the AppView aggregates into per-strain yield rails.

  • minimum: 0

Actual flowering duration in days (start of 12/12 — or, for autoflowers, the full run — to harvest). The AppView aggregates this into a growers' average flowering time alongside the breeder-claimed `cycleTime` range on the strain.

  • minimum: 0
  • maximum: 365

harvestedAt

string · datetime

When the plant was harvested (cut down).

Lab-tested CBD percentage in hundredths of a percent, if available.

  • minimum: 0
  • maximum: 10000

Lab-tested THC percentage in hundredths of a percent (e.g., 2450 = 24.50%), if available. Distinct from the strain record's breeder-claimed `thcRange`.

  • minimum: 0
  • maximum: 10000

notes

string

Markdown-formatted free-form harvest notes — trim/dry/cure method, smell, observations.

  • maxLength: 50000
  • maxGraphemes: 5000

wetWeightG

integer

Wet (fresh-cut) weight in hundredths of a gram (e.g., 50000 = 500.00 g).

  • minimum: 0

Similar lexicons

semantic match

Lexicons whose schemas describe something close to this one. Check them before publishing a new one that overlaps.

  • One append-only event on a plant's timeline. A single record type unifies what other journals split into status changes, activities, measurements, and notes — because they are all the same shape (a timestamped thing that happened to a plant) and the distinguishing detail is an open `kind` vocabulary. Stage transitions (kind "stage") are how lifecycle is tracked: the AppView reads the latest stage entry as the plant's current stage and the full set as its lifecycle history. Activities (watering,

  • A grow — one documented cultivation run (a tent, a garden, a season's cycle). The grow is a lightweight container: it groups one or more `org.cannadb.plant` records and carries the shared setup and a publisher-chosen listing preference. Per-plant lifecycle, activities, notes, and measurements live in `org.cannadb.growEntry` records that reference a plant; photos live in `org.cannadb.growPhoto` records. Publishing this record IS the claim — every field is contextualized by the publisher DID at di

  • Cannabis genetic identity. The same record type covers two levels of specificity, distinguished by the `kind` field: "strain" denotes a broad genetic identity (e.g., "Wedding Cake"); "cut" denotes a specific phenotype, clone, or keeper pheno (e.g., "Forum cut of GSC"). Captures intrinsic identity, structured cultivation profile, and the publisher's contextualized field assertions; subjective experience and measured outcomes live in separate record types (`org.cannadb.review`, future `org.cannadb

  • A field-level edit to a strain's living document (collaborative editing). Targets a strain via `subject` (the anchor record of the entity) and carries a sparse patch: scalar field overwrites in `set`, additive ops on open array fields in `add`/`remove`, and field clears in `unset`. The AppView folds accepted edits over the anchor record to materialize the canonical document; this record is one signed contribution, attributed to its publisher DID. See docs/05-collaborative-strains.md.

  • A single photo in a grow's gallery. Modeled as its own record (rather than blobs embedded in entries) so galleries can grow without bloating other records and so each photo carries its own caption, ordering, and capture date. A photo attaches to a plant (the usual case — per-plant galleries) and/or to the grow (group/room shots, the cover), and may optionally link to the `org.cannadb.growEntry` it documents. The image blob lives on the publishing PDS; the record carries the blob ref plus metadat