← Methodology

PUBLIC ALGORITHM · MATHEMATICAL SPECIFICATION

How each score is calculated

The formulas, inputs and limits used by the current scoring engine, including data that does not contribute.

Model 2.0Impact 2.0Reliability 1.3Text 2026-09-27.3
Download formulas, parameters and source code for this revision (JSON) ↓

1. Notation, data and eligibility

clamp(x, a, b) = min(b, max(a, x))
round(x) = floor(x + 0.5), for this model's non-negative values
sat(x; k) = 0 if x ≤ 0; x/(x+k) otherwise

Operations use JavaScript IEEE-754 numbers. The stated rounding steps are part of the algorithm; intermediate stages are not rounded unless specified. ∑ sums terms; |S| counts distinct elements in a set; ∅ is the empty set. Points do not represent tonnes of CO₂, savings percentages or measured net impact.

The model reader loads profiles with publication_status = published from all four families. n is the number of practices in that profile whose contribution_provenance is platform_admin, verified_representative or legacy_official. No other magnitude, date, theme or measurement filter is applied when counting these practices. With n = 0, neither Impact nor Reliability is published: the state is unscored, not a zero score.

Only sustainable_practice_evidence links with status = confirmed enter the score. Proposals, disputes and withdrawals are excluded. The reader recognizes a photo, otherwise a video, otherwise a document; the schema requires exactly one reference per row. Links to ineligible practices do not contribute.

Connections must be published. Semantic eligibility applies to direct Impact and the Impact graph, but does not filter Reliability connection tiers or its graph. The executable code defines the rules; an editorial label must not be used to infer an additional exclusion.

Critical reading failures produce unavailable, never an invented number. Compatibility queries tolerate only the missing-column/table errors anticipated by the reader: a database predating the migration has no new declarations or exclusions. Hiding a score only masks its public presentation; it does not remove the published profile from the calculation or ecosystem.

2. Impact: reach of contributions, relationships and public scale

v(L0,L1,L2,L3,L4,L5) = (0.0005, 0.005, 0.02, 0.06, 0.15, 0.4)
L′ = L1 if L ∈ {L4, L5} unconfirmed; L′ = L1 without a current reading
wᵤ = v(L′ᵤ)
c_g = max(v(Lbase,g), maxᵤ∈g wᵤ)
B_g = min(c_g, ∑z∈Z_g c_g(1 − ∏ᵤ∈U_gz(1 − wᵤ/c_g)))
q_g = c_g(1 − (1 − B_g/c_g) ∏ᵤ∈H_g(1 − wᵤ/c_g))
Q = ∑g q_g [municipalities]; Q = ∑ᵤ wᵤ [other scales]
S = 2.4 Q^0.7
P = round(1000 (1 − e^(−S)))/10
G(c) = (1−0.60^c)/(1−0.60)
D = round(10000 min(4, ∑ₛ bₛ G(cₛ)))/10000
I₀ = P + D
N = min(Nᴵ, max(0,4−D))
Iraw = I₀ + N
Ipublic = min(95,Iraw) [current accumulating mode]

Impact 2.0, provisional, weighs each contribution by its reach for the profile's own scale: municipality, organisation, person or product. An AI reader assigns each contribution a level from L0, symbolic, to L5, transformative, following published rules. The reading is stored with a fingerprint of the text it read; if the text changes, the contribution counts as L1 until it is read again. Any concrete action is at least L1; an approved plan counts as L1 in its own right and a plan in preparation as L0.

Review: an L4 or L5 reading counts as L1 until a person confirms it. Same work: contributions identified by the reader as the same work, or as a phase or component of another, form one unit counted once at the highest applied level after review holds. Each contribution retains and displays its own level. The reader instructions prohibit joining a plan with its measures; the engine also blocks that join when municipal categories identify one as a plan and the other as a measure.

Only municipal profiles group units by what they act on (travel, waste, municipal energy, parks, etc.). Each group has a base capacity of L4 for whole-municipality physical systems, L3 for council assets, people-centred programmes and other categories, and L2 for plans and data. The effective capacity c_g is the greater of that base and the highest applied unit value in the group. Z_g contains the distinct documented zones; U_gz contains the units in one zone; H_g contains units with a shared or unknown zone. Overlap is combined within each zone; distinct zones add up to c_g, then the resulting block is combined with H_g. Q sums the group results q_g. For other profile types Q sums the units directly: municipal capacities do not apply outside that scale.

D is the direct Impact from relationships and N the ecosystem influence; both keep their previous calculation. For each distinct counterparty a single semantic category is kept, the highest in the order of the table; cₛ counts the counterparties of category s and bₛ is its base weight, with 0.60 decay. The joint limit of direct relationships and ecosystem is 4. Evidence adds 0 points of direct Impact and is reflected in Reliability.

The category is resolved by normalizing the text: NFD, removing diacritics, converting to lowercase, replacing non-alphanumeric groups with spaces and collapsing spaces. Exact labels are checked first, then patterns in this order: BOOST interest, driver, guide; implementation; working group; network; coordination; funding; technical/administrative/duplicate. Unknown or empty text is treated as a generic association. A database value of scoring_eligible other than true is converted to false and produces a technical category with weight 0. The appendix preserves all exact aliases and regular expressions.

Semantic deduplication does not consult confirmation positions. Therefore, under the current algorithm a disputed relationship can retain direct Impact if its category remains eligible. Its Reliability and graph transmission are zero. This is an observable model limitation, not a recommendation or a correction introduced by this documentation.

Counterpart identifiers are resolved across all four families, so an inverse row does not duplicate credit. Self-relationships are ignored. If a remote identity is missing, the direct counter uses a synthetic identity per row; the graph requires two known published profiles. In a semantic tie, the first category encountered is retained.

Relationship categories, from lowest to highest precedence
Engine categoryBase weight bₛ
Technical, administrative or duplicate0
Generic genuine association0.05
Sustainability-network membership0.15
BOOST interest team0.15
BOOST driver team0.3
BOOST guide team0.5
Active working-group participation0.35
Coordination or leadership0.6
Sustainability-relevant funding or support0.6
Implementation partnership1

3. Breakdown by profile type and relative comparison

Municipality (territory Municipio, Ayuntamiento de …): P with groups, capacities, zones
Organisation, person, product: P with a sum of units
All families: I = min(95,P+D+N); R = Rtier
If relative mode is activated: I = 1 + round(99(M−r)/(M−1))
If M = 1: I = 100; r = (first position + last position)/2

The four families share levels, weights, curve, limits, bands and evidence rules; what changes is the scale each contribution is read against. Municipality: its population, emissions, resources and territory. Organisation: its own operations and footprint, and the people or territory its work reaches according to its profile. Person: their life and household, and the people or projects their work reaches. Product or service: its own footprint and its users. Territories with category Municipio and entities whose name begins with Ayuntamiento de use the municipal scale.

There is no automatic adjustment for sales, employees, income or surface area: size enters only through the reader's judgement of reach, made against the profile's own scale. Group capacities apply only to the municipal scale; the other families sum their units until they are adapted with criteria of their own.

Every family is fixed in accumulating mode. Readiness for comparing profiles is informational: it requires at least 25 profiles with practices, at least 5 with Iraw ≥ 25 and a maximum Iraw ≥ 95. Crossing these thresholds does not automatically change the scale.

The relative branch exists but is inactive. It sorts Iraw in descending order within the same family, uses the average rank for exact ties, and M is the number of profiles with practices. The identifier orders ties stably without changing their average rank. Comparison uses Iraw without the public cap of 95; the rawScore and intrinsicScore presentation fields are capped at 95. Activating relative scoring requires a deliberate version change.

4. Reliability: from files to sources and families

C = |{p: a scoring link exists for p}| / n
B = |{depth families of links}|
F = |{depth families of relevant documents}|
J = |{independence families with weight > 0}|
W = ∑ over the first occurrence of each family with weight > 0: weight(distance)
U = |{p: has a source with distance independent}| / n
V = |{p: has ≥2 independence families and an independent source}| / n

C is practice coverage, B the diversity of sources supporting practices, F relevant documentary foundation, J the number of positive-weight families, W weighted independence, U the fraction of practices with at least one independent source, and V the corroborated fraction. When n = 0, the fractions are internally zero, but the profile receives no public score.

A linked document is accepted only if it exists among the same profile's documents. Linked photos and videos are classified as controlled and share the profile's own source family. The image, video or PDF is not analyzed to establish its truthfulness. Web links in the generic attachment system do not automatically become scoring links.

An unlinked document is relevant to F if its title and description share at least two distinct words with the combined titles, descriptions and theme_slug of eligible practices. Words are lowercased, decomposed with NFD, stripped of diacritics and split on characters outside a–z/0–9. Words longer than 3 characters are retained unless listed among the appendix's stopwords. File text is not inspected and semantic understanding is not applied.

A recognition with a resolvable issuer uses normalized issuer_domain or, failing that, its URL's domain. With scope = practice and an eligible improvement_id, it creates a link exclusively for that practice. Otherwise it creates a family relevant to F. Without a resolvable issuer it creates neither. Declared issue/expiry dates are not used in this calculation.

Depth families group own and controlled sources under self-surface:perfil; other sources use their origin family. Independence families group own, controlled and unknown under self:perfil. Affiliated and independent retain their origin family. J includes affiliated because its weight is 0.25; U requires independent. W uses the weight of the first positive occurrence of each family, rather than its maximum. This distinction is part of the current implementation.

5. Exact classification of source identity

weight(own)=0; weight(controlled)=0; weight(unknown)=0; weight(affiliated)=0.25; weight(independent)=1
Tokens = website domain label (length ≥4) ∪ distinctive title words (length ≥5)

The host is obtained using URL; if the scheme is missing, https is assumed. It is lowercased and www is removed. The registrable domain uses the last two labels, except for the special suffixes bizkaia.eus, gipuzkoa.eus, araba.eus, euskadi.eus, co.uk, com.es, org.es and gob.es: the immediately preceding label is also retained when present. This is an explicit list, not the complete Public Suffix List.

Identity tokens are lowercased and normalized with NFD, removing diacritics and non-alphanumeric characters. The website's distinctive word is the first label of its registrable domain. Titles are split on spaces and the symbols – — , . ( ) / -. Generic terms listed in full in the appendix are excluded.

The heuristic checks, in order: (1) a recognized social account: without an account, unknown; if the account contains the token or vice versa, controlled; otherwise independent; (2) an uploaded file without a host, controlled; (3) no domain, unknown; (4) the same domain as the website, own; (5) a distinctive label matching or contained within a token, affiliated when a website exists, otherwise own; (6) no website, unknown; otherwise independent. This is a heuristic classification, not a legal verification of independence.

Accounts are recognized on LinkedIn (/company, /school, /showcase, /in), X, Twitter, YouTube (/@, /c, /channel, /user), Facebook, Instagram, Issuu, Medium and Vimeo; exact patterns are listed in the appendix. A video linked as a video remains controlled; a document's social URL follows the document heuristic.

Domain declarations can cover the registrable domain, the exact host or its subdomains. On social networks, they must also identify the same account. Ordinary declarations have specificity 1 and account declarations 2; at equal specificity the lower weight wins, retaining the first when weights also match. A platform_admin declaration applies directly. Representative or inferred declarations can only reduce the weight; at equal weight they only replace unknown. Nobody can self-declare independent.

The origin family is normally domain:domain. On storage.googleapis.com, drive.google.com, docs.google.com, dropbox.com, linkedin.com, x.com, twitter.com, youtube.com, youtu.be, issuu.com and scribd.com, it uses aggregated:artifact-key. Hosts are matched exactly for this list. An upload without a host uses uploaded:id; without a domain, document:id.

The artifact key prioritizes storage_path. When a URL exists, it removes the fragment and tracking parameters utm_*, fbclid, gclid, mc_cid, mc_eid, _ga, ref and source; retains other parameters and their order; removes trailing path slashes (except /); omits protocol and port from the final key; and lowercases everything. Without a valid URL it uses document:id. Families are not necessarily actual legal publishers: these resolution limits also affect scoring.

6. Reliability: band selection and quality within the band

T0 if n=0 or C<0.20; band [0,49]
T4 if freshnessAvailable and C≥0.80 and U≥0.60 and J≥3 and V≥0.40; band [85,100]
T3 if C≥0.60 and U≥0.25 and (J≥2 or (J≥1 and U≥0.60)); band [70,84]
T2 if C≥0.60; band [60,69]
T1 otherwise; band [50,59]
q = clamp(∑ₜ wₜ xₜ,0,1)
R = round(L + (H−L)q)
Internal contribution of term t = (H−L)wₜxₜ

Conditions are evaluated in the stated order. L and H are the lower and upper bounds of the selected band. The band represents the evidence situation, and q the quality within it. Adding documentation can therefore cross a band threshold; there is no universal fixed value per file.

freshnessAvailable is false: T4 is unavailable. The current theoretical maximum Reliability is 84 (B+), although the scale and labels retain A−, A and A+ for future models or configurations. Uploading more documents must not be presented as a promise of A, nor should the model be said to verify how up to date they are.

The weights for T0–T2 and T3–T4 differ and are shown in the table. Each vector sums to 1. R is calculated using unrounded q. Only the published detail rounds q and the terms to 3 decimal places, and their internal contributions to 2 decimal places; adding these displayed values may differ from the final score.

The public grade is the first grade band whose minimum does not exceed R; if none applies (including R=0), it is D. Grade bands are distinct from T0–T4: for example, T1 spans D+ and C−.

Weights wₜ for quality within the band
TermT0-T2T3-T4
Coverage0.280.08
Depth0.240.07
Documentary support0.140.04
Independence0.10.34
Corroboration0.040.3
Completeness0.080.05
Relationships0.080.09
Ecosystem0.040.03
Grade thresholds (checked from highest to lowest; 0 is also D)
GradeMinimum
A+95
A90
A-85
B+80
B75
B-70
C+65
C60
C-55
D+50
D1

7. The eight normalized Reliability terms

xcoverage = clamp((C−a)/(b−a),0,1)^0.7
(a,b) = (0,0.20) in T0; (0.20,0.60) in T1; (0.60,1) in T2,T3,T4
xdepth = B/(B+2)
xfoundation = F/(F+1.5)
xindependence = W/(W+3)
xcorroboration = clamp(V,0,1)^1
xcompleteness = m/4
K = min(15, round(∑ᵤ capᵤ nᵤ/(nᵤ+kᵤ)))
xrelationships = K/15
xecosystem = min(1,Nᴿ/3)

Coverage measures the margin above the minimum coverage already required by the band; it does not reward the full entry requirement again. Depth and foundation saturate with distinct families. Independence saturates with its weighted sum. Corroboration is linear in the proportion of corroborated practices.

m counts how many of description, location, website and image contain non-empty text after trim. Each field adds 1/4 to completeness before applying the weight and band width. Name, subtitle, category, coordinates, follower count and age alone do not add completeness.

K measures the profile's own relationships by trust tier. If either party has declined, the tier is disputed and contributes zero; otherwise independent verification takes precedence; then both parties affirming (declared or confirmed) yields confirmed; only the profile affirming yields declared; otherwise observed. The same row can have a different tier at each end. Only the highest tier per counterpart is retained; a dispute does not cancel another higher-tier row with that counterpart.

The (cap,k) pairs for K are observed (1,8), declared (5,4), confirmed (12,3), verified (15,2). They are summed before rounding and applying the cap of 15. Nᴿ is the integer ecosystem assurance contribution, calculated using the graph below. It does contribute to current Reliability, with the small weight shown in the table.

Saturation of own relations K
Levelcapk
Observed18
Declared54
Confirmed123
Verified152

8. Ecosystem: graph, paths and two bounded contributions

Iintr(j) = min(95,Pⱼ+Dⱼ) if nⱼ>0; 0 otherwise
Rlegacy(j) = min(100, round(50 eⱼ/nⱼ) + 5mⱼ + Kⱼ + min(15,3tⱼ+2min(lⱼ,3))) if nⱼ>0; 0 otherwise
vᴵ(j) = clamp((Iintr(j)/95)(0.5+0.5 clamp(Rlegacy(j)/100,0,1)),0,1)
vᴿ(j) = clamp((Rlegacy(j)/100) oⱼ,0,1), where oⱼ=1 if scores are public and 0.8 if hidden
wᴵ(i,j) = max paths π of 1..3 steps: dᴵ[length(π)] ∏ edges e∈π confidence(e)
wᴿ(i,j) = max paths π of 1..3 steps: dᴿ[length(π)] ∏ edges e∈π confidence(e)
zᵃᵤ = ∑ profiles j whose best path has tier u: wᵃ(i,j) vᵃ(j), a∈{I,R}
Nᴵ = round(min(10, ∑ᵤ capᴵᵤ zᴵᵤ/(zᴵᵤ+kᴵᵤ)))
Nᴿ = round(min(3, ∑ᵤ capᴿᵤ zᴿᵤ/(zᴿᵤ+kᴿᵤ)))

Intrinsic values are calculated first, without the ecosystem. For each neighbor j, eⱼ is the number of practices with any confirmed link, tⱼ the number of photo/video/document types and lⱼ the number of confirmed evidence rows. These counts come from the initial reader, before resolving families and recognitions. Rlegacy is the old additive formula used as an internal signal by the graph; it is not the published v1.3 Reliability. When nⱼ=0, the node transmits zero even if its fields are complete. Intrinsic Impact uses the current model of improvement reach, not the old count-based formula.

Two symmetric graphs of published profiles are built: the assurance graph accepts all published, undisputed connections; the Impact graph also excludes the technical/ineligible category. Self-loops and endpoints outside the published profiles are omitted. Repeated rows between two profiles retain the highest trust level. Original direction does not change propagation.

Trust per edge is verified 1, confirmed 0.7, declared 0.4, observed 0.1, disputed 0. In the graph, unlike each endpoint's direct credit, one party affirming is enough for declared; both are needed for confirmed. Declined takes precedence even over verification.

Decay factors are dᴵ=(1,0.25,0.05) and dᴿ=(1,0.05,0.005). Decay is applied once according to total path length, rather than multiplying the decay factors of earlier steps. A path's tier is the lowest of its edge tiers. Each reached profile is counted once through its highest-weight path; alternative routes are not summed. In an exact tie, the first traversed path is retained. The search covers up to three steps and never returns to the origin, although it may repeat other nodes within that horizon.

Global relevance is 1: it multiplies each edge's trust and is applied again when aggregating z, without changing the current result. Parameters are calibration decisions, not physical constants or measured outcomes. Saturation pairs by tier are shown in the table.

Nᴵ must still fit within the remaining capacity 4−D from the Impact section. Ecosystem assurance Nᴿ enters q as min(1,Nᴿ/3); it is not added directly to the public v1.3 R. Final ecosystem-adjusted scores are not propagated, so there is no iterative feedback.

Visibility does not reduce vᴵ: a profile with hidden scores retains its Impact transmission. Only vᴿ receives the factor 0.8. If any effective contributor hides its scores, the exact fractional aggregates of both terms are withheld. Only the values already used and an indication of a contribution smaller than one remain. Visible ecosystem details are rounded to tenths; they are not the exact operands used in the calculation.

Ecosystem parameters by level
LevelTrustImpact (cap, k)Assurance (cap, k)
Verified16, 0.81.6, 0.8
Confirmed0.74, 11, 1
Declared0.42, 1.20.4, 1.2
Observed0.10.8, 20.15, 2
Disputed00, 10, 1

9. Data that does not score today and marginal effects

ΔI(item) = I(current data) − I(data without item)
ΔR(item) = R(current data) − R(data without item)
In general: ∑ items ΔI ≠ I and ∑ items ΔR ≠ R

Linking an improvement to an SDG or recording a VSME report does not itself add Impact or Reliability points. The improvement and its evidence are assessed in their original records; they are not counted again here. A draft does not contribute to the score.

These do not score directly: goals and progress percentages; private or shared energy, water, fuel and waste measurements; averages and household context; private invoices and reading documents; generic attachments to goals, recognitions or measurements; declared dates; saved strategies or strategy applications; community contributions not made official; service location and map coordinates. A document or action may separately have another scoring role: simply appearing in these sections does not create one.

The i indicators compare the loaded profile with the same profile after removing one input, using the same production engine. For a practice, the practice is removed; for a resource, its scoring links or document are removed; for a relationship, that row is removed and the ecosystem is also recalculated, including its endpoints' intrinsic values. A field is replaced with null. Nothing is written to or deleted from the database.

Changes to the profile's own practices, evidence or identity preserve the received ecosystem contribution: only the origin's own intrinsic value would change, and it is never counted as a neighbor or revisited. Removing a connection changes the graph and counterparts' intrinsic values, so the full graph is recalculated. For documents, the internal legacy model counts link rows even when the document cannot be resolved: this comparison preserves that actual behavior.

Zero can mean exclusion, a duplicate family, rounding, a cap or replacement by other evidence. A negative Reliability effect can be real: adding an unsupported practice increases the coverage denominator. If removing the last practice leaves the profile unscored, no subtraction against zero is presented. Numerical effects are withheld when a reserved aggregate is involved, to prevent reconstruction of hidden scores.

The breakdown is requested when an i indicator requiring calculation is first opened and is reused while it remains loaded in the profile. After editing, reload the profile to obtain an updated breakdown. These explanations are not presented as a causal prediction of environmental impact or as an additive or Shapley allocation. A newly added entry without an available calculation receives the general rule and a notice that its breakdown is missing.

10. Reproducible numerical example

n=3; C=1; B=1; F=1; J=W=U=V=0; m=4; K=Nᴵ=Nᴿ=0
L=(L1,L1,L1); Q=0.015; S=0.1269; P=11.9; D=N=0; Ipublic=11.9
Band T2: L=60, H=69
x=(1, 1/3, 0.4, 0, 0, 1, 0, 0)
q=0.28×1 + 0.24×(1/3) + 0.14×0.4 + 0.08×1 = 0.496
R=round(60+9×0.496)=64; grade C
Without the document: C=B=F=0; band T0; q=0.08; R=round(49×0.08)=4
Document effect: ΔI=0; ΔR=64−4=60

Assume three official practices, one relevant own document with confirmed links to all three, all four fields complete and no connections. That single publisher covers every practice, but creates no independence. The order of x is coverage, depth, foundation, independence, corroboration, completeness, relationships and ecosystem.

The document's large marginal effect is due to the change of band. It does not mean that every document is worth 60 points. A second equivalent document from the same publisher, with the same links and relevance, can have zero marginal effect because coverage is unchanged and no additional family appears. If the three practices are read as L1, removing one lowers Impact from 11.9 to 9.1, but Reliability stays at 64.

11. Versions, history and maintenance

Calculation identity = (composite version, Impact version, Reliability version, explanation revision, code revision)

The current engine declares composite model 2.0, Impact 2.0 and Reliability 1.3. Impact 2.0 is provisional: the previous calculation, Impact 1.3, remains in the code and is restored by changing one constant. The revision of this text is independent: correcting or extending an explanation without altering results does not change the formula version. Evolution snapshots keep versions and build revision when available; an old result is not rewritten with the current formula.

Semantic history in brief: composite 1.0 used one verdict per edge; 1.1 introduced per-participant tiers and saturation; 1.2 added the ecosystem; 1.2.1 removed the direct evidence bonus from Impact and fixed the scale by family; Reliability 1.3 was activated under composite 1.3; composite 1.4 introduced the semantic relationship categories of Impact 1.3 and the combined limit of 4; composite 2.0 replaced the count of practices with the reach of each contribution, with provisional Impact 2.0. This revision's downloadable appendix preserves only the engine it documents; it does not reconstruct every historical engine.

This page's tables come from the engine constants, and the indicators run the engine itself. The build also checks hashes of calculation-defining files against the reviewed manifest. Changes to those files require review of formulas, appendix and manifest; changes to results require increases to the affected versions and composite version. A refactor leaving all results unchanged may retain them if equivalence is documented and tested.

The methodology explains the deployable algorithm of this revision; it does not turn future philosophy, uncalibrated measurements or roadmap ideas into active features. The downloadable file allows review of helper functions, aliases, reading rules and normalization without relying on outdated comments.

Impact and Reliability algorithm · EkoPulse