Skip to content

ADR-0010 Amendment 3 — UN-G4 / G7 overlap: scope differentiation

Status: Accepted Date: 2026-05-21 Amends: ADR-0010 (Universal rule layer — UN-prefixed rules) Context: Cycle 8 (BankTrack monitor + UN-G4/G7 overlap audit)

Background

ADR-0010's "consequences to verify" section recorded the UN-G4 / G7 overlap as a known risk:

Both rules cover "Governance controversies (24m)" and both source from google-news-rss. If both fire on the same article, the institution is penalised twice for the same finding.

This audit was raised to a priority item in cycle 11, which confirmed that structural issues in the universal-rule layer (silent source gaps, scraper branch errors) are real and recurring. The overlap was parked pending the Google News RSS scraper build; it is resolved here before that build ships in cycle 9.

Audit findings

Rule definitions

G7 — Governance controversies (24m lookback) - applicable_sectors = '40' (financials only) - rule_type = 'deduction' - base_score = 5, score_floor = 0, score_ceiling = 5 - source_id = 'GOOGLE-NEWS-RSS' - Sub-rules: G7.1 (−2 exec departure under regulatory cloud), G7.2 (−1 shareholder revolt on governance), G7.3 (−2 audit/accounting irregularity), G7.4 (base +5 when no deductions fired — aggregate sub-rule).

UN-G4 — Governance controversies (24m) - applicable_sectors = 'ALL' - rule_type = 'positive'mislabelled (see below) - base_score = 5, score_floor = 0, score_ceiling = 5 - source_id = 'GOOGLE-NEWS-RSS' - Sub-rules: UN-G4.1 (−2 exec departure under regulatory cloud), UN-G4.2 (−1 shareholder revolt on governance), UN-G4.3 (−2 audit/accounting irregularity). Notes cap total deductions at −3 across sub-rules.

The two rules are structurally identical in triggering events, deduction magnitudes, time window, source, and scoring bounds.

Is double-penalisation confirmed?

Yes. For financial institutions (gics_sector_code = '40'), the rule evaluator applies both G7 (because applicable_sectors='40' matches) and UN-G4 (because applicable_sectors='ALL' fires universally). A single google-news-rss finding for, say, a senior executive departure under regulatory cloud would:

  1. Write a signal row
  2. Cause G7.1 to fire → −2 from G7's base of 5
  3. Cause UN-G4.1 to fire → −2 from UN-G4's base of 5

The same governance event reduces the G-pillar score twice. Double-penalisation is confirmed for all three triggering event types.

Does the cycle-6 rule_type distinction address this?

No. The rule_type column ('positive' vs 'deduction') is a UI labelling distinction. It controls how the signal-state chip renders on the institution detail page and in the rule catalogue. It has no effect on scoring logic or on whether both rules fire for the same signal. The cycle 6 distinction resolves the "no findings" vs "positive" label contradiction; it does not deduplicate rules that share a source.

Secondary finding: UN-G4 rule_type mislabelling

UN-G4 is structurally a deduction rule (starts at base_score=5, applies negative points per adverse finding) but its rule_type column reads 'positive'. The cycle 6 backfill (migration 025) correctly labelled E7, S6, G5, G7 as 'deduction' but missed UN-G4 because UN-G4 was added in the universal-rule layer, not the financials-only catalogue. The mislabelling is independent of the overlap issue but must be corrected alongside it.

Secondary finding: GOOGLE-NEWS-RSS feeds_rules stale

signal_source.feeds_rules for GOOGLE-NEWS-RSS reads ["S5","S6"]. The actual rules that reference GOOGLE-NEWS-RSS as their source_id are: E7, G5, G7, NF-E4, NF-S4, NF-S5-CD, S6, UN-G4. The field is stale and must be updated.

Decision: scope differentiation

Options considered

Option (a) — DEDUP: Keep both rules; modify the scraper or scoring engine so a finding routes to one rule only (explicit logic for which). Rejected. Adds routing complexity in cycle 9 — the scraper would need institution-type awareness to select between G7 and UN-G4 at write time, or the scoring engine would need a dedup pass. The fundamental structural redundancy remains hidden and will confuse future maintainers.

Option (b) — RETIREMENT: - Retire UN-G4 (keep G7): Non-financial institutions lose all governance controversy coverage. UN-G4 is the only governance controversy rule in the non-financial catalogue. Not acceptable — defeats the universal-rule layer's purpose. - Retire G7 (keep UN-G4): Financial institutions score governance controversies via UN-G4 only. UN-G4 lacks G7's base-score sub-rule (G7.4) and its −3 cap is tighter than G7's uncapped deductions. A methodology-surface change that lightly penalises financials relative to the prior v0.4 workbook baseline, and loses the deduction sub-rule type distinction that G7.4 encodes. Rejected on methodology grounds.

Option (c) — SCOPE DIFFERENTIATION (chosen): Change UN-G4's applicable_sectors from 'ALL' to the non-financial sector list ('10,15,20,25,30,35,45,50,55,60'), making UN-G4 the non-financial counterpart of G7 rather than a universal rule that duplicates G7 for financials.

Result: - Financial institutions: G7 only. Unchanged from v0.4 workbook behaviour. - Non-financial institutions: UN-G4 only. Provides governance controversy coverage for sectors that G7 never covered. - No loss of signal for any institution type. - No scraper routing logic required in cycle 9 — the scoring engine already filters by applicable_sectors. - Clean methodology surface: each institution type has exactly one governance controversy rule.

Rationale for UN-G4's original 'ALL' scope being an error

ADR-0010 describes the universal layer as covering "behaviours that any institution can reasonably be expected to address irrespective of what it sells or finances." Governance controversies are in that category. However, the implementation intent was to give non-financials a rule that G7 already provides for financials — not to apply an additional governance controversy deduction on top of G7 for financials. The applicable_sectors='ALL' assignment was a cataloguing error made when UN-G4 was seeded alongside the other universal rules; the intent was coverage breadth, not penalisation intensity.

Implementation (cycle 9)

Three changes, all in cycle 9 alongside the Google News RSS scraper build:

  1. Migration: Change rule.applicable_sectors for all UN-G4 sub-rules from 'ALL' to '10,15,20,25,30,35,45,50,55,60'. Rename consideration: since UN-G4 no longer applies universally, renaming to NF-G4 would align with the naming convention (NF- prefix for non-financial rules). Treat rename as mandatory in the same migration — two sub-rule updates vs six is the only cost difference, and the naming will mislead future maintainers if left as UN-G4.

  2. Migration: Fix rule.rule_type for UN-G4 (all sub-rules) from 'positive' to 'deduction'. Missed by the cycle 6 backfill. Required for correct UI labelling once the scraper ships and findings appear.

  3. signal_source update: Correct feeds_rules on GOOGLE-NEWS-RSS from ["S5","S6"] to the accurate list ["E7","G5","G7","NF-E4","NF-S4","NF-S5-CD","S6","NF-G4"] (using the post-rename ID). If rename is deferred, use UN-G4 until it lands.

No scoring engine changes are needed — applicable_sectors filtering is already implemented. No scraper routing logic is needed. The /methodology rule catalogue will automatically reflect the new scope once applicable_sectors is updated; verify the render in cycle 9.

Impact on existing scores

No impact on historical runs. UN-G4 has no signals in the database (GOOGLE-NEWS-RSS source_status is 'pending'; no scraper has been built). The applicable_sectors change takes effect before the first live signal is written. Zero score rows to recompute.

  • ADR-0010 — original universal rule layer decision
  • ADR-0010 Amendment 1 — UN-S1 fallback chain; establishes the principle that universal rules with source guards need honest handling for out-of-scope institutions
  • ADR-0010 Amendment 2 — deduction-rule UI labelling; cycle 6 rule_type column
  • Migration 004 (004_seed_non_financial_rules.sql) — seeds UN-G4 with applicable_sectors='ALL' (the error corrected here)
  • Migration 025 (025_rule_type.sql) — cycle 6 backfill that missed UN-G4
  • Cycle 9 implementation migration (number TBD) — scope differentiation + UN-G4 rename to NF-G4 + rule_type fix + feeds_rules update