Three parts of #324, which asked why a slice specified as a plain xUnit test stayed unbound on the
canvas however green the test was. A pure mapping — a trigger event in, one event out — was paying
~600ms of Postgres and Wolverine to assert a constructor call, and the alternative cost it its place
on the Event Model entirely. It no longer does.
**[BobcatSlice] binds a projected test to a slice (#331).** `SliceType = typeof(X)` where a type
bears the slice's name, `SliceName` where none does — which is every Automation, whose only type is
`{Slice}Handler` and which has no command type by design. Binding only, never roles: the curated
model states those on Declared and the code on Derived, and a third opinion from a test can only
manufacture a SourceDisagreement nobody can act on. A method-level binding REPLACES the class's, so
one class covers several slices. BOBCAT023 errors on two spellings naming different slices;
BOBCAT024 nudges a literal name that is a type in the compilation.
**A step need not be a keyword (#332).** `// * a sentence` is a step with no keyword at all, the way
Gauge and Storyteller write them — plenty of steps are simply not one of five words. Scoped to the
projected lane: the Gherkin lane keeps its keywords because Given versus Then is what decides an
arranged event is consumed rather than emitted (#297).
**The spec-ownership manifest (#333).** A separate `*.spec-ownership.yaml`, joined to the event model
on `model:`, saying which slices are specified as projected or code-first tests so the scaffolder
writes a skeleton — or nothing — rather than a `.feature`. Separate from the model because moving a
test is a change to where work lives, not to the design record. Absent means Gherkin, so it is purely
additive. `kind` and `authoring` are orthogonal, which Marten's DaemonTests already require by being
integration + projected. BOBCAT025 catches a slice specified in two lanes — the duplicate-identity
guard, and the ordinary route in is a stale `.feature` left behind after switching a slice to
projected. BOBCAT026 warns when the manifest names a slice nothing binds.
Also in this release: a projected skeleton derives its act and its refusal through SlicePlan rather
than off the curated `when:`, so the two lanes cannot describe one act two different ways; and
`ProjectedSpecNaming` reports the one thing the projected lane cannot spell — a scenario title is its
method name there, so punctuation silently publishes an identity that joins nothing.
#324 part 3 (cell-bearing step results) stays deferred by decision; it blocks nothing and improves
every lane, so it ships as its own wave.
17 assemblies, 1551 tests.