A fleet index becomes trustworthy when it shows what should exist, what has been found, what has been checked, and where its knowledge runs out.
“What is in the fleet?” sounds like a request for a list. I used to treat it that way. Gather the known nodes, attach their latest status, count the rows, and make the summary easy to scan.
The trouble was that the clean list hid the most useful facts. A node we expected but couldn't reach looked much like one we had never discovered. An old observation sat beside a new one with no visible difference. If discovery missed a target entirely, the total got smaller and the percentage could actually look better. Very tidy. Also wrong.
I ended up separating five claims in the fleet index: desired, observed, verified, stale, and unknown. They aren't stages marching toward a green badge. They answer different questions, and several can be true about the same node at once.
Desired is declared intent
Desired state says which nodes are expected to exist and what the fleet record says about them. It comes from an authorized inventory source, so I keep that source and its age beside the claim. Without provenance, “expected” can mean somebody typed it once and nobody has looked since.
This claim matters before discovery begins. If the index expects a node and discovery doesn't find it, the node can't simply disappear from the denominator. The desired record gives the index something concrete to disagree with.
Desired state can be old without being invalid. Fleet membership may change slowly, and a long-lived record may still be authoritative. I don't guess. I show when the intent was last established and where it must be changed. That gives an operator enough context to decide whether the record is current policy or an item that needs review.
Observed is what discovery found
Observed state records what a discovery source actually found at a particular time. It needs the discovery source, the target identity it matched, and the observation time. “Found” without a timestamp has a remarkable ability to look current for months.
Identity matching deserves some suspicion here. A newly observed target may correspond to an existing desired node, or it may be genuinely undeclared. The index can propose a match, but it shouldn't quietly merge uncertain identities to make the inventory balance. I'd rather show one desired node without an observation and one observed target with unknown ownership until the evidence supports joining them.
An observation is still useful when it doesn't settle everything. It establishes that discovery found this target from this vantage point at this time. Keeping the statement narrow prevents the index from turning a partial sighting into a broad claim about the whole fleet.
Verified is evidence checked against a claim
Verified state says that current evidence was evaluated against a defined fleet claim. The check may confirm that the observed identity matches the desired record or that required inventory evidence is present. Whatever the claim, the index records what was checked, when it was checked, and where the supporting evidence lives.
Verification doesn't mean “this node is fine.” It means a specific claim passed a specific check. That limit needs to survive aggregation. Otherwise a narrow verification grows into confidence the evidence never supplied.
Desired, observed, and verified can disagree without any of them being useless. A node may remain desired, have no current observation, and retain an older successful verification that is now too old for the decision at hand. That combination tells me much more than a single warning state. I know what we expected, what discovery failed to find this time, and what we used to know.
I also keep the evidence link close. If I can't get from the fleet row to the basis for verification, I'm being asked to trust the index as an oracle. I built the thing, and even I don't grant it that promotion.
Stale is a claim about age
Stale means the available observation or verification is older than the freshness required for a particular decision. It doesn't rewrite the old result as a failure, and it doesn't pretend the old result is current.
That distinction matters with inaccessible nodes. The index may still have a last observation and a last verification. I keep both visible, mark their age, and stop using them as present-tense evidence once they cross the relevant freshness limit. “Last verified, now stale” is honest. “Verified” by itself isn't.
Different claims can have different useful lives. Desired fleet membership may remain credible longer than a discovery observation. Verification may have a tighter freshness requirement when an operator is about to rely on it. One global timeout would be convenient to implement and difficult to defend, so the index evaluates age against the claim being made.
Age also explains why the same stored evidence can support one decision but not another. I don't need to delete it or paint it red. I need to show its date and decline to oversell it.
Unknown preserves the coverage boundary
Unknown means the index can't currently make a claim. That can happen because a desired node is inaccessible, discovery did not cover part of the expected fleet, a target was observed but not matched, or the required evidence has never been collected.
I keep those cases visible because unknowns define the coverage boundary. If three expected targets were not reached, a summary of the reachable set is not a fleet summary. The index reports the covered population and the excluded or unresolved population separately. It also says when that coverage was measured.
Undiscovered targets are harder because the index cannot list what neither desired state nor discovery knows about. The honest response is a limit, not a guess: which discovery sources ran, which expected scope they covered, and which scope remains unaccounted for. A total without that note is more confidence than arithmetic deserves.
This changed what I look at first. I no longer start with the favorable percentage. I look for desired nodes without observations, observations without desired matches, verification that has aged out, inaccessible nodes, and uncovered discovery scope. Those are the places where the fleet index is telling me what it cannot establish.
The summary can stay compact, but it has to keep its denominator honest. On a bad day, that may mean the top line says current evidence covers only part of the expected fleet. I'd rather make an operating decision with that uncomfortable number than admire a better one produced by missing rows.