How we read a dog.
This page exists so that you never have to take our word for anything. The whole interpreter is a small, readable table of weights and a page of arithmetic. Here it is, including the formula, the thresholds, and the places where it is weakest.
The principle
We infer states, never sentences. A state is an emotional or motivational condition, something like “defensive, asking for distance”, that is associated with a cluster of observable signals in a given context. We do not claim to know what a dog is thinking, because nobody can.
Three commitments follow, and they shape every design decision here:
- Clusters over cues. One signal is almost never diagnostic. The engine is deliberately built so that a single cue cannot produce a confident answer.
- Context is data, not decoration. The same posture beside a food bowl and on a walk are different observations. Context is mandatory input, and the engine refuses to run without it.
- Uncertainty is displayed, never hidden. Where two readings fit almost equally well, you are shown both.
The signal lexicon
The interpreter recognises signals grouped by body region: ears, eyes, mouth and face, tail position, tail movement, body and weight, hackles, displacement behaviours, and sound. Position and movement of the tail are separate inputs, because they carry different information and combining them is a common source of misreading.
Each signal carries a weight vector across ten states: relaxed and affiliative, playful, alert and curious, conflicted, fearful and avoidant, defensive and warning, resource guarding, appeasement, over-aroused, and possible pain. Every weighted association carries at least one source and an evidence tier. You can read the entire table in the page source of /assets/js/kb.js, and every rule that fires on your own reading is printed in the receipt underneath the result.
The formula
There is no machine learning here and no randomness. The whole calculation is four steps, and it is deterministic: the same ticks always produce the same output, in the same order, on any device.
- Score. For each state s, sum the weights of every selected signal that votes for it:
score(s) = Σ weight(signal, s). - Gate. Multiply by every applicable context modifier:
gated(s) = score(s) × Π gate(context, s). Food present multiplies resource guarding upward; an active game multiplies warning downward; a hot day suppresses the arousal reading of panting entirely, because heat already explains it. - Normalise.
share(s) = gated(s) / Σ gated. The top share is then hard-capped at 0.85. The interpreter is structurally incapable of reporting certainty. - Band. The margin between first and second place,
(top − second) / top, is combined with the signal count and the corroboration count to select a worded band.
Confidence bands, defined
| Band | What it means | Condition |
|---|---|---|
| Insufficient signal | We will not guess. Too little was recorded to say anything responsible. | Context incomplete, or fewer than two weighted signals |
| Ambiguous | Two or more readings fit almost equally. The honest answer is that this could go either way. | Margin below 0.12, or share below 0.26 |
| Plausible | One reading fits better, but not decisively. Treat it as a working hypothesis and check the next signal. | Margin at least 0.12 and share at least 0.26 |
| Consistent | The signals agree with each other and with the context. This is the strongest band we issue, and it is still not certainty. | At least 3 signals, at least 2 corroborating the winner, margin at least 0.22, share at least 0.38 |
The three locks
These are hard constraints in the code rather than guidelines, and each is covered by an automated test that must pass before the site is built.
- The context lock. With no setting and no active situation recorded, every reading returns Insufficient signal, regardless of how dramatic the signals are. A growl with no context is not an interpretation, it is a fragment.
- The single-signal lock. One cue can never produce a reading. Two cues can never reach Consistent. This is the mathematical expression of “read the whole dog”, and it is the constraint most often violated by popular dog content.
- The certainty cap. The normalised share cannot exceed 0.85, and no interface element ever displays a confidence of 100%.
Evidence tiers
Every claim carries a tier, so you can see the difference between an experimental finding and an experienced practitioner's observation. Both are useful. They are not the same thing, and a site that blurs them is not being straight with you.
T1 — peer-reviewed primary
- Published experimental or observational research with methods and peer review.
T2 — scholarly text
- Authored academic or clinical texts, such as veterinary behaviour manuals and coding systems.
T3 / T4 — bodies and consensus
- Professional-body position statements, and documented clinical consensus including well-established practitioner frameworks.
Where a claim rests only on practitioner observation, as with the calming-signals framework, the entry says so explicitly rather than borrowing the authority of experimental work.
Pain policy
Every single result carries a pain differential, including results where nothing suggests pain. This is deliberate and it is not a disclaimer for its own sake: a meaningful share of dogs referred for behaviour problems have a painful condition contributing to the behaviour, and it is routinely missed. A yelp, trembling, a held paw, unexplained panting, or a recorded history of pain or old age all raise the pain state directly and change the wording to an active recommendation.
The rule we ask you to carry away is simpler than any of our arithmetic: new or changed behaviour means vet before trainer.
Where this method is weakest
An honest method has to publish its own failure modes.
- It cannot see. Everything depends on your observation, and observation is a skill. Two people watching one dog will tick different boxes.
- It has no baseline for your dog. A naturally high-tailed, curly-tailed, cropped-eared, heavily-coated, brachycephalic or docked dog is systematically harder to read, and the same tick can mean different things across body types.
- It sees one moment. Behaviour is a sequence. A still frame cannot capture what came immediately before, which is often the whole story.
- The weights are a judgement. They are informed by the literature, but the specific numbers are a modelling choice, not a measured constant. Reasonable experts would set some of them differently.
- The evidence base is uneven. Vocalisation and facial anatomy have decent experimental coverage. Much of the fine-grained body-language vocabulary rests on clinical and practitioner consensus rather than controlled study.
- It is not validated against expert coding. We have not run this against blinded behaviourist ratings, which is what would be required to claim accuracy. We do not claim accuracy. We claim transparency.
Review, authorship, and corrections
This site was built from, and checked against, the sources in the register. Each entry names the works behind it and grades them.
On expert review, plainly. This method has not yet been signed off by a named board-certified veterinary behaviourist. We are not going to imply otherwise, invent a reviewer, or display credentials we have not earned — the entire point of this project is that it does not do that sort of thing. Securing a credentialed reviewer is the next commitment on this page, and when it happens the reviewer will be named here with their credentialing body.
Think we got something wrong? Corrections are genuinely welcome, particularly from behaviour professionals. Write to hello@plainforge.com with the page and the specific claim. Substantive corrections are made to the source of truth in the knowledge base, which updates the interpreter and every affected entry at once, and the change is logged below.
Changelog
| Version | Date | Change |
|---|---|---|
| 1.0 | First published method: ten-state lexicon, mandatory context, single-signal lock, certainty cap, evidence tiers, per-result receipt, and pain differential on every reading. |