Skip to content

ADR-0031 — Symmetric baseline-100 scoring model; weapons hard-floor

Date: 2026-05-25 Status: Accepted Decider: Rob Supersedes: ADR-0026 (neutral-prior / deduction-led model) Reverses: ADR-0007 (hard-exclusion flags independent of composite) Superseded by:Related: ADR-0012, ADR-0023, ADR-0029 (severity modelling), S5/S6/S7/S8 (prior neutral-prior mechanics)


Context

The scoring model to date (ADR-0026) was deduction-led / neutral-prior:

  • Each pillar effectively anchored at 100; only NEGATIVE findings moved a pillar down.
  • POSITIVE-type signals (memberships, disclosures, commitments) were made score-NEUTRAL (S5) — they did not raise a score, to prevent an institution buying a better ESG read by publishing self-serving disclosures.
  • A pillar with no non-OMIT signals was recorded NULL and DROPPED from the composite weighted mean (null-dropping).
  • Hard-exclusion flags (weapons via PAX, fossil via fossil_fuel_exposure) were surfaced as categorical chips INDEPENDENT of the composite (ADR-0007).

This produced a defect the operator flagged directly: a weapons-financing institution could show a composite of 100 (e.g. HKSC, all pillars null → baseline 100) while carrying a tripped weapons flag. The flag data never reached the score. Investigation (CC-on-VM, 2026-05-25) confirmed PAX-WEAPONS writes only to institution.flag_weapons + watchlist_entry and is consumed by no scored rule — weapons exposure had zero route into the composite.

A narrow weapons-only fix was explored (and three interim models — flag→pillar transform, stack, null-floor — were projected and abandoned). The operator's own description of the intended methodology was simpler and more general than any of them, and on inspection the "weapons shows 100" defect was a symptom of the deduction-led model's null-handling, not a weapons-specific bug. The decision is therefore to replace the scoring model wholesale rather than patch the flag path.


Decision

Adopt a symmetric baseline-100 scoring model:

  1. Each pillar (E, S, G) starts at baseline 100.
  2. Negative findings DEDUCT; positive findings ADD. Magnitude is SYMMETRIC about the existing deduction scale (k=45): M=1 → ±45, M=2 → ±90, M≥3 → ±100 (capped). The positive-type rules made score-neutral under ADR-0026 / S5 are RE-ENABLED as score-raisers at these symmetric magnitudes.
  3. Each pillar is clamped to [0, 100].
  4. A NULL pillar (all its rules OMIT — no signals either direction) resolves to baseline 100 and PARTICIPATES in the blend. Null-dropping is removed.
  5. Composite = weighted mean of ALL THREE pillars, always three: E×0.40 + S×0.30 + G×0.30 (live blend_weight table).
  6. WEAPONS OVERRIDE (reverses ADR-0007): if flag_weapons = 'tripped', S = 0 as a HARD FLOOR, applied AFTER all positive/negative S signals. No positive S factor can lift it. This is DEFINITIONAL — weapons financing is treated as the antithesis of social standing — not a calibrated deduction.

Fossil flag: NO separate scoring change. Fossil financing already moves the E pillar via E7 (fed by FOREST500 + NGO-TARGETS). Adding a fossil→E transform would double-count the same fact. Any future change is a rule-weight question for E7, tracked separately, not part of this ADR.

Why each reversal

Reversing ADR-0007 (flag independence): a screening tool should let a hard exclusion drive the score, not merely annotate it. The categorical chip is retained as a loud warning, but the fact now also moves the number through the normal scoring path.

Superseding ADR-0026 (neutral-prior): the operator's intended model treats baseline-100 as a true neutral anchor that evidence moves in EITHER direction, with absent evidence reading as neutral baseline rather than being dropped. This is a deliberate posture change from "guilty until evidenced" to "neutral baseline, evidence moves you."


Consequences

Universe-wide re-score, mostly upward. Projected over run_id=50 (n=79): 59 up, 1 down (HKSC −30), 19 unchanged; 55 band changes, all upward; median Δ +27.9, max +80. This is expected: null-resolution + additive positives both lift scores relative to the deduction-led model. The screen now reads more generously across the board.

HKSC lands at 70 (Amber), not 0. Requires null pillars to resolve to 100 BEFORE the S=0 blend — the engine had no such path under ADR-0026 (the all-null baseline write produced no pillar rows, so injecting S=0 collapsed the composite to 0). The implementation must add explicit null-resolution.

Weapons floor: S=0 holds even with positive S signals. Confirmed for all 19 weapons-tripped institutions; no positive offset lifts S off 0.

Score-buyback risk (to monitor). Symmetric positives mean a controversy-bearing institution can, in principle, offset deductions with positive memberships/disclosures — the exact behaviour ADR-0026 was built to prevent. Accepted deliberately. A pre-deploy verification of worst-case buyback examples is required in the implementation pass; if magnitudes read too generous, the remedy is asymmetric magnitudes (positives weighted below deductions), tracked as a follow-up, not a blocker.

Distribution to re-validate. A +27.9 median lift and 55 band changes mean the RAG bands (Green≥70 / Amber 40–69 / Red<40) must be re-checked against the new distribution; recalibration may follow (separate item).

Status of prior decisions

  • ADR-0026 superseded in full (neutral-prior, deduction-led, positive-neutrality, null-dropping all replaced).
  • ADR-0007 reversed (flags now drive the composite via the weapons floor).
  • ADR-0029 (BHRRC severity modelling) unaffected — deduction magnitudes it feeds remain; they now have symmetric positive counterparts.

Agency-weighting refinement (migrations 064/065/066, 2026-05-25)

Positive sub-rules carry one of three agency tags, applied at sub-rule grain. The tag sets the per-hit weighting constant k used when the rule's positive evidence is aggregated into its pillar.

  • self (k=22.5) — org-instigated actions: the organisation chose the action or the disclosure is its own. Covers memberships and alliances joined, commitments and pledges published, third-party assurance the org commissioned, and mandatory disclosures (UK-MSA, UK-GPG, IFRS-S2-MANDATE / TCFD-aligned). Rationale: a mandatory disclosure is an org-instigated act of compliance and reporting; it is not an independent assessment of the org, so it sits at the lower (self) weight, but it does carry positive signal and must remain in the aggregation (see Monotonicity ruling below).

  • external (k=45) — independent third-party positive assessment, or absence from an independently-maintained negative list. Symmetric in magnitude with the deduction constant. Covers TPI, InfluenceMap, BoCC, BankTrack-clean, CHRB, and Bloomberg GEI / Stonewall (S4.5). Rationale: an independent party has assessed the org and reached a positive judgement, so the signal carries full weight.

  • neutral (k=0, OMIT from score aggregation) — mere presence on, or coverage by, a list, with no positive judgement attached. Currently Forest500 (coverage flag only). A neutral rule contributes nothing to the weighted mean; it is omitted, not scored at zero.

Deduction rules are unaffected by agency weighting (deduction magnitude remains k=45: M1 −45 / M2 −90 / M≥3 −100). Mechanically, scoring computes Σ(agency-k per hit) per positive rule rather than hits × 45.

Four tag rulings (recorded for the boundary cases):

  1. mandatory → self. UK-MSA, UK-GPG and IFRS-S2-MANDATE are classified self (k=22.5), not external. A statutory disclosure obligation is org-instigated compliance, not independent assessment. (Reverted from an interim neutral classification by migration 066 — see Monotonicity ruling below.)

  2. assurance → self. Third-party assurance of org-authored reports is classified self, not external. The assurance is commissioned and paid for by the org; it is not an independent party initiating an assessment.

  3. Forest500 → neutral. The Forest500 coverage flag is neutral (k=0 / OMIT). It records that an institution is within Forest500's assessment universe; it is list presence, not a positive judgement, so it carries no score.

  4. Bloomberg GEI / Stonewall (S4.5) → external. Both are classified external (k=45). Inclusion requires scoring above an independently-assessed threshold — that threshold judgement IS a positive external assessment, distinct from mere list presence.

Final tag distribution at run_id=53: 70 self / 19 external / 1 neutral (tagged positive sub-rules; 48 further positive sub-rules carry agency=NULL, treated as k=22.5 by the engine's conservative default).

Monotonicity ruling (2026-05-25)

Principle: removing or reducing positive credit for an institution must only lower or hold its score, never raise it. A model that lets a score rise when evidence is removed is reading absence of evidence as positive signal.

The violation, and how it was dissolved. An interim build classified the mandatory-disclosure rules (UK-MSA, UK-GPG, IFRS-S2-MANDATE) as neutral (k=0 / OMIT). For institutions whose only positive E signal was a mandatory disclosure, OMIT removed the sole contributor from the E-pillar weighted mean; with all remaining E rules also OMIT, the pillar null-resolved to 100. The composite therefore rose when the only positive evidence was discounted — nine data-sparse institutions crossed from Amber into Green on the interim pass. The mechanism was the OMIT path, not a scoreValue=0 contribution: OMIT drops a below-average contributor from the mean, whereas a contributed zero would have pulled the pillar down.

Ruling. The fix is the mandatory → self reclassification (migration 066), not a change to OMIT semantics. Moving the three mandatory-disclosure rules from neutral to self (k=22.5) keeps them active in the aggregation at a small positive contribution, which closes the null-resolution path: an institution whose only E signal is a mandatory disclosure now scores E=22.5 on that rule rather than null-resolving to 100. This dissolved the only monotonicity violation; run_id=53 is monotone-clean.

Why this over the alternative. The alternative (keep mandatory as neutral, but switch neutral semantics globally from OMIT to scoreValue=0-in-mean) was rejected. It would have forced a contributed zero on every genuinely-neutral signal — including Forest500 list presence — pulling pillars toward zero on the strength of mere list coverage, which misreads "no positive judgement" as "negative signal." Reclassifying the specific rules that carry real positive signal (mandatory disclosures) preserves OMIT for the one rule that genuinely warrants it (Forest500), and keeps the semantic clean: OMIT means "no signal," self/external means "positive signal at the appropriate weight," and nothing is scored at a contributed zero.

Monotonicity rationale for the weighting magnitudes. Self (k=22.5) is set at half the deduction/external constant (k=45) by design: a self-instigated positive (a membership, a pledge, a mandatory disclosure) must never outweigh a single real violation (M1 deduction, k=45). Self k=22.5 ≤ M1 deduction k=45 guarantees that one genuine adverse finding is not bought back by one self-reported positive. External (k=45) sits at parity with deductions because an independent positive assessment is treated as evidentially symmetric with an independent adverse finding.


References

  • ADR-0007 — Hard-exclusion flags (reversed by this ADR)
  • ADR-0012 — Scoring methodology baseline
  • ADR-0023 — Deduction rule baseline reanchor
  • ADR-0026 — Baseline-100 deduction reanchor (superseded by this ADR)
  • ADR-0029 — BHRRC/NF-S4 severity model (deduction magnitudes unaffected)
  • docs/design/deduction-magnitude-proposal.md — projection workings (run_id=50, n=79)