Skip to content

ADR-0010 Amendment 2 — Deduction-rule signal-state labelling

Status: Accepted Date: 2026-05-21 Amends: ADR-0010 (Universal rule layer — UN-prefixed rules) Context: Cycle 6 (deduction-rule signal-state labelling)

What changed

ADR-0010 and its Amendment 1 documented the universal-rule layer and the fallback-chain requirement for geographically scoped sources. Both amendments were silent on how the scoring type of a rule should be surfaced in the UI. Cycle 6 resolves a labelling contradiction that emerged on institution detail pages.

Problem

Deduction rules (E7, S6, G5, G7) start at base_score = 5 (100 on the 0–100 scale) and lose points per adverse finding within a 24-month window. When no findings exist:

  • score_value = 100
  • confidence = 0.00 (scraper returned confirmed-not-found, not a strong positive signal)
  • UI signal-state label: "positive"

This is a contradiction. "Positive" implies affirmative evidence was found; a deduction rule at base score is instead "the scraper ran and found nothing adverse." The distinction matters for how an analyst reads the rule table — a deduction rule at 100 is not the same as a positive rule at 100.

Resolution (migration 025)

A rule_type TEXT NOT NULL DEFAULT 'positive' CHECK (rule_type IN ('positive', 'deduction')) column was added to the rule table. Deduction rules (E7, S6, G5, G7) were backfilled to rule_type = 'deduction'; all other rules default to 'positive'.

Signal-state labels on the institution detail page now use rule_type:

Condition Old label New label
Deduction rule, covered, no findings (score_value ≥ 100) positive no findings
Deduction rule, covered, findings found (score_value < 100) not found findings
Positive rule, covered, evidence found (score_value > 0) positive positive (unchanged)
Positive rule, covered, no evidence (score_value = 0) not found not found (unchanged)
Any rule, not covered no scraper no scraper (unchanged)

A small ded chip is shown on deduction rule rows on the institution detail page and in the rule catalogue on /methodology.

Coverage diagnostic (approach b)

The source_institution_status view remains a 6-status taxonomy (data / inherited / silent / skip / failed / missing). All three deduction-rule sources (BANKTRACK-PROFILES, GOOGLE-NEWS-RSS, NGO-TARGETS) also feed positive rules — a 7th no_findings status would be semantically ambiguous at the source level.

Instead, the /coverage matrix and per-institution Coverage panel mark sources that feed at least one deduction rule with a small d indicator. A silent cell on these sources may be honest no-findings (deduction rule found nothing adverse) rather than a coverage gap. The distinction is documented in docs/design/coverage-diagnostics.md addendum (cycle 6).

  • Migration 025_rule_type.sql — adds rule_type column, backfills deduction rules
  • src/routes/institution.js — updated signal-state labelling
  • views/institution.ejsded chip on rule rows; ded badge on deduction-source coverage rows
  • src/routes/coverage.js + views/coverage.ejs — deduction-source column markers
  • src/routes/methodology.js + views/methodology.ejs — rule catalogue type column; §3.1
  • docs/design/coverage-diagnostics.md — cycle 6 addendum