# Walkaround: methodology

Walkaround is a market dashboard for automated aircraft inspection, the business Mainblades is in (drone-based general visual inspection of airliners inside and around hangars). It combines a live news feed, a live regulatory feed and a compiled body of research on the companies, the adopters, the rules and the figures. This file says where every part comes from, what was checked and what was not.

## The rule for compiled facts

A fact appears on the dashboard only if the record behind it carries:

- `url`: a page that was fetched during the research session (never reconstructed from memory)
- `quote`: a passage of at most 40 words copied verbatim from that page
- `verified: true`, set by the researcher only after the fetch
- `accessed`: the date of the fetch
- `confidence`: high (primary source: company, regulator, filing), medium (trade press), low (secondary or database listing)

`build_data.py` drops any record that lacks a URL beginning with http, a non-empty quote or `verified: true`. Dropped records stay in `research/*.json` for the audit trail and are counted as "hidden" in the Sources view. A company with no surviving facts is not shown at all.

The research files are:

| File | Module | Fields beyond the common schema |
|---|---|---|
| `research/players_drone.json` | Drone-based inspection companies | company profile plus a `facts` array |
| `research/players_other.json` | Crawler robots, camera gantries, inspection software, engine robots, in-house programs | same shape |
| `research/adoption_timeline.json` | Airlines, MROs, OEMs and militaries adopting or trialing the tools | `date`, `operator`, `operator_type`, `operator_country`, `vendor`, `stage`, `aircraft_types`, `lat`, `lon` |
| `research/regulation.json` | Rules and policies | `jurisdiction`, `topic`, `instrument`, `status`, `date`, `effect_on_market`, `next_milestone` |
| `research/figures.json` | Numbers | `topic`, `value`, `unit`, `period`, `breakdown`, `breakdown_unit`, `series`, `region` |
| `research/mainblades_relationships.json` | Mainblades' publicly announced customers, partners, approvals and suppliers | `entity`, `relationship_type`, `description`, `source_urls` |

The schema is in `research/SCHEMA.md`. Each research file has a `_NOTES.md` companion listing the searches run, the pages that refused to load and the leads that could not be verified.

### What "verified" does and does not mean

Verified means the quote was on the page when it was fetched. It does not mean the claim is true, current or complete: a company's own inspection-time figure is a vendor claim; a trade-press number may be an estimate; two sources can disagree, and where they do both records are kept with the conflict noted. Figures come from the organisations that publish them, in their own editions and definitions, and are not reconciled with one another.

### The re-check

`verify_quotes.py` re-fetches every URL without a browser and searches the page text for the quote (normalised for punctuation, case and whitespace; a quote also counts if any run of eight consecutive words is present, because quotes often cross a formatting tag). Results go to `research/AUDIT.json` and `research/AUDIT.md`, and `build_data.py` attaches them to each record as `audit`:

- confirmed: the words are on the page today
- not_found: the page loaded but the quote is not on it (the page changed, or the researcher mis-copied; worth a look)
- unreachable: the publisher refused the script (Aviation Week and several others block automated requests); this says nothing about the claim
- unchecked: PDF sources and records without a quote

The Sources view shows the tally and the status of every record. The evidence drawer (click any dotted-underlined fact or number) shows the quote, link, dates, confidence and re-check result for one record.

## Live parts

**News.** The News view and the "this week" panels read `curated.json`, `sources.json` and `archive.json` from the Hangar News Engine (https://joshgreenman1973.github.io/hangar-news-engine/), a keyword-ranked feed of about 50 trade, drone and regulator sources rebuilt every 30 minutes. Its ranking is documented on that site's "How it ranks" tab: closeness to Mainblades is a plus-up (Mainblades or Checkbird named; direct peers or reported Checkbird operators; adjacent automation), automated inspection scores highest among ordinary signals, and government action is weighted near it. No language model is involved in ranking.

The dashboard's own derivations from that feed:

- Stories per week: count of archive stories by ISO week of publication, split by whether the story is in ring 0 or 1. The archive began on 12 September 2026, so earlier weeks contain only what the engine's search desks reached back for and undercount.
- Companies in the news: archive stories whose headline or summary contains a tracked company's name or alias (whole-word, case-insensitive). A story can count for several companies.
- Government action per week: stories the engine flagged as government action, by week.
- Who is writing it: stories per publisher.

If the feed cannot be reached, the page says so in place and falls back to `data/news-snapshot.js`, saved by `build_data.py` at build time, and labels every count as a snapshot.

**Federal Register.** Read live from https://www.federalregister.gov/api/v1/:

- Airworthiness directives, last 30 days: `documents.json` with agency = FAA, type = RULE, term = "airworthiness directives", publication date on or after 30 days ago. The count includes any final rule whose text contains that phrase, so it can include corrections and a few non-AD rules.
- Airworthiness directives per month: `documents/facets/monthly.json` with the same conditions, last 24 months.
- Rule feed: the newest eight documents affecting each of 14 CFR Parts 107 and 108 (small unmanned aircraft; beyond-visual-line-of-sight operations) and Parts 43 and 145 (maintenance; repair stations), merged and sorted by date. The overview's "items on Parts 107 and 108 this year" counts within those latest eight per part, so it is a floor.

If the API does not answer, the counts show as unavailable rather than as zero.

## What is analysis, not fact

- "What it means" lines on regulation cards and the choice of what to track.
- Region groupings of countries in the Adoption view.
- Approach labels for companies (drone, crawler, gantry, software, robot arm, in-house, engine robot).
- Colours and ordering.

## Rebuilding

```
python3 build_data.py        # compiles research/*.json into data.js and refreshes the news snapshot
python3 verify_quotes.py     # re-fetches every source and writes research/AUDIT.*
python3 build_data.py        # again, to attach the audit results
```

A GitHub Actions workflow runs the same three steps daily so the fallback snapshot stays fresh and drift in source pages shows up in the Sources view.

## Known limits

- Keyword news ranking misfires: a story can mention "inspection" and "aircraft" without being about either.
- Trade outlets read through Google News lag by hours and link through a redirect.
- Companies without a fetchable page are absent, which favours firms with English-language press.
- Adoption events are public announcements; a quiet year can mean no press rather than no work.
- Coordinates for companies and operators are approximate (headquarters or main base).
