Product decisions field note

Why “unavailable” never means “active” in a license check

A licensing service can fail because a number is wrong, a register is incomplete, or the public endpoint is down. Collapsing those cases into a green status would make the software look calmer by making the decision less trustworthy.

On a supported check, Sealinn preserves unavailable for a timeout or unreadable date instead of treating it as active. The best-effort worker skips unsupported states, and current screens do not expose its stored result, source, or attempt time. Check the issuing authority before deciding.

Key takeaways

  • No response is not evidence of good standing. A network or parsing failure says something about the check, not the contractor.
  • The three current data sources answer different questions. Washington publishes status, Oregon publishes an active-only file, and Texas publishes expiry without a status column.
  • The stored trail is narrower than the adapter output. Sealinn saves the result, named source, and attempt time. Source-specific detail is not persisted, and current product screens do not display these fields.
  • Classification still needs a person. A current number does not establish that the license class covers the work in your subcontract.

By the Sealinn team · 5 min read · Published August 22, 2026 · Written for general contractors reviewing subcontractor licenses

Editorial note: Written from the current Washington, Oregon, and Texas adapters and their unit tests, then checked against each official dataset. No legal conclusion or coverage promise is made.

Three missing answers that should not look the same

A number can be absent from the register. The register can be reachable but omit the field needed to classify the result. Or the register can fail to answer at all. Those are different facts. Sealinn uses not found when the queried dataset affirmatively contains no matching row, unavailable when the system cannot establish a result, and the source's own active, inactive, or expired signal only when the data supports it. The longer contractor-license verification guide remains the owner of the manual lookup procedure; this note explains one product decision behind the automated check.

SourceWhat the public data containsWhat a positive result meansImportant limit
Washington L&IContractor registration number, explicit status, expiry and business nameThe registration row is active and its readable expiry has not passedThis is contractor registration, not every separate trade credential
Oregon CCBAn active-license dataset with expiry and business detailsThe number appears in the active file and the readable expiry has not passedAbsence does not say whether the cause is lapse, revocation, or a mistyped number
Texas TDLRLicense type, number, owner or business, and expiry—but no status columnThe matching row has a readable date that has not passedThe result reflects expiry only; plumbing uses a different board and register
The current adapters encode the limits of each public source instead of smoothing them into one generic answer.

Why an optimistic fallback is worse than an explicit unknown

A fallback of active makes outages invisible exactly when the user relies on the result. It also creates a bad incentive: the less reliable the source integration becomes, the more green statuses it produces. The safe fallback is not to accuse the subcontractor either. Unavailable is deliberately neutral. It means the software could not establish the register's answer, so the record needs a later retry or a manual lookup—not that the license passed or failed.

Unavailable describes the check, not the subcontractor

Do not suspend a crew because a government endpoint timed out, and do not clear one because the same endpoint timed out. The checker preserves that uncertainty in its stored status. Because the current UI does not show the automated-check trail, use the issuing authority's own record for the decision.

What the current worker records after a supported check

For supported state and dataset pairs, the current scheduled sweep makes a record eligible when it has never been checked or its last attempt is more than seven days old, then selects at most 200 records per run. This is a best-effort scheduling rule, not a guarantee that every supported record is checked each week: completion still depends on the cron, queue, worker, and public dataset being available. When a check runs, the worker stores the result, the named source, and the time of the attempt. The adapter also produces a source-specific explanation while it runs, but the current schema does not persist that detail and current product screens do not display the automated-check fields. A definite negative can emit a `subcontractor.compliance_changed` webhook once when the result changes. An unavailable result is stored for a supported check failure but is not treated as a definite negative attributed to the subcontractor. Human review remains the decision boundary.

  • A Washington response can carry the register's own status word, such as active or suspended.
  • An Oregon miss says the number is not in the active-only dataset; it does not invent the reason.
  • A Texas match is evaluated from the expiry field because that dataset publishes no status column.
  • Within a supported check, a timeout, rate limit, blank number, or unreadable decisive field becomes unavailable. Unsupported states are skipped by the scheduled sweep and require a manual lookup.
  • The original license document and extracted fields remain available for a human check; the automated result does not replace classification review.

What to do when the result is unavailable

  1. Start from the stored license document. The current product UI does not expose the automated source, result, attempt time, or transient adapter detail as a decision trail.
  2. Confirm the issuing authority and number on the document. State abbreviations and bare numbers are not enough when several trades use overlapping formats.
  3. Use the issuing authority's own search, then compare the legal name, status, expiry, bond or insurance information where published, and classification with the work.
  4. Save a dated record of what you saw and set a follow-up if the public source is temporarily unavailable. Audit-day records explains why the dated evidence matters later.

The boundary still applies even after a positive result

An active or current result is narrower than “approved to perform this subcontract.” Washington's dataset describes contractor registration. Texas TDLR covers many licensed occupations but not plumbing and does not publish a status field in the dataset used here. None of the three adapters interprets whether a classification covers your scope. That decision remains with the issuing authority and your own review. What Sealinn checks draws the same boundary for certificates, W-9s, safety cards, and licenses.

Questions about the status

Does not found mean the person is unlicensed?

Not by itself. It means the queried dataset returned no matching row. The number may be wrong, the authority may be different, or—especially with an active-only dataset—the license may no longer be current. Check the issuing authority directly.

Why not retry until the check returns something?

Retries are useful for temporary failures, but hiding every failed attempt until a positive answer arrives creates selection bias. The worker stores an attempt time so an unreachable source does not put the same row at the front of every nightly run. That time is not currently shown in the product UI, so use a manual follow-up when the board is unavailable.

Will Sealinn automatically check every U.S. state?

No. The scheduled worker selects only the documented public datasets for Washington, Oregon, and Texas. Unsupported states are skipped; they are not assigned an active result or a customer-visible unavailable result. Use the issuing authority's own lookup until another verifier is implemented.

Where this comes from

Track the document and the check without hiding the gap.

Start with your own subcontractors, track the license document and expiry, and use the issuing board's record for the final check.