@switch (activePanel()) {
@case ('signals') {
@if (selectedSignal(); as signal) {
{{ signal.name }}
{{ signal.channels }}
Signal
{{ signal.description }}
@if (signal.caveat) {
Caveat
{{ signal.caveat }}
}
Composite
Scores are normalised over the active weight, so disabling a signal
re-weights the rest rather than lowering every score.
} @else {
Select a signal.
}
}
@case ('escalation') {
@if (selectedTrigger(); as trigger) {
{{ trigger.condition }}
→ {{ tierName(trigger.targetTierId) }}
Trigger
0 ? trigger.agreed + '%' : 'no data'"
/>
{{ trigger.note }}
@if (tierOf(trigger.targetTierId); as tier) {
Target tier
{{ tier.definition }}
}
Edit routing and groups
} @else {
Select a trigger.
}
}
@case ('urgency') {
@if (selectedCell(); as item) {
{{ item.impact }} impact · {{ item.timeSensitivity }} urgency
{{ urgencyBandLabels[item.band] }}
Typical case
{{ item.example }}
Cost of interrupting
Everything promoted here pushes something else back. Widening the
“interrupt” band is a staffing decision, not a settings change.
} @else {
Select a cell.
}
}
@case ('memory') {
@if (selectedMemory(); as kind) {
{{ kind.kind }}
{{ kind.scope }}
Identity caveat
Cross-channel memory is only as good as the identity match. Once
WhatsApp usernames roll out, a phone number stops being a reliable
key — ask for an email or mobile on first contact instead.
} @else {
Select a memory kind.
}
}
@case ('intent-map') {
@if (selectedNode(); as node) {
{{ node.label }}
{{ node.stage }}
@if (hotspot(); as hot) {
Worst hotspot
{{ hot.label }} — {{ hot.dropOff }}% stop here at sentiment
{{ hot.sentiment }}. Losing people who are already unhappy is the
most expensive drop-off there is.
}
See intent → outcome by flow
} @else {
Select a node.
}
}
}