Part of JasperFx/bobcat#257. Ungated as of 2026-09-08 — JasperFx/wolverine#4385, #4386 and #4387 are all closed, so the merged model is now the instrument this review was waiting for.
The first wave's review found the eight scaffolder defects that became bobcat#235–#242 and the three Wolverine issues above. This is the same pass again against a fixed toolchain — worth repeating rather than assuming, because every finding last time came from running what was generated, not from reading it.
Known to check
The merged model, which is now the instrument. Registering the declared model alongside the derived one went from 22 slices / 0 hotspots (nothing merged) to 16 after commands took the board's name. With wolverine#4385 the remaining five should merge, and #4386 should mean derived slices actually report the events they emit — at which point the merge can confirm or contradict the model rather than just sitting beside it. JasperFx#799 already removed the false "Derived claims Appointment; Declared claims Appointment" hotspots.
What ten agents did to one shared aggregate. Nine of ten branches touched Appointment.cs, and the merge produced three vocabularies for one concept: AppointmentStatus, AppointmentStatuses, and four raw string comparisons. That is still in the tree and is the clearest open question from the last review — whether shared vocabulary should be declarable in the model so it is emitted once instead of invented ten times.
The regeneration footgun. models/README.md still describes regenerating the whole scaffold, and the code is the agents' work now — running it would overwrite ten filled-in slices with fresh TODOs. The .feature half is safely regenerable; the .cs half is not, and the README does not say so.
The two Apply shapes. One agent's Apply(HomeCheckAppointmentProposed) deliberately does not set Id (the store assigns it from the stream, so a partially-arranged event still folds); another's Apply(FosterHandoverAppointmentProposed) sets it explicitly. Both work. Only one is right.
Part of JasperFx/bobcat#257. Ungated as of 2026-09-08 — JasperFx/wolverine#4385, #4386 and #4387 are all closed, so the merged model is now the instrument this review was waiting for.
The first wave's review found the eight scaffolder defects that became bobcat#235–#242 and the three Wolverine issues above. This is the same pass again against a fixed toolchain — worth repeating rather than assuming, because every finding last time came from running what was generated, not from reading it.
Known to check
The merged model, which is now the instrument. Registering the declared model alongside the derived one went from 22 slices / 0 hotspots (nothing merged) to 16 after commands took the board's name. With wolverine#4385 the remaining five should merge, and #4386 should mean derived slices actually report the events they emit — at which point the merge can confirm or contradict the model rather than just sitting beside it. JasperFx#799 already removed the false "Derived claims Appointment; Declared claims Appointment" hotspots.
What ten agents did to one shared aggregate. Nine of ten branches touched
Appointment.cs, and the merge produced three vocabularies for one concept:AppointmentStatus,AppointmentStatuses, and four raw string comparisons. That is still in the tree and is the clearest open question from the last review — whether shared vocabulary should be declarable in the model so it is emitted once instead of invented ten times.The regeneration footgun.
models/README.mdstill describes regenerating the whole scaffold, and the code is the agents' work now — running it would overwrite ten filled-in slices with fresh TODOs. The.featurehalf is safely regenerable; the.cshalf is not, and the README does not say so.The two Apply shapes. One agent's
Apply(HomeCheckAppointmentProposed)deliberately does not setId(the store assigns it from the stream, so a partially-arranged event still folds); another'sApply(FosterHandoverAppointmentProposed)sets it explicitly. Both work. Only one is right.