Skip to content

W-038: ecs-prefab prefab entities and query exclusion (PREFAB-F01)

Type: feature · Size: S · Epic: E-prefab-v0 · Target: packages/ecs-prefab · Breaking: no Depends: W-012 Refs: spec PREFAB-001..PREFAB-008

Goal

Add the Prefab tag and createPrefab(world, traits?) with IsExcluded added first, so that prefabs never match koota queries, Not, tracking queries, or onQueryAdd. The isA option comes with the variants item (W-041). Prefabs stay regular entities.

Steps

  • S1 (PREFAB-001, PREFAB-002): createPrefab spawns IsExcluded, then Prefab, then the given traits, merging [Trait, params] over schema defaults; has(Prefab) is true only for prefabs; files: packages/ecs-prefab/src/prefab.ts, packages/ecs-prefab/src/create-prefab.ts, packages/ecs-prefab/src/index.ts, packages/ecs-prefab/tests/create-prefab.test.ts
  • S2 (PREFAB-003, PREFAB-004, PREFAB-005): prefabs are not returned by world.query, Not, onQueryAdd, or Added, and instances still are; the IsA('*') part of PREFAB-004 is tested in W-041; files: packages/ecs-prefab/tests/query-exclusion.test.ts
  • S3 (PREFAB-006, PREFAB-007, PREFAB-008; changeset): prefab supports get, set, add, remove, has, and destroy with koota semantics; canary test that world.onAdd fires for a prefab; README states the observer and enumeration consequences; files: packages/ecs-prefab/tests/prefab-entity.test.ts, packages/ecs-prefab/README.md, .changeset/w-038-ecs-prefab-entities.md (patch, @workspace/ecs-prefab)

Log

  • 2026-11-01 created from the approved spec split of W-005 (Triage)
  • 2026-11-01 state Later -> Next (Triage, user-confirmed after board review)
  • 2026-11-02 moved up in Next: the M1 demo path (prefab for demo-dnd) comes first (Triage)
  • 2026-11-02 Next -> Now, state active (Triage, user-requested)
  • 2026-11-02 S1-S3 review passed (Reviewer final pass APPROVED; no [manual] requirements, no accept gate) (Triage)
  • 2026-11-02 Now -> Done (Triage)