Rule Catalog
Every rule Hermes evaluates against a case. Each rule has a stable ID that remains valid across methodology versions, so any case you cite today can be replayed and verified by a third party later.
Methodology version 0.16.0. Count: 31 rules.
Weather
| ID | Name | Purpose | Inputs | Source | Since |
|---|---|---|---|---|---|
| WX-AVAIL-00 | Weather data availability | Records whether the weather fetch succeeded; no elimination runs if it didn't. | lat, lon, datetime | Visual Crossing historical | v0.4.0 |
| WX-CLOUD-01 | Cloud cover eliminates reflection/refraction | Clear sky rules out cloud-based optical artifacts; overcast flags them as possible. | cloud_cover_pct | Visual Crossing historical | v0.4.0 |
| WX-WIND-01 | Low wind eliminates buoyancy drift | Low wind weakens sky-lantern / balloon explanations; high wind flags debris. | wind_mph | Visual Crossing historical | v0.4.0 |
| WX-VIS-01 | Low visibility degrades observation | Flags cases where fog/haze undermines distance and shape estimates. | visibility_mi | Visual Crossing historical | v0.4.0 |
Aircraft
| ID | Name | Purpose | Inputs | Source | Since |
|---|---|---|---|---|---|
| AC-AVAIL-00 | Aircraft data availability | Records whether the live ADS-B snapshot succeeded. | lat, lon | ADS-B live snapshot | v0.4.0 |
| AC-DENSITY-01 | Local air-traffic density | Many aircraft in a 50 nm radius flags conventional-traffic candidates; few reduce them. | count | ADS-B live snapshot | v0.4.0 |
Satellites
| ID | Name | Purpose | Inputs | Source | Since |
|---|---|---|---|---|---|
| SAT-AVAIL-00 | Satellite data availability | Records whether the overhead-satellite snapshot succeeded. | lat, lon | N2YO /above endpoint | v0.4.0 |
| SAT-OVER-01 | Satellites in wide overhead cone | Availability count only; line-of-sight elimination needs TLE propagation (planned). | lat, lon | N2YO /above endpoint | v0.4.0 |
| SAT-LOS-01 | Satellite line of sight (TLE-propagated) | Eliminates a report when a catalogued satellite was geometrically consistent with the reported bearing AND sunlit while the observer was in darkness. | lat, lon, when_utc, azimuth_deg, elevation_deg | CelesTrak GP + sgp4 (daily cache) | v0.6.0 |
Celestial bodies
| ID | Name | Purpose | Inputs | Source | Since |
|---|---|---|---|---|---|
| CEL-AVAIL-00 | Celestial computation availability | Records whether PyEphem could compute bodies for the reported time and location. | timezone, datetime, lat, lon | PyEphem local computation | v0.4.0 |
| CEL-MOON-01 | Bright Moon check | Flags bright Moon above horizon; eliminates when Moon is dim or below horizon. | altitude, phase_pct | PyEphem local computation | v0.4.0 |
| CEL-TWI-01 | Twilight illumination | Flags high-altitude-object sunlight-reflection windows (civil/nautical twilight). | sun_altitude | PyEphem local computation | v0.4.0 |
| CEL-PLANET-01 | Bright planet candidate | Flags Venus/Jupiter/Mars/Saturn when above 5 deg and brighter than mag +1.0. | planet_altitude, magnitude | PyEphem local computation | v0.4.0 |
Corroboration
| ID | Name | Purpose | Inputs | Source | Since |
|---|---|---|---|---|---|
| CORR-01 | Corroboration cluster (spatio-temporal) | Flags reports near others in space and time; describes reporting behavior, never claims anomaly. | lat, lon, when_utc | Hermes native case store | v0.6.0 |
Witness observation
| ID | Name | Purpose | Inputs | Source | Since |
|---|---|---|---|---|---|
| OBS-COLOR-01 | Reported color vs. known signatures | Maps reported colors to known conventional sources; rare colors are retained for review. | color | witness report | v0.4.0 |
| OBS-BEHAV-01 | Hovering claim | Hovering alone is not an anomaly; many conventional sources produce apparent hover. | behavior_text | witness report | v0.4.0 |
| OBS-BEHAV-02 | High-acceleration kinematics claim | Preserves kinematic claims as witness-reported, not instrumented measurement. | behavior_text | witness report | v0.4.0 |
Geometry
| ID | Name | Purpose | Inputs | Source | Since |
|---|---|---|---|---|---|
| GEO-DIST-01 | Apparent-altitude ladder | Computes object altitude at candidate distances; shows what geometry admits. | elevation_angle, observer_elev | trigonometric calc | v0.4.0 |
| CAM-GEO-01 | Camera calibration geometry | Checks whether the attributed camera has a registered viewshed cone; a calibrated camera is a triangulation anchor. | camera_id | Hermes camera registry | v0.9.0 |
| GEO-WITNESS-01 | Witness standpoint geometry | Flags cases where no geometry anchor exists; applies quality penalty unless EXIF GPS, a corroborating witness, or a calibrated camera is present. | witness_geometry, media_exif_gps, corroborated, camera_calibrated | witness report + Hermes case data | v0.9.0 |
File provenance
| ID | Name | Purpose | Inputs | Source | Since |
|---|---|---|---|---|---|
| PROV-01 | Provenance record present | Informational (score weight 0). Records whether a cryptographic provenance record was extracted at upload; lists non-null fields. | case.provenance | Hermes media pipeline | v0.10.0 |
Perceptual fingerprinting
| ID | Name | Purpose | Inputs | Source | Since |
|---|---|---|---|---|---|
| FP-01 | Fingerprint recorded | Informational (score weight 0). Records whether a perceptual fingerprint was computed at upload; lists frame count and algorithm version. | case.provenance.fingerprint | Hermes fingerprint pipeline | v0.11.0 |
| FP-02 | Reused-footage candidate | Surfaces near-matches against existing corpus and operator camera references. Does not penalise — analyst review required. Same-witness same-event matches within ±2h are excluded as legitimate corroboration. | case.provenance.fingerprint.match_candidates | Hermes fingerprint index | v0.11.0 |
Known-object exclusion
| ID | Name | Purpose | Inputs | Source | Since |
|---|---|---|---|---|---|
| EXC-01 | Exclusion engine ran | Informational (score weight 0). Records whether the exclusion engine ran, why or why not (preconditions report), and the catalog query summary. | case.exclusion_results | Hermes exclusion engine | v0.12.0 |
| EXC-02 | Known-object candidate match | Surfaces candidate matches from external catalogs (ADS-B, satellites, astronomical, weather context). Does not exclude — analyst review required to confirm or reject any specific candidate. The presence of a match does not invalidate a sighting; the absence does not validate it. | case.exclusion_results.catalogs | Hermes exclusion engine | v0.12.0 |
| EXC-03 | Clean of known objects | All four exclusion catalogs were queried and found no candidate matches within the sighting envelope. This does not prove anomaly; it documents an honest absence of mundane explanation. | case.exclusion_results.summary.total_matches | Hermes exclusion engine | v0.12.0 |
AI-provenance signals
| ID | Name | Purpose | Inputs | Source | Since |
|---|---|---|---|---|---|
| AI-01 | AI-provenance signal panel ran | Informational (score weight 0). Records whether the AI-provenance signal panel ran and which sub-signals returned data. No signal in this panel claims a verdict on authenticity — each surfaces one independently-scored measurement for analyst review. | case.provenance.ai_signals | Hermes AI-provenance pipeline | v0.13.0 |
| AI-02 | C2PA result | Mirrors the C2PA Content Credentials result from provenance extraction. Verdict: passed if a valid manifest was verified, flagged if present but invalid (possible tampering or re-encode), no_data if absent. Absence is not evidence of AI generation — most consumer devices do not yet sign with C2PA. | case.provenance.ai_signals.c2pa | c2pa-python / Content Credentials | v0.13.0 |
| AI-03 | Codec forensics findings | Four codec and container sub-signals, each with its own analyst note and failure-mode disclosure: software_tag_suspicious (EXIF Software field matches known AI-generation tool list), bitrate_suspicious (exact round-thousand kbps CBR), container_codec_mismatch (pairing not produced by real cameras), gop_anomaly (intra-only, atypically tight, or closed-GOP synthetic pattern). Triggers flagged when any sub-signal fires. Score weight 0. | case.provenance.ai_signals.codec_forensics | Hermes codec forensics (pure provenance) | v0.13.0 |
| AI-04 | Sun-shadow geometry available | Computes the expected sun azimuth and elevation at the witness location and sighting time using Skyfield + DE421 ephemeris. Hermes computes where the sun was; the analyst confirms whether shadows in the frame agree. Automatic shadow-direction extraction from imagery is deferred to a future version. | case.provenance.ai_signals.shadow_check | Skyfield + DE421 ephemeris | v0.13.0 |
| AI-05 | PRNU sensor-noise match | Compares the sensor noise fingerprint (Gaussian residual of the green channel, 256×256) from this upload against the calibrated reference fingerprint stored for the registered camera. Match threshold: ≥ 0.05 normalized cross-correlation. Real same-sensor matches typically score 0.05–0.20; different-sensor or AI-generated content scores near zero. Only runs when the case comes from a registered camera with a reference-media fingerprint on file. Score weight 0. | case.provenance.ai_signals.prnu_check, cameras[].prnu_fingerprint | Hermes PRNU pipeline (numpy/Pillow) | v0.13.0 |
How rules work
Every rule carries five pieces of state: inputs it received, the data source it queried, the result it got, a verdict (eliminated, flagged, indeterminate, no_data, or passed), and a plain-language explanation of what that verdict means for this case.
A rule marked eliminated means Hermes found positive evidence that a conventional explanation is ruled out in this case. A rule marked flagged means a conventional explanation remains plausible and should be investigated further. Indeterminate means the rule ran but the evidence is not strong in either direction. No data means the rule could not run because an input source was unavailable, and the case is treated as less-audited for that category.
Rules never describe the underlying phenomenon. They describe the signal and the audit. This is intentional: Hermes is an analysis platform, not an interpretation engine.
Planned additions
- SAT-LOS-01 TLE-propagated line-of-sight check against the observer's bearing and elevation, so satellite eliminations become strict rather than availability-only.
- AC-HIST-01 historical ADS-B backfill at the exact sighting time, replacing the live-snapshot AC-DENSITY-01 for stronger elimination.
- WX-PRECIP-01 precipitation-type classifier (rain/snow/fog) with optical-distortion priors.
- EXIF-01 photo/video EXIF consistency check (timestamp, GPS, lens metadata) when media is attached.