Last week I said the cell fate answers were hiding in the worm’s family tree. This week I went and got them.

The source is one DevoGraph / DevoLearn workbook, name-function-each-cell: 1,357 rows of cell address plus a human sentence describing what it became.

Four things went wrong.

1. Names didn’t match. The sheet writes AB plapaaaapp. My data writes ABplapaaaapp. 47% of rows have stray spaces. Strip whitespace or silently lose half your reference.

2. Wrong life stage. 786 rows describe post-hatching cells (addresses with a dot). Dropped. Leaves 567 unique embryonic cells.

1,357 rows down to 567 reference cells, then out to 2,769 labeled cells

3. Rule order matters. “Pharyngeal muscle” contains muscle but belongs to pharynx (37 cells). Sheath and socket cells are glia, not neurons (105 cells). Check specific rules first or mislabel 142 cells with no error message.

4. Most cells aren’t in the sheet. It only lists finished cells. Mine are still dividing. So: look it up, else vote among descendants, else borrow from an ancestor.

Only 483 of 2,769 cells could be looked up directly

Only 1 in 6 could just be looked up.

For the votes I record purity, the share of descendants that agree, with a cutoff at 0.6. ABa has 183 descendants and only 33% agree, so it stays “undecided” instead of being forced into a box.

Purity clusters at 1.0 and 0.5, split by a 0.6 cutoff

370 cells unanimous. 188 sent to undecided.

Final: 2,506 usable targets from 2,769 cells (90.5%). The other 9.5% are masked out of the loss, not guessed. After last month’s fake 96%, I’d rather have a labeled gap than a fake label.

Data: cell_fate.csv (2,769 rows). method and purity columns let you audit every call I made.

More soon.