Data Card — Sprout bundled horticulture + toxicity corpus
Datasheets for Datasets (Gebru et al., 2021), all seven sections. Per
STANDARDS/AI-EVALUATION-STANDARD.md§4, this card is a committed artifact regenerated on release, not slideware. It documents the data; the model/pipeline is documented inmodel-card.md.
| Field | Value |
|---|---|
| Dataset name | sprout-corpus (bundled reference corpus) |
| Version | tracked with the package SemVer; manifest pinned by content hash |
| License | CC0-1.0 (public-domain dedication) — see § Distribution |
| Languages | English (en), Spanish (es) — mirrored, parity-enforced |
| Size | ~16 common houseplants × {EN, ES} care + toxicity notes |
| Authored by | Chelsea Kelly-Reif |
| Card date | 2026-06-22 |
| Status | In build. The on-disk corpus is materialized by sprout ingest; this card is the spec the materialized files conform to. |
[!IMPORTANT] This corpus is illustrative, not authoritative horticulture, and not veterinary or medical advice. Every passage is original synthetic prose written for this project. It exists so the eval harness — the actual product — has something honest and license-clean to measure. Toxicity status (toxic / non-toxic to cats, dogs) tracks publicly known ASPCA-style classifications so the safety suite exercises real-shaped facts, but the wording is original and must not be relied on for an actual pet-poisoning decision. For a real ingestion event, contact a veterinarian or a poison-control line — the assistant routes there by design.
1. Motivation
Why was this dataset created, and for what task? Sprout is a retrieval-augmented houseplant-care assistant whose headline artifact is a public evaluation harness (groundedness, safety, calibration, refusal, multilingual). A RAG system and its eval need a corpus, and that corpus has hard constraints the public web cannot satisfy:
- License-clean and redistributable. The whole project must
pipx installandmake evaloffline with no scraping, no attribution tax, and no risk of redistributing copyrighted horticultural text. A bundled corpus that is authored for the project and dedicated CC0-1.0 removes that risk entirely. - Dated, cited, and tamper-evident by construction. Every passage must carry
source_name,url,license, andfetch_dateso the assistant can render "based on references as of <date>" and the citation guard can resolve each sentence to a passage. Synthetic data lets every field be filled deterministically. - A real safety edge without a real-world hazard. Houseplant toxicity to pets and children is a genuine safety property — enough to exercise the never-certify-"safe" guard and poison-control routing — while remaining low-stakes, universally legible, and outside anyone's regulated domain.
- EN/ES parity testable. The multilingual suite needs an English passage and its Spanish mirror that preserve the same facts and figures; authoring both halves guarantees the mirror exists.
The dataset is not intended to teach horticulture, train a model, or substitute for an authoritative reference. It is a fixture for an eval.
Who created it and who funded it? Authored by Chelsea Kelly-Reif as part of an independent, personal, open-source portfolio project (Apache-2.0 code, CC0-1.0 data). Unaffiliated with any employer or client; no external funding; contains no proprietary or client material.
2. Composition
What do the instances represent?
Each instance is a care note for one common houseplant, in one language. A note is a small
Markdown document with the H1 title dropped at ingest (the title comes from the manifest) and the
body organized into care-topic sections (## watering, ## light, ## soil, ## humidity,
## fertilizing, ## common problems, ## toxicity). chunk.py splits each note along those ##
headings and packs whole sentences into ≤120-word, 24-word-overlap windows, so the retrievable unit
("chunk") is a topic-scoped passage that never ends mid-sentence — required because the offline
generator quotes whole sentences verbatim.
How many instances are there?
~16 species × 2 languages = ~32 source notes. Chunking yields a few hundred topic-scoped passages
(the exact count is a function of chunk.max_words/overlap_words and is fixed for a given config —
content-hashed and reproducible). The species set is the common-houseplant core, e.g.:
| Toxicity posture (ASPCA-style, illustrative) | Example species |
|---|---|
| Toxic to cats and/or dogs | Monstera (Monstera deliciosa), Pothos (Epipremnum aureum), Philodendron, Snake plant (Dracaena trifasciata), Peace lily (Spathiphyllum), ZZ plant (Zamioculcas), Aloe vera, English ivy |
| Generally non-toxic (per ASPCA-style listing) | Spider plant (Chlorophytum), Boston fern, Calathea / prayer plant, Phalaenopsis orchid |
(The exact roster is whatever the committed corpus/manifest.yaml enumerates; this table is the
intended composition, not a contract on individual rows. Planned, not yet in the corpus:
Dieffenbachia, Areca palm, African violet, Hoya — candidates for a future species-roster expansion;
they are not part of the bundled corpus/manifest.yaml today and any question about them correctly
falls to the refusal path.)
A "generally non-toxic" listing is not a safety guarantee. This column tracks an ASPCA-style classification so the safety suite exercises real-shaped facts — it is not a clearance to let a pet or child chew the plant. Any plant material can cause vomiting or GI upset, and individual animals vary; the assistant never renders a "non-toxic" listing as a "safe" certification (the never-certify-"safe" guard) and attaches a non-toxic caveat plus a vet/poison-control escalation card to every toxicity answer. The wording here is original and must not be treated as veterinary ground truth (see the illustrative-only banner above).
Is each instance complete, or is there missing data?
By policy, provenance is never missing: ingest (load_corpus) joins every processed file to a
manifest row and fails loudly if a file has no entry, so a passage without source_name / url /
license / fetch_date cannot enter the index. Coverage of horticultural topics, by contrast, is
deliberately partial — not every species documents every topic — which is intentional, because the
refusal and calibration suites need genuine corpus gaps to test honest "I don't have a cited
reference for this" behavior and below-threshold abstention.
What data does each instance contain (the manifest schema)?
Per ingest.ManifestEntry (extra fields forbidden):
| Field | Meaning |
|---|---|
file |
path under corpus/processed/, the stable citation key (monstera.md, monstera.es.md) |
title |
human-facing title (e.g. "Monstera care") |
source_name |
synthetic publisher label |
url |
placeholder/synthetic reference URL |
license |
CC0-1.0 |
fetch_date |
ISO-8601 snapshot date (e.g. 2026-05-01) |
language |
en or es |
topic |
default care topic for the note (general unless overridden) |
Are there labels? Yes — the toxicity section carries the safety-relevant signal (toxic /
non-toxic to a given animal, with symptoms-as-prose), and the eval datasets (separate from this
corpus, see model-card.md) carry gold expected-behavior labels that reference
these passages.
Are relationships between instances explicit? Yes, two:
- EN↔ES mirror. monstera.md and monstera.es.md describe the same plant; the multilingual
suite parses the species slug from the citation to pair them and asserts the Spanish answer
preserves the English facts and citations.
- Same-species topic sections within a note are related by the ## topic they sit under and the
species/topic retrieval filter that scopes a query to its named plant.
Sensitive data / PII / offensive content?
None by design. The corpus is synthetic prose about plants; it contains no personal data, no
human subjects, and no offensive content. The PII story is a guard concern, not a corpus concern:
guards.redact_pii and the Family-Greenhouse sentinel-PII checks govern the (optional) network path
and household-data path, never this static corpus.
Errors, noise, redundancies? The deliberate near-duplication is the EN/ES mirror and the 24-word chunk overlap; both are intended. Factual errors are possible (it is synthetic prose) but bounded: the corpus only has to be internally consistent enough for the eval gold key, and any horticultural claim it makes is explicitly illustrative.
Is it self-contained?
Yes. The corpus is committed to the repository under corpus/ (raw snapshots + processed Markdown +
manifest.yaml); it relies on no external resource at run time. The url fields are
synthetic/placeholder references, not live fetch targets.
3. Collection process
How was the data acquired?
It was authored, not collected. There was no scraping, crawling, survey, sensor, or
third-party acquisition. The author wrote each care note as original synthetic prose, choosing the
species roster from common houseplants and aligning each note's ## toxicity section to the
publicly known ASPCA-style toxic/non-toxic status for cats and dogs so the safety suite tests
real-shaped facts. No ASPCA (or any other) text was copied; only the public, factual
classification was used as a target, and the prose around it is original.
What mechanisms/procedures were used?
Hand-authoring in Markdown with the project's section convention, followed by the deterministic
ingest pipeline (sprout ingest): glob corpus/processed/**/*.md → join to manifest.yaml →
chunk_document (topic split + word-bounded sentence windows) → embed (HashingEmbedding, offline)
→ persist var/index.json. Chunk IDs and doc IDs are sha256-derived, so the index is reproducible.
Over what timeframe, and what is fetch_date?
Authored during project build (2026). fetch_date is the manifest-declared snapshot date for each
note (e.g. 2026-05-01); because the source is synthetic and authored, fetch_date is the date the
note was fixed for citation, surfaced verbatim in the UI as "based on references as of <date>."
Were individuals involved / was consent needed / ethical review? No human subjects, no third-party data, no consent question, no IRB. The only ethical concern is misuse as authoritative advice, addressed by the prominent illustrative-only disclaimer, the never-certify-"safe" guard, and the poison-control/vet routing in the safety path.
4. Preprocessing / cleaning / labeling
Was preprocessing done?
Yes, all of it deterministic and in-repo:
- Cleaning / structuring. Notes are authored directly in the canonical ## topic Markdown form,
so cleaning is minimal; the H1 title is dropped at chunk time (the manifest is the title authority).
- Chunking. chunk_document splits on ## headings into (topic, body) pairs, slugs the
topic, and packs whole sentences into ≤max_words (120) windows with overlap_words (24) of
sentence-level overlap. No chunk ends mid-sentence — a precondition for verbatim extractive citing.
- Embedding. Offline default is HashingEmbedding (deterministic, 512-dim); the production seam
is Bedrock Titan behind a config switch. BM25 lexical scores are computed for hybrid RRF fusion.
- Labeling. Toxicity status is encoded as prose in each ## toxicity section; the assistant
quotes it and the safety guard forbids turning it into a "safe" certification.
Is the raw data saved?
Yes — corpus/raw/ holds the committed snapshots and corpus/processed/ the cleaned Markdown, both
under version control, so the index rebuilds from source via make ingest with no mutable state.
Is the preprocessing software available?
Yes, it is the package: src/sprout/ingest.py, chunk.py, text.py, providers/ — Apache-2.0,
typed (mypy --strict), unit-tested to the ≥90% branch-coverage floor.
5. Uses
What is the dataset used for in this repo?
1. Grounding the assistant. It is the only source of horticultural fact; every rendered
sentence resolves to one of its passages or it does not render (groundedness 100% by construction).
2. Feeding the eval harness. The five suites (groundedness, safety, calibration, refusal,
multilingual) author gold cases against these passages; the citation/safety/parity checks
resolve to this corpus.
3. A swappable reference. Phase 4 generalizes to a corpus.yaml so any care corpus can replace
this one; this dataset is the worked example.
What should it NOT be used for?
- Not authoritative horticulture. Do not use it to actually decide how to water, light, or feed a
real plant; it is illustrative synthetic prose.
- Not a toxicity authority. Do not use the ## toxicity sections to decide whether a real
pet or child is in danger. The status tracks ASPCA-style public classifications for test realism,
but the prose is synthetic and may be incomplete or wrong. For a real ingestion event, contact a
veterinarian or poison-control line (the assistant routes there and never certifies "safe").
- Not training data. It is a retrieval/eval fixture, not a fine-tuning corpus, and is far too
small and narrow for that.
- Not a botanical or medical reference of any kind.
What could affect future uses (risks, harms, biases)? The principal risk is the authoritativeness illusion: a cited, dated, confident-looking answer can read as expert even though the underlying note is synthetic. Mitigations are structural and documented: the illustrative-only banner here and in the model card, the never-certify-"safe" guard, mandatory vet/poison-control routing, calibrated abstention below threshold, and the "reference implementation" banner in the deployed UI. Coverage bias is real and intentional — only common houseplants, only EN/ES — and an adopter pointing Sprout at a different corpus inherits that corpus's biases, not this one's.
6. Distribution
How is it distributed?
Bundled inside the open-source Sprout repository and included in built distributions (committed
under corpus/), so it is available fully offline. There is no
separate dataset download, API, or hosted endpoint.
Under what license / IP terms?
CC0-1.0 (public-domain dedication) for the dataset, declared per-row in the manifest license
field and reiterated in README.md and NOTICE. CC0 was chosen precisely so redistribution carries
no attribution or share-alike obligation and cannot entangle with the Apache-2.0 code license. The
code (including this card's repository) is Apache-2.0; the data is CC0-1.0 — two clean licenses,
no conflict. Because the prose is original and synthetic, there are no third-party IP terms, export
controls, or usage restrictions to honor.
Integrity / tamper-evidence. The corpus manifest is content-hashed; eval runs are content-keyed and byte-identical for identical inputs, so a silent edit to a passage changes the hash and is caught.
7. Maintenance
Who maintains it and how are they reached?
Maintained by the repository owner (Chelsea Kelly-Reif) via the public repository's issues and the
SECURITY.md contact. Corpus fixes are data edits, not code changes (the "repairability"
attribute): correct the Markdown note, update the manifest fetch_date if the content changed, and
re-run make ingest.
Will it be updated, and how are updates communicated?
Yes, as the species roster and eval suites grow. Updates follow the repository's SemVer + Keep-a-
Changelog discipline; the manifest's per-row fetch_date records each note's snapshot date, and the
content hash plus the committed eval report make any change diffable and dated. There is no
push-update mechanism — consumers get a new corpus by upgrading the package, and the assistant always
states the references' as-of date.
Versioning, deprecation, and older versions.
The corpus version travels with the package SemVer and the content-hashed manifest; older versions
remain available through the package/Git history (versioned corpus snapshots are an explicit
durability goal). When a passage is corrected, the prior version is preserved in version control,
and the fetch_date advances.
Can others extend / build on it?
Yes — CC0-1.0 imposes no restrictions, and Phase 4's corpus.yaml makes the pipeline corpus-agnostic
so an adopter can drop in their own dated, licensed notes. Contributions are welcome under the
repository's CONTRIBUTING guide; any added passage must carry full manifest provenance or ingest
will reject it, so the dated-and-cited invariant survives third-party extension.
References & cross-links
- Gebru et al., Datasheets for Datasets, CACM 2021 — the seven-section format this card follows.
STANDARDS/AI-EVALUATION-STANDARD.md§4 — data/model cards as committed, regenerated artifacts.STANDARDS/RESPONSIBLE-TECH-FRAMEWORK.md§D — transparency-artifact discipline.docs/cards/model-card.md— the pipeline, pinned models, eval results, limits.corpus/manifest.yaml— the authoritative, dated, per-row provenance this card describes.src/sprout/ingest.py,src/sprout/chunk.py— the ingest/chunk pipeline (the preprocessing software).
This card is regenerated and re-committed on release. Card date: 2026-06-22.