Methodology
Where did this value come from?
commerce_platform = Adobe Commerce. Follow it back to the observation. Open the source and check that support it.
The result
In this example, Kaiju adds Adobe Commerce to the company row. The original account ID, domain, owner, and other supplied fields stay attached.
Start with the spreadsheet
Watch one uploaded row come back with new fields
Kaiju keeps the original columns, then adds company, technology, and evidence columns beside them.
companies.csv
One company from the uploaded file
0 of 3 fields added
Original file
record_id
company_1842
website
lumen.example
company_name
Lumen Systems
Updated file
matched_website
…
waiting
technologies
…
waiting
evidence
…
waiting
The observation
Kaiju records what the public site exposed. An observation can come from a page, asset, request, response, header, or browser-visible signal.
The observation is source material. It is not the final finding.
The source
The observation keeps the public source and the time it was collected. That gives the returned value a path back to the evidence a person can inspect.
The check
A check tests whether the observation supports the requested field. It records the result and supporting evidence.
Why facts form a system
The same contract protects the claim from collection to export
The registry defines the meaning. The fact carries the supported answer. The aggregate and export keep the source fact identifiers.
1
Contract
Defines which subject, value, and assertions are valid.
technology.presence · v1
2
Supported finding
Stores the answer together with the public observation that supports it.
Shopify · 98%
3
CSV column
Adds the supported value to the returned company row.
technologies = Shopify
The sample aggregate still cites 2 source facts.
Open the registry and aggregate records
{
"id": "technology.presence",
"label": "Technology presence",
"factKindVersion": 1,
"facets": [
"technology",
"service_inventory"
],
"subjectType": "domain",
"objectType": "software",
"allowedAssertions": [
"declared_by_page",
"observed_resource",
"inferred"
],
"dedupeFields": [
"domain",
"crawl",
"subject.type",
"subject.key",
"factKind",
"value"
],
"aggregation": {
"id": "site_technology_inventory",
"grain": [
"domain",
"crawl"
]
}
}{
"schemaVersion": 1,
"id": "site_technology_inventory:crawl=browser-2026-07-22&domain=lumen-goods.example",
"runId": "run_20260722_1432",
"crawl": "browser-2026-07-22",
"domain": "lumen-goods.example",
"aggregationId": "site_technology_inventory",
"aggregationVersion": 1,
"grain": {
"domain": "lumen-goods.example",
"crawl": "browser-2026-07-22"
},
"factCount": 2,
"supportCount": 2,
"factKindCounts": {
"technology.presence": 2
},
"factValueCounts": {
"technology.presence": {
"Shopify": 1,
"Klaviyo": 1
}
},
"routeFamilies": [
"commerce.product"
],
"sourceFactIds": [
"fact_4f2885c1",
"fact_b7d996e2"
],
"createdAt": "2026-07-22T14:33:02.000Z"
}The export
Kaiju adds the supported finding to the original row. The CSV carries the value. The evidence remains available behind the field.
One returned cell
The exported value can still point back to its source
Select a field. The path stays short: returned cell, supported fact, public observation.
Returned CSV cell
technologies
Shopify; Klaviyo
Supported fact
technology.presence
Shopify
Public observation
scriptSrc
https://cdn.shopify.com/shopifycloud/storefront/assets/storefront.js
Kaiju reads the canonical technology.presence facts produced for this domain and crawl.
When evidence is messy
A missing match is not automatically a negative result. Kaiju first checks whether the required research completed.
| State | Meaning |
|---|---|
| Present | The collected evidence supports the finding. |
| Not detected | The required public check completed and found no matching evidence. |
| Unknown | The required checks did not support either conclusion. |
Public evidence cannot establish:
- Private budget or purchase intent
- Contract value
- Internal ownership
- Systems that leave no public trace