ADR-0026 — Baseline anchor → 100; deduction formula k=45; composite fallback fix
Status: Accepted (2026-05-24)
Supersedes: ADR-0012 (neutral-prior), ADR-0023 (deduction anchor at 50)
Superseded by: —
Related: ADR-0022 (Case B), ADR-0027 (CORP-WEBSITE + IFRS-S2-CORP permanent drop),
ADR-0004 (RAG thresholds — recalibration follow-up), docs/design/obs-1-scraper-sufficiency-review.md
Context
ADR-0012 established a neutral-prior model: every institution starts at 50, adverse findings deduct, positive findings uplift, no signal leaves the score unchanged.
ADR-0023 re-anchored the deduction formula to sit under that 50 midpoint: max(0, raw×20 − 50).
The obs-1 scraper-sufficiency review (docs/design/obs-1-scraper-sufficiency-review.md, §6)
determined that no buildable source reaches the fully-dead positive rules (S2, S3, G1, UN-G2,
G2, UN-G3, G4, UN-G1). All six depend solely on the CORP-WEBSITE blocked workstream (§4).
CDP is licence-gated and dropped as not viable (§4). The only buildable positive coverage is
thin and environmental: TNFD (E5), TPI (E1/UN-E1), and IFRS-S2 mandate proxy (E4.1) — all
built in obs-1 Tier 1.
Consequence, from obs-1 §6: Under neutral-50, a clean institution is permanently capped at 50 because the upward half of the scale is structurally unreachable. Starting everyone at 50 and only ever deducting permanently caps a clean institution at 50 — it is penalised by the absence of a positive side it never had access to. This makes the neutral-50 baseline incoherent as a settled state.
After the obs-1 Tier 1 build, scores were re-run and the operator took the baseline-anchor decision (2026-05-24): the scale is, by design, deduction-led. The correct anchor for a deduction-led scale is the top, not the middle.
Simultaneously, the obs-1 session confirmed that CORP-WEBSITE and IFRS-S2-CORP are permanently dropped (ADR-0027): the screen is now built entirely on external-assessment sources (regulators, NGOs, benchmarks, GLEIF). With the positive side of S and G permanently dark, the neutral-50 baseline is additionally incoherent in that dimension. ADR-0027 records this explicitly.
Decision
Three coupled changes, all effective 2026-05-24:
1. Baseline anchor → 100
Clean (no adverse findings) = 100. Adverse findings deduct downward. This supersedes ADR-0012 (neutral-50 prior).
The positive rules that do fire (thin environmental: TPI, SBTi, TNFD, IFRS-S2 mandate proxy) contribute their scores via the normal weighted-mean path. An institution with only positive evidence and no deductions scores less than 100 — the scale is not binary, and weak positive evidence at raw=1 (sub-criterion score=20) is meaningfully weaker than no-evidence-clean at 100. This is correct and intended: weak positive evidence is not the same as no adverse findings.
2. Deduction formula: k=45 (supersedes k=20 from ADR-0023)
The deduction sub-criterion formula becomes:
scoreValue = max(0, rawScore × 45 − 125)
Per-violation map (base_score=5, each violation deducts 1 from rawScore):
| Violations | rawScore | scoreValue |
|---|---|---|
| 0 (clean) | 5 | Case B OMIT → excluded from composite |
| 1 | 4 | max(0, 4×45−125) = 55 |
| 2 | 3 | max(0, 3×45−125) = 10 |
| 3+ | ≤2 | max(0, ≤2×45−125) = 0 (floor) |
×45 / −125 coupling — load-bearing dependency
The −125 in rawScore × 45 − 125 is an absolute offset on the 0–100 scale and is
correct only because the scale factor is ×45. They are coupled:
The general form is rawScore × k − (ceiling × k − 100), where ceiling = base_score = 5
and 100 is the desired clean-anchor. At k=45: 5 × 45 − 100 = 125.
Do not change the ×45 scale factor without updating −125 proportionally. A "tidy up" change to ×45 that leaves −125 unchanged will silently break the deduction anchor. This is the same class of coupling documented in ADR-0023 for the k=20/−50 pair.
Case B (deduction rule, clean run, no violations → OMIT sentinel) is unchanged and still fires before the formula is reached. Dropping Case B was assessed and rejected: it caused a universal ~10–20pt uplift (confirmed across G7 on 38 FI, NF-G4 on 41 NF, S6 on 34 FI).
3. Composite.js all-null-pillars fallback: 50.0 → 100.0
composite.js line ~67 hardcoded 50.0 as the fallback score when all three pillar weighted
means are null (no scored evidence in any direction). Changed to 100.0.
This is the one place outside the deduction formula where the old neutral anchor was explicitly hard-coded. A no-evidence institution (all rules OMIT'd, no pillar score) must now fall to 100 (clean), not 50 (neutral midpoint).
Rationale for k=45 specifically
The k parameter governs the severity of a single violation. Under k=20 (ADR-0023): - 1 violation → 30 (−20 from old neutral of 50)
Under k=45, with the new baseline of 100: - 1 violation → 55 (−45 from old neutral; well above the midpoint at 50) - 2 violations → 10 (severe) - 3+ → 0 (floor)
This achieves: 1. A single violation is meaningful (−45 from clean) but not catastrophic: institution lands at 55, still visible and above many mixed-evidence peers. A single verified finding is serious; it is not a knock-out. 2. Two violations represent a serious pattern: 10/100 is clearly adverse. 3. The step from 1→2 violations (55→10, a delta of 45) is larger than 0→1 (100→55, delta of 45 via the Case B OMIT logic). This asymmetry is acceptable: the second confirmed finding signals a pattern, not an incident.
The "BNP at ~65 on 2 violations" concern (raised pre-decision) is noted but not addressed here:
BNP's high composite is driven by strong E1/UN-E1 positive signals, not by the deduction formula.
The lever is E7's rule_weight, not k. Deferred to obs-1 per-source weighting review.
Affected rule IDs
All deduction rules — those where rule_type = 'deduction' in the rule table:
| Scope | Rule IDs |
|---|---|
| Financials (sector 40) | E7, G5, G7, S6 |
| Non-financials | NF-E4, NF-G4, NF-S4 |
E8 is inert (no signals ever written); technically affected but has no observable effect.
Score distribution (run_id=43, 79 institutions, post-implementation)
Summary by cohort:
| Cohort | n | min | mean | max | at 100 |
|---|---|---|---|---|---|
| Financial (38) | 38 | 20.0 | 47.8 | 100.0 | 4 |
| Non-financial (41) | 41 | 20.0 | 74.2 | 100.0 | 19 |
| All (79) | 79 | 20.0 | 61.5 | 100.0 | 23 |
Verification checks:
- 6 previously-at-50 no-evidence institutions → 100: Brown & Brown, Man Group, TIAA, HKSC Bank, Ferguson, Sunbelt — all confirmed at 100.0, confidence=0 ✓
- Deduction Case B preserved: all 8 institutions at 20.0 (weak positive signals) remain at 20.0; no spurious uplift from the deduction path ✓
- 1-violation institutions improved: Invesco (1 violation, E pillar): 4×45−125=55; composite rises from previous 30 to 55 ✓
- 2-violation path unchanged: BNP Paribas E7 raw=3: 3×45−125=10 (same as k=20) ✓
Distribution brackets:
| Range | n | Notes |
|---|---|---|
| 100 | 23 | Clean (no adverse findings or positive-only at max) |
| 70–99 | 4 | Strong positive signals |
| 60–69 | 13 | Moderate positive or thin positive |
| 40–59 | 20 | Mixed — some positive, some violations |
| 30–39 | 11 | Meaningful violations present |
| < 30 | 8 | Serious adverse findings |
RAG band recalibration
RAG bands require recalibration for this distribution (tracked separately; current bands are interim). Proposed bands for operator confirmation:
- Green ≥ 70: clean or strong positive — captures ~27 institutions (100s, 80s)
- Amber 40–69: mixed or moderate — captures ~33 institutions
- Red < 40: significant adverse findings — captures ~19 institutions
This is a report item, not a committed change. rag.js will be updated once confirmed.
What is NOT changed
- Per-violation sub-criterion score magnitude: the formula is re-derived at k=45; the relative ordering within the scale is unchanged.
- Positive-rule formula:
rawScore × 20unchanged; positive rules are unaffected. - Case B (clean deduction → OMIT): byte-identical; the
pointsSum=0guard is unchanged. - Case C (positive scraped-negative → OMIT): byte-identical.
- Score floor/ceiling on rawScore: unchanged (
base_score=5,floor=0,ceiling=5). - Per-source/per-violation weighting: E7 rule_weight, relative severity of FOREST500 vs news vs BankTrack — deferred to obs-1 per-source weighting review.
Obs-1 weighting review — decision recorded (2026-05-24)
Decision: MIXED — rule_weights unchanged.
The obs-1 per-source weighting review examined three disposition options:
- DISPOSITIVE-1: raise E7 rule_weight aggressively so a live controversy pulls the composite
hard regardless of positive-signal strength.
- DISPOSITIVE-2: introduce pillar-flooring (a controversy hard-caps the affected pillar).
- MIXED (chosen): leave weights as-is; the existing weighted-mean is correct given the
tool's internal-use scope. Mixed companies read as mixed.
Why DISPOSITIVE-1 was rejected on the data (non-monotone): raising E7's rule_weight is not a clean fix because E7's effective composite weight is structurally diluted:
| Lever | Value | Comment |
|---|---|---|
| E7 rule_weight | 0.10 | vs E denominator of 0.55 |
| E7 share of E pillar | 0.10 / 0.55 = 18.2% | remaining 82% is positive rules (E1, UN-E1, etc.) |
| E7 share of composite | 18.2% × 0.40 (E blend) = ~7.3% | raw max composite impact of E7 |
| Max composite impact of E7 | 0.10/0.55 × 0.40/0.70 = ~10.4% | over active pillars (E+S or E+G normalised) |
Concrete ceiling: for BNP Paribas, E7 deduction at 2 violations (score_value=10) vs E7 clean
(Case B OMIT, score_value excluded) shifts the E pillar by at most:
(OMIT excluded → 10 included) × 0.10/0.55 ≈ 1.8 E-pillar points,
which at E-blend weight 0.40/0.70 ≈ 1.0 composite point. E7 cannot move BNP's composite
by more than ~8.5 composite points regardless of violation count or k value.
Root cause: E1(rule_weight=0.20) + UN-E1(0.15) = 0.35 of the E denominator (0.55), vs E7's 0.10. Strong E1/UN-E1 positives structurally dominate the E pillar. Raising E7's rule_weight monotonically (without also lowering E1/UN-E1) shifts but does not resolve this.
DISPOSITIVE-2 not chosen: pillar-flooring is a valid future direction but raises severity-threshold, double-counting, and schema questions not resolvable in this cycle.
Recorded tradeoff: the MIXED disposition is honest at the per-pillar detail level. At the composite / RAG headline level, a controversy-bearing institution with strong positive evidence reads more favourably than its controversy alone would imply — a viewer who only reads the composite band may not surface the finding. This is acceptable for an internal analyst tool; revisit if a client-facing surface is added.
Item 4 (ceiling-collapse re-check) — closed self-resolved (2026-05-24)
Pre-obs-1 concern: TPI MQ:3 ("par") and MQ:5 ("leader") both pinned E-pillar=100 because UN-E1 was the only non-sentinel E rule for NFs and both clear its ceiling; 8 distinct climate profiles collapsed onto E=100.
Post-TPI-SECTOR (migration 057, ADR-0025): pure-TPI institutions now differentiate. NVIDIA (MQ:3) → E=60; Alphabet (MQ:5) → E=100. The collapse no longer occurs across distinct MQ levels for institutions with TPI data only.
Residual: institutions with supplementary positive signals (SBTi + TPI reaching the UN-E1 ceiling) still collapse onto E=100. This is a pre-existing ceiling property of UN-E1, not a new regression. Documented as a UN-E1 ceiling sub-question (consider raising or removing UN-E1's ceiling in a future cycle if NF-E coverage improves). No immediate action — the collapse is bounded to SBTi+TPI high-performers and does not affect differentiation for the controversy-bearing cohort that motivated obs-1.
Implementation
Code change: src/scoring/sub_criterion.js deduction branch (×45 − 125); src/scoring/composite.js
all-null fallback (50 → 100). DB re-scored on run_id=43 in-place (INSERT OR REPLACE semantics).
ADR-0012 and ADR-0023 marked superseded.
References
- ADR-0012 — Neutral-prior scoring model (superseded)
- ADR-0023 — Deduction rule baseline re-anchored to 50 (superseded)
- ADR-0022 — Case B / Case C omit-sentinel logic (unchanged)
- ADR-0027 — CORP-WEBSITE + IFRS-S2-CORP permanent drop (context for baseline choice)
- ADR-0004 — RAG thresholds (recalibration follow-up)
docs/design/obs-1-scraper-sufficiency-review.md— verdict driving this decision