Labels are a join table, not a text column
Comma-separated tags on the task would be one less table and would make renaming a label a scan-and-rewrite, with nothing preventing two spellings of the same tag. The join costs a query to show a task's labels and makes filtering by label an indexed lookup — which, in an app whose main view is a filtered list, is where the work actually happens.