assert is in heal.actions, the context has a role, a name and a test id. The step fails with an ordinary Playwright assertion error and there is no entry in heal.jsonl for it. Is expectHidden just not wired up yet?
It is wired up to do nothing, on purpose. expectHidden() asserts on the primary locator and never goes through the healer:
ts
async expectHidden() {
// negative assertions are never healed
await expect(this.primary).toBeHidden();
}
The reason is that "not visible" is trivially satisfied by a locator that matches nothing. If we healed a negative assertion, any candidate that found zero elements would make it pass, and the assertion would be worthless. So the primary is the assertion, and if the primary is wrong you get told.
isVisible() has the same shape for the same reason — it reads the primary and returns a boolean rather than resolving through the healer. expectVisible(), expectText(), textContent() and innerText() all do heal.
Practical consequence worth knowing: a locator you only ever use in a negative assertion gets no heal coverage at all, which means a rename there fails loudly instead of drifting. That is the right outcome. It also means the fragility statistics never see it, since those are computed from heal events.
If that matters to you, assert the positive somewhere too. A banner that must appear before it disappears usually has a natural place for it.
This caught us on expectText as well, but in the other direction — we assumed it was excluded like expectHidden and it is not, it resolves through the healer with the assert action. So a text assertion can pass against a healed element.
Worth writing down which side of the line each method is on before you rely on either.