The way I'm picturing it, the tab's internal state consists of four pieces of data: a title, a window (or possibly window configuration), a function that's called when it becomes active, and another function that's called when it becomes inactive. That *seems* like it's meeting all your requirements, as I've understood them.
The title must also a tab-local variable.
For example, a process calls a callback of the event of a tab, and this callback should be able to change the name of a tab .
For example, a tab should be able to display the ##cinema buffer of an IRC process.
When somebody writes in channel, I want to change the name of a tab to the last person who wrote there, etc.
Or to change the name of the tab when somebody wrote ME someting.
So, the tabs must be programmable, with no restriction, as a fixed name, etc.