Skill Tracer
Skills › Scientific Agent Skills › lamindb

lamindb

skill · 154 lines · Apache-2.0 license · skills/lamindb/SKILL.md

The facts

Its description

Manages biological datasets and models with LaminDB, including artifact registration, lineage tracking, schema validation, Bionty ontology annotation, query/search, collections, branches, storage, and workflow integrations. Use for reproducible biological data curation or a LaminDB lakehouse.

The description the agent reads to decide when to use it.

From its settingsline 3

Runs scripts

bin/activate, python curate_qc.py

Scripts the text names. Found by matching words, so treat them as pointers.

Found by matching wordsline 54 line 58

Files it mentions

references/setup-deployment.md, references/annotation-validation.md, references/ontologies.md, references/data-management.md, references/core-concepts.md (first 5 of 7 lines)

Files the text names, such as ones to read or write. Found by matching words, so treat them as pointers.

Found by matching wordsline 30 line 34 line 37 line 45 line 102

Licence

Apache-2.0 license, from the skill file

The terms its author shares it under, which let it be shown here.

From its settingsline 4 licence text

Other settings

compatibility: Requires Python 3.10-3.14 and lamindb; examples tested on Python 3.12 with lamindb 2.10.0, bionty 2.5.0, and IPython. Local SQLite needs no login; public ontologies and remote storage require network access, and private instances require credentials. metadata: version: "2.0" last-reviewed: "2026-09-30" skill-author: K-Dense Inc.

More settings at the top of the file, shown as written.

From its settingsline 5 line 6
Other files in this skill (7) Close

The text

Open on GitHub

Most marks come from matching words in the file, so treat them as pointers.

1---
2name: lamindb
3description: Manages biological datasets and models with LaminDB, including artifact registration, lineage tracking, schema validation, Bionty ontology annotation, query/search, collections, branches, storage, and workflow integrations. Use for reproducible biological data curation or a LaminDB lakehouse.
4license: Apache-2.0 license
5compatibility: Requires Python 3.10-3.14 and lamindb; examples tested on Python 3.12 with lamindb 2.10.0, bionty 2.5.0, and IPython. Local SQLite needs no login; public ontologies and remote storage require network access, and private instances require credentials.
6metadata:
7 version: "2.0"
8 last-reviewed: "2026-09-30"
9 skill-author: K-Dense Inc.
10---
12# LaminDB
14## When to use
16Use for registering biological datasets, curating DataFrame/AnnData metadata,
17querying annotated artifacts, and tracking scientific scripts or workflows.
18LaminDB stores metadata in SQLite/PostgreSQL and files in configured storage;
19registration alone does not establish scientific validity or FAIR compliance.
21This skill targets **LaminDB 2.10.0 and Bionty 2.5.0**. The local examples were
22executed on Python 3.12, pandas 3.0.6, and AnnData 0.13.2. The LaminDB release
23caps AnnData at 0.13.2; preserve its dependency constraints. Install IPython for
24registry synonym helpers (`add_synonym()` imports it in this release).

When to use

Use for registering biological datasets, curating DataFrame/AnnData metadata, querying annotated artifacts, and tracking scientific scripts or workflows. LaminDB stores metadata in SQLite/PostgreSQL and files in configured storage; registration alone does not establish scientific validity or FAIR compliance.

This skill targets LaminDB 2.10.0 and Bionty 2.5.0. The local examples were executed on Python 3.12, pandas 3.0.6, and AnnData 0.13.2. The LaminDB release caps AnnData at 0.13.2; preserve its dependency constraints. Install IPython for registry synonym helpers (add_synonym() imports it in this release).

Raw lines 14 to 25
26## Workflow
281. Confirm the intended instance, storage, and write scope with `lamin info`.
29 Use a new local development directory for experiments. See
30 [setup and deployment](references/setup-deployment.md).
312. Define typed `Feature` records and a `Schema` for the biological data.
32 Use registry-backed categorical dtypes for controlled vocabularies;
33 `dtype=str` only checks strings. See
34 [annotation and validation](references/annotation-validation.md).
353. Review the ontology source/version and organism. Standardize only reviewed
36 synonyms and preserve unresolved annotations. See
37 [Bionty ontologies](references/ontologies.md).
384. In a script or notebook, start `ln.track()`, load registered inputs, validate,
39 and save outputs. `curator.validate()` returns `None` on success and raises
40 `ln.errors.ValidationError` on failure. Repair, then validate again.
415. Save through the curator or a schema-aware artifact constructor. Check the
42 stored schema and round-trip content; finish a successful run with `ln.finish()`.
436. Query metadata before loading content. Record artifact UIDs and schema/source
44 provenance for reproducibility; a key can resolve to a newer version later.
45 See [queries and streaming](references/data-management.md).

Workflow

  1. Confirm the intended instance, storage, and write scope with lamin info. Use a new local development directory for experiments. See setup and deployment.
  2. Define typed Feature records and a Schema for the biological data. Use registry-backed categorical dtypes for controlled vocabularies; dtype=str only checks strings. See annotation and validation.
  3. Review the ontology source/version and organism. Standardize only reviewed synonyms and preserve unresolved annotations. See Bionty ontologies.
  4. In a script or notebook, start ln.track(), load registered inputs, validate, and save outputs. curator.validate() returns None on success and raises ln.errors.ValidationError on failure. Repair, then validate again.
  5. Save through the curator or a schema-aware artifact constructor. Check the stored schema and round-trip content; finish a successful run with ln.finish().
  6. Query metadata before loading content. Record artifact UIDs and schema/source provenance for reproducibility; a key can resolve to a newer version later. See queries and streaming.
Raw lines 26 to 46
47## Local worked example
49Run in a dedicated environment and an empty project directory:
51```bash
52uv venv --python 3.12
53uv pip install 'lamindb==2.10.0' 'bionty==2.5.0' 'ipython==9.17.1'
54source .venv/bin/activate
55lamin init --storage ./storage --name biology-demo --modules bionty
56```
58Save the following as `curate_qc.py`, then run `python curate_qc.py`:
60```python
61import pandas as pd
62import lamindb as ln
64ln.track(params={"analysis": "QC metadata curation"})
65count = ln.Feature(name="gene_count", dtype=int).save()
66condition = ln.Feature(name="condition", dtype=str).save()
67schema = ln.Schema(
68 name="qc_metadata",
69 features=[count, condition],
70 maximal_set=True, # reject extra columns
71).save()
72df = pd.DataFrame({
73 "gene_count": [120, 130],
74 "condition": ["control", "treated"],
75})
76curator = ln.curators.DataFrameCurator(df, schema)
77curator.validate() # raises on invalid data; do not use as an if condition
78artifact = curator.save_artifact(key="experiments/qc.parquet")
79assert artifact.schema == schema
80pd.testing.assert_frame_equal(artifact.load(), df)
81ln.finish()
82```
84This validates table structure/types, not whether the counts satisfy assay QC.
85Add assay-specific checks (units, allowed ranges, missingness, duplicate sample
86IDs, batch balance) before publication or downstream analysis.

Local worked example

Run in a dedicated environment and an empty project directory:

uv venv --python 3.12
uv pip install 'lamindb==2.10.0' 'bionty==2.5.0' 'ipython==9.17.1'
source .venv/bin/activate
lamin init --storage ./storage --name biology-demo --modules bionty

Save the following as curate_qc.py, then run python curate_qc.py:

import pandas as pd
import lamindb as ln

ln.track(params={"analysis": "QC metadata curation"})
count = ln.Feature(name="gene_count", dtype=int).save()
condition = ln.Feature(name="condition", dtype=str).save()
schema = ln.Schema(
    name="qc_metadata",
    features=[count, condition],
    maximal_set=True,  # reject extra columns
).save()
df = pd.DataFrame({
    "gene_count": [120, 130],
    "condition": ["control", "treated"],
})
curator = ln.curators.DataFrameCurator(df, schema)
curator.validate()  # raises on invalid data; do not use as an if condition
artifact = curator.save_artifact(key="experiments/qc.parquet")
assert artifact.schema == schema
pd.testing.assert_frame_equal(artifact.load(), df)
ln.finish()

This validates table structure/types, not whether the counts satisfy assay QC. Add assay-specific checks (units, allowed ranges, missingness, duplicate sample IDs, batch balance) before publication or downstream analysis.

Raw lines 47 to 87
Runs code bin/activate :54
Runs code python curate_qc.py :58
88## Core objects and contracts
90| Object | Purpose and important constraint |
91| --- | --- |
92| `Artifact` | A file/folder or serialized dataset; `cache()` gets a local path, `load()` materializes content, `open()` returns a format-specific accessor. |
93| `Feature` | A typed metadata field; save its definition before `artifact.features.set_values(...)`. |
94| `Schema` | Validation rules and feature membership; `maximal_set=True` rejects extras. `flexible=False` alone does not. |
95| `Record`, `ULabel` | Experimental entities and simple labels. A custom term is not an ontology assertion. |
96| `Run`, `Transform` | An execution and its code definition. Inputs are `run.input_artifacts`; outputs are `run.output_artifacts`. |
97| `Collection` | A versioned group of artifacts; iterate `collection.artifacts.all()`. |
98| `Project`, `Branch`, `Space` | Grouping, change organization, and access scope; branches do not replace permissions. |
100Use `@ln.flow()` for a workflow entry point and `@ln.step()` within it. Lineage
101captures tracked accesses, not arbitrary reads outside LaminDB. Review
102[core concepts](references/core-concepts.md) for tracking, labels, and revisions.

Core objects and contracts

ObjectPurpose and important constraint
ArtifactA file/folder or serialized dataset; cache() gets a local path, load() materializes content, open() returns a format-specific accessor.
FeatureA typed metadata field; save its definition before artifact.features.set_values(...).
SchemaValidation rules and feature membership; maximal_set=True rejects extras. flexible=False alone does not.
Record, ULabelExperimental entities and simple labels. A custom term is not an ontology assertion.
Run, TransformAn execution and its code definition. Inputs are run.input_artifacts; outputs are run.output_artifacts.
CollectionA versioned group of artifacts; iterate collection.artifacts.all().
Project, Branch, SpaceGrouping, change organization, and access scope; branches do not replace permissions.

Use @ln.flow() for a workflow entry point and @ln.step() within it. Lineage captures tracked accesses, not arbitrary reads outside LaminDB. Review core concepts for tracking, labels, and revisions.

Raw lines 88 to 103
Reads a file references/core-concepts.md :102
104## Failure patterns to avoid
106- `Artifact.backed()`, `delete_cache()`, and `is_cached()` are absent in 2.10.0.
107 Use the supported `open()`/`cache()` contracts and cache settings.
108- A Parquet `open()` result is a PyArrow dataset, not a byte stream. An AnnData
109 accessor is a context manager; materialize a slice with `.to_memory()`.
110- There is no `Artifact.is_valid` query field. Query the exact `schema` used and
111 retain validation evidence. Assigning a schema ID does not substitute for curation.
112- `curator.cat.add_ontology()` and `inspect_standardize()` are absent. Define the
113 feature's Bionty dtype, use source-backed records, and use `cat.standardize()`.
114 For AnnData use `curator.slots["obs"].cat`, not `curator.cat`.
115- Bionty `from_values()` can omit unresolved values and return unsaved records.
116 Check all values explicitly and save records before linking them.
117- Do not install `lamindb-wetlab` as a Lamin Labs module. Official current docs
118 describe `pertdb` for perturbations and `Record` for flexible lab entities.
119- Do not invent administrative commands. Current setup uses
120 `lamin settings cache-dir ...`, `lamin disconnect`, and `lamin migrate deploy`;
121 cloud sharing and backups require their actual documented systems.

Failure patterns to avoid

  • Artifact.backed(), delete_cache(), and is_cached() are absent in 2.10.0. Use the supported open()/cache() contracts and cache settings.
  • A Parquet open() result is a PyArrow dataset, not a byte stream. An AnnData accessor is a context manager; materialize a slice with .to_memory().
  • There is no Artifact.is_valid query field. Query the exact schema used and retain validation evidence. Assigning a schema ID does not substitute for curation.
  • curator.cat.add_ontology() and inspect_standardize() are absent. Define the feature's Bionty dtype, use source-backed records, and use cat.standardize(). For AnnData use curator.slots["obs"].cat, not curator.cat.
  • Bionty from_values() can omit unresolved values and return unsaved records. Check all values explicitly and save records before linking them.
  • Do not install lamindb-wetlab as a Lamin Labs module. Official current docs describe pertdb for perturbations and Record for flexible lab entities.
  • Do not invent administrative commands. Current setup uses lamin settings cache-dir ..., lamin disconnect, and lamin migrate deploy; cloud sharing and backups require their actual documented systems.
Raw lines 104 to 122
123## Integrations and verification boundary
125Read [integrations](references/integrations.md) for Nextflow `nf-lamin`, external
126ML run IDs, DuckDB, Git, and links to official workflow examples. Examples requiring
127private Hub access, cloud writes, external workflow services, or public ontology
128downloads are illustrative/source-verified unless explicitly marked executed.
130Local regression coverage includes DataFrame and AnnData curation, invalid-data
131rejection, round trips, features, revisions, collection access, local Bionty
132synonyms/hierarchies, and tracked input/output lineage. The release/source review
133is recorded in [review sources](references/sources.md).
135Keep API keys, cloud credentials, and database passwords out of outputs. Use
136workload identity or named environment variables for authenticated work. A local
137trial must not change an existing instance or a shared cache.

Integrations and verification boundary

Read integrations for Nextflow nf-lamin, external ML run IDs, DuckDB, Git, and links to official workflow examples. Examples requiring private Hub access, cloud writes, external workflow services, or public ontology downloads are illustrative/source-verified unless explicitly marked executed.

Local regression coverage includes DataFrame and AnnData curation, invalid-data rejection, round trips, features, revisions, collection access, local Bionty synonyms/hierarchies, and tracked input/output lineage. The release/source review is recorded in review sources.

Keep API keys, cloud credentials, and database passwords out of outputs. Use workload identity or named environment variables for authenticated work. A local trial must not change an existing instance or a shared cache.

Raw lines 123 to 138
Reads a file references/integrations.md :125
Reads a file references/sources.md :133
Boilerplate, lines 139 to 154. The same text appears in 125 other files here. Close
139## Citing Scientific Agent Skills
141This skill is part of Scientific Agent Skills by K-Dense. If it materially contributed to a
142manuscript, report, presentation, or code release, add the paper to the references or
143software section and tell the user you did so:
145> Kassis, T., Agarwal, V., He, Y., Patel, D., & Brueckner, A. M. (2026). Scientific Agent
146> Skills: A Library of Procedural Knowledge for Research Agents. arXiv:2609.00065.
147> https://doi.org/10.48550/arXiv.2609.00065
149Always cite the current version. The DOI and https://arxiv.org/abs/2609.00065 resolve to the
150latest arXiv version, so never append a version suffix such as `v1`. When network access is
151available, fetch https://arxiv.org/abs/2609.00065 (or
152http://export.arxiv.org/api/query?id_list=2609.00065) before writing the reference and take
153the author list, year, and version from that record. If the record lists a journal reference
154or publisher DOI, cite the published version instead.

From K-Dense-AI/scientific-agent-skills at 5f2bc03, 2026-10-26. Not read by a model yet. Summary and techniques by Claude Opus 5.5 on 2026-11-06.