novaWaste2 indicators and their implied methodologies: distillation
On this page
- 1. Every reported number
- 2. Candidate indicator register
- WI-01 Waste mass collected
- WI-02 Recyclable mass by material
- WI-03 Diversion rate (landfill avoidance)
- WI-04 Recyclable mass sold to recyclers (and collection-to-sale balance)
- WI-05 Weighing records (collections)
- WI-06 Collection days and mass per collection day
- WI-07 Service points by lifecycle stage (stock and flow)
- WI-08 Service points by occupancy
- WI-09 Service outcome per service point per period (collection status)
- WI-10 Service points collected
- WI-11 Service coverage / collection rate
- WI-12 Missed services (un-scanned)
- WI-13 Households and people served
- WI-14 Mass per serviced point, per household, per person
- WI-15 Service satisfaction score
- WI-16 Perceived change in quality of life
- WI-17 Source-separation quality
- WI-18 Evaluation schedule compliance
- WI-19 Follow-up completion and reach
- WI-20 Service withdrawals (terminations)
- WI-21 Scan-verified collection success per collector
- WI-23 Active collectors and collector-days
- WI-24 Bag contamination (computed, not reported)
- Cross-cutting judgements a standard should make explicit
- 3. Gaps (inferred)
- 4. Operational numbers (not indicators)
Sweep scope: every number novaWaste2 reports (dashboard screens, scheduled emails, PDF/xlsx reports), traced to the dbt model that produces it, then stated as a candidate indicator with an explicit calculation rule. Entities and activities/choice lists are sibling sweeps (entities.md, activities sweep); generic terms below follow entities.md (Stand = service point, Block = service zone, Waste Site = facility, Waste Picker = collector, Town = service area, Collection Status = service outcome).
Path prefixes, all in ~/novaWaste2: D/ = services/dashboard/, M/ = dbt/models/marts/, I/ = dbt/models/intermediate/, S/ = dbt/models/staging/, MIG/ = db/migrations/, DD = arch/design/dashboard.md. A :n is a line number. Indicator ids (WI-nn) are local to this document.
II conventions applied: one indicator across axis values, not one per breakdown; rates are rolled up by summing numerators and denominators, never by averaging (greeningstandard ADR-0011; novaIndicators ADR-0002); value rows at finest grain, never summed across a required axis (novaIndicators ADR-0016); alongside counts beside the value (ADR-0018); scores and other distributions as kind measure (ADR-0019); a methodology may serve several indicators (greeningstandard ADR-0015); records outside the plan are reported separately (ADR-0020); derived values are derived, never captured (ADR-0023). Result levels: input, activity, output, outcome, impact.
Cross-cutting facts about every figure below:
- Business date. Every date is the device-local SurveyCTO
starttimein Africa/Johannesburg, never the revision timestamp, so a later correction never moves work to the correction day (S/stg_collection.sql:13-15,S/stg_collection_weight.sql:15-16). - Corrections and voids are applied once, in
stg_submission_field, before any indicator: an active Correction replaces a value, a Field Void drops one value, a Submission Void drops the whole record (S/stg_submission_field.sql:186-228). Rejected and tombstoned submissions are excluded upstream (S/stg_collection.sql:2-3). No indicator handles corrections itself. - Absence is not zero. A blank weight field is dropped, not counted as 0 kg (
S/stg_collection_weight.sql:14-15,:50). - As-of dependence. Service outcomes, schedule statuses,
kg_30dand Overview counts depend on the reading date (as_of, default today SA time) (M/mart_collection_status_asof.sql:10-15). Re-reading a past week later can change it (a status can move frompending-servicetoun-scanned). - Unit of observation for mass is the weighed quantity: one category weight inside one weighing submission (
S/stg_collection_weight.sql:1), key(ingestion_event_id, payload_key)(M/mart_payable_weights.sql:2-3).
1. Every reported number
Surfaces: OV Overview, PO Process Overview, MAP Mapping, WC Waste collected, WR Waste collected monthly report (xlsx), SV Service, SE Stand evaluation, MPK WSF meeting pack (PDF), WE weekly email (+xlsx, R charts), MS missed-stands email, FU follow-up email, ES evaluation-sample email, PY Payments, AC Actions.
| displayed as | source code | underlying model | computation | candidate indicator | level | unit | unit of observation | axes seen | notes |
|---|---|---|---|---|---|---|---|---|---|
| OV hero “Total waste collected” (month, delta vs previous month) | D/screen_overview.go:144; D/page.go:270 (all sites); D/screen_overview.go:21 (one site) |
M/mart_process_overview.sql:57-61 (kg_weighed); M/mart_daily_progress.sql:82-89 (site) |
sum of weight_kg by month of collected_on | WI-01 waste mass collected | output | kg | weighed quantity | month; facility | all-sites path reads staging, WC reads mart_collection_weights; equal after a build (DD F.14) |
| OV hero “Stands collected” (month) | D/screen_overview.go:156 |
M/mart_process_overview.sql:40-47 |
distinct stands with status collected in a Service Week whose Monday is in the month |
WI-10 service points collected | output | count | service point | month | week spanning two months counts in the Monday’s month |
| OV hero “Stands collected” (site picked, latest Service Week) | D/screen_overview.go:149 |
M/mart_town_overview.sql:59-71 |
eligible stands with status collected in the town’s newest week_start |
WI-10 | output | count | service point-week | facility; week | label switches to weekly when a site is picked |
| OV chart “Cumulative enrolled Stands and bins placed per month” | D/screen_overview.go:164 |
M/mart_process_overview.sql:22-38 |
running sum of monthly n_enrolled and n_placed | WI-07 service points by lifecycle stage (flow, cumulated) | output | count | service point | month; stage | n_placed counts current placed stands by last placement month, so a later termination removes a stand from history |
| OV “Per Waste Site” table: Stands, Eligible, Enrolled, Bins placed, Terminated, Blocks | D/screen_overview.go:176-196; D/page.go:246 |
M/mart_town_overview.sql:26-49; M/mart_stand_eligibility.sql |
counts per facility, plus Unassigned row and Town total | WI-07 lifecycle stock; Blocks = zone count (context) | output | count | service point; zone | facility; stage | Town total is a sum of site rows (counts only) |
| OV table “Collected / Un-scanned latest Service Week” | D/screen_overview.go:184-185 |
M/mart_town_overview.sql:59-71 |
eligible stands per status in newest week | WI-10, WI-12 | output | count | service point-week | facility | |
| OV table “kg, 30 days” | D/screen_overview.go:186 |
M/mart_town_overview.sql:74-84 |
kg with collected_on in (as_of−30, as_of] by collection’s facility | WI-01 | output | kg | weighed quantity | facility; rolling 30 days | window baked in at build |
| PO tiles “Blocks” (+ “Unassigned Blocks”), “Stands” | D/screen_process_overview.go:179-180 |
M/mart_town_overview.sql:41-49 |
non-retired blocks; all stands | WI-07 / zones | output | count | zone; service point | facility | |
| PO tile “Empty or non-residential Stands” | D/screen_process_overview.go:181; :20 |
M/mart_stand_eligibility.sql:103-162 |
stands with occupancy_class in (vacant, non_residential) | WI-08 service points by occupancy | input (context) | count | service point | facility; occupancy class | override: vacant/non-res reads occupied if enrolled and placed after the enumeration (:115-122) |
| PO donut “of enumerated Stands have bins placed” | D/screen_process_overview.go:183 |
M/mart_town_overview.sql:33 |
n_placed / n_stands × 100 | WI-07b placement rate | output | % | service point | facility | denominator is all canonical stands, incl. vacant and unknown |
| PO “Stands enrolled” % and n / N | D/screen_process_overview.go:184-185 |
M/mart_town_overview.sql:32 |
n_enrolled / n_stands | WI-07b enrolment rate | output | % | service point | facility | same all-stands denominator |
| PO “enrolments required” | D/screen_process_overview.go:186 |
M/mart_stand_eligibility.sql; M/mart_town_overview.sql |
max(0, occupied − enrolled) | WI-07c enrolment gap | output (gap) | count | service point | facility | mixes two populations: occupied stands vs all signed enrolments |
| PO strip “Bins placed”, “placements required”, “Stands with a Termination” | D/screen_process_overview.go:187-191; :26 |
M/mart_town_overview.sql:33-34; M/mart_actions.sql (enrolled_not_placed) |
counts | WI-07, WI-20 terminations | output | count | service point | facility | placements required is an action list count (section 4) |
| PO tiles “Eligible Stands of N”, “Collected / Un-scanned latest Service Week”, “Waste collected last 30 days” | D/screen_process_overview.go:197-203 |
M/mart_town_overview.sql |
as OV | WI-07, WI-10, WI-12, WI-01 | output | count / kg | facility | ||
| PO chart + “Last 12 months” table: Enrolled, Bins placed, Stands collected, kg | D/screen_process_overview.go:208-230 |
M/mart_process_overview.sql |
monthly flows | WI-07 flow, WI-10, WI-01; n_collections (WI-05) is in the mart, not shown | output | count / kg | month | xlsx download of the months frame | |
| MAP tiles Stands, Bins placed, Blocks, Unassigned Blocks | D/screen_mapping.go:28-45 |
M/mart_stand_status.sql, M/mart_blocks.sql |
counts under the pills | WI-07 | output | count | service point; zone | facility; zone; stand status or service outcome | map colour = per-stand stand status or latest-week service outcome |
| WC hero “Total waste” (+ delta) and tiles Recyclable, Non-recyclable, Sanitary, Organic, Other | D/screen_waste_collected.go:1321-1325; :32; wcTiles :477-494 |
M/mart_collection_weights.sql; MIG/20261007000300_create_waste_category.sql:33-62 |
kg per month per bucket; NULL category → unsorted → bucket recyclable; Other = total − four buckets |
WI-01 with stream axis | output | kg | weighed quantity | month; facility; collector; stream | unsorted (Mfidikwe scale batches) shows as Recyclable here |
| WC chart “kg per month by Waste Category” (12 months) | D/screen_waste_collected.go:45, :694 |
same | same, 12 months | WI-01 | output | kg | month; stream | ||
| WC table “Waste Pickers”: Collections, kg | D/screen_waste_collected.go:58 |
M/mart_collection_weights.sql, M/mart_collections.sql |
per collector label: distinct weighing submissions; sum kg | WI-05 collections; WI-01 by collector | activity / output | count / kg | weighing submission | collector; facility; month | unresolved QR becomes “Unresolved QR Code x” bucket |
| WC chart “kg per Waste Picker by Waste Category” | D/screen_waste_collected.go:118, :786 |
same | kg per collector × bucket | WI-01 | output | kg | collector; stream | ||
| WC tile “Collections” (weighed this month) | D/screen_waste_collected.go:1328-1343 |
same | sum of picker collections | WI-05 | activity | count | weighing submission | month; facility | |
| WC tile “Un-scanned” (eligible Stand-Service Weeks) | D/screen_waste_collected.go:83, :1344 |
M/mart_collection_status_asof.sql |
eligible stand-weeks with status un-scanned, weeks whose Monday falls in the month | WI-12 missed services | output | count | service point-week | month; facility | DD C.4.5 and F.12 describe an older definition (all stands with a block); code now restricts to eligible |
WC chart “kg per day by Waste Site” (+ xlsx kg_per_day) |
D/screen_waste_collected.go:104, :729 |
M/mart_collection_weights.sql |
kg per day per facility | WI-01 | output | kg | day; facility | ||
| WC weekday grid (Scanned / No scans / Weekend) | D/screen_waste_collected.go:72, :271 |
M/mart_picker_daily.sql, M/mart_picker_day.sql |
distinct QR codes scanned per collector-day; kg per collector-day | WI-23 collector active days | activity | count | collector-day | collector; day | operational review grid; feeds jobs gap |
| WC “Site jumps” | D/screen_waste_collected.go:297 |
M/mart_collections.sql |
collectors weighing at >1 facility in a week | — | — | count | collector-week | operational (section 4) | |
| WC flag chips (per kind; “Over-reported”, “Under-reported”) | D/screen_waste_collected.go:246, :957-981 |
M/mart_weight_flags.sql |
flag counts | — | — | count | weighed quantity / collector-day | data-quality, operational (section 4) | |
| WR Summary “Recyclables by material” (material, family, kg, share) | D/screen_waste_collected_report.go:21, :157-176; :67-90 (families) |
M/mart_collection_weights.sql |
kg per category code mapped to 10 material families; share = kg / grand total of recyclables | WI-02 recyclable mass by material | output | kg; % | weighed quantity | material family; material; month; facility | family map lives only in Go (wcMaterials); unsorted lands in “Other” |
| WR Summary “Waste streams” kg, share, “Recycling rate” | D/screen_waste_collected_report.go:177-187 |
same | recyclable bucket kg / total kg | WI-03 diversion rate (variant C) | outcome | % | weighed quantity | month; facility | unsorted counted as recyclable; organic not counted |
| WR Summary “Collection activity”: Collections, Collection days, Waste Pickers, Waste Sites | D/screen_waste_collected_report.go:188-200 |
same | distinct events, days, collector labels, facilities in the month | WI-05, WI-06, WI-23 | activity | count | month; facility | “Waste Pickers” is the only active-collector count anywhere | |
| WR Trends: kg by family and stream per month, 12-month total, recycling rate per month | D/screen_waste_collected_report.go:205-285 |
same | as Summary over 12 months; 12-month rate from summed kg | WI-01, WI-02, WI-03C | output / outcome | kg; % | month; family; stream | rate rolled up correctly (sum then divide) | |
| WR Data sheet (every weighing) | D/screen_waste_collected_report.go:35, :288-297 |
same | rows | (evidence) | — | kg | weighed quantity | finest-grain value rows already exist here | |
| SV hero “Collected” (n, % of Stands, delta vs previous week) | D/screen_service.go:433-437; :46 |
M/mart_collection_status_asof.sql + M/mart_stand_eligibility.sql |
eligible stands with status collected in the week / eligible stands with a status that week | WI-11 collection rate (variant A) | output | count; % | service point-week | week; facility; zone | |
| SV tiles “Stands with a bin placed”, “No waste”, “No access”, “Un-scanned”, “Pending or newly placed” | D/screen_service.go:441-447 |
same | eligible stand-weeks by status; No access = no-bin-access + no-stand-access; Pending = pending-service + recent-placement | WI-09 service outcome distribution | output | count | service point-week | week; facility; zone; status | “Stands with a bin placed” is actually eligible stands with a status row |
| SV chart “Stands per Collection Status, last 12 Service Weeks” | D/screen_service.go:453; :46 |
same | counts per week × status | WI-09 | output | count | service point-week | week; status | |
| SV “Waste Pickers” card: Collected, No waste, No access, Un-scanned, Pending, Total | D/screen_service.go:57, :468 |
same; picker = block’s modal picker of the week (I/int_weekly_picker_analysis.sql:1-13) |
counts per picker × status | WI-09 by collector | output | count | service point-week | collector; status | collector attribution is block-level, legacy fallback (alphabetical max) |
| SV “Overall Progress”: Enrolments, Placements, Collected, No waste, No bin access, Un-scanned, kg, kg per collected Stand | D/screen_service.go:68, :240-245, :499 |
M/mart_daily_progress.sql |
daily counts; statuses by last_service_date; kg/collected recomputed after summing | WI-07 flow, WI-09, WI-01, WI-14 mass per serviced point | output | count; kg; kg/stand | site-day | day / week / facility (re-grouped) | status counts here are all stands with a block, placed or not, not eligible-only (M/mart_daily_progress.sql:15-17) |
| SE hero “Eligible Stands” (n, % of N) | D/screen_stand_evaluation.go:49 |
M/mart_stand_eligibility.sql |
is_eligible count / all stands | WI-07 eligible | output | count; % | service point | — | |
| SE tiles Completed, Attempted, Missed, Scheduled; card “% of Scheduled Evaluations completed” | D/screen_stand_evaluation.go:41; DD D.2 |
M/mart_evaluation_schedule_status.sql:9-17; M/mart_evaluation_schedule_status_current.sql:1-15 |
issued scheduled evaluations in the month by status; completed / all four | WI-18 evaluation schedule compliance | activity (verification) | count; % | scheduled evaluation | month; status | |
| SE tile “Stands with an upcoming Evaluation”, “Scheduled Evaluations ahead” table, Planning card | D/screen_stand_evaluation.go:30, :53, :58 |
M/mart_evaluation_schedule_next_upcoming.sql, M/mart_evaluation_schedule_daily_workload.sql |
counts ahead | — | — | count | operational (section 4) | ||
| SE “Satisfaction” bars | D/screen_stand_evaluation.go:77 |
M/mart_stand_evaluations.sql |
completed evaluations in month per project_satisfaction_label | WI-15 satisfaction | outcome | count per label | evaluation submission | month; score | |
| SE “Evaluations this month, worst first” (Bins still available, Bin condition, Correct bin use, Satisfaction) | D/screen_stand_evaluation.go:66 |
M/mart_stand_evaluations.sql |
row list, ordered: attempts first, then bins_still_available | (evidence for WI-17, gaps G-11, G-12) | — | — | evaluation submission | answers are listed, never aggregated | |
| MPK 2.3 map and “Status counts (Eligible Stands)”: Stands, Share | D/screen_meeting_pack.go:65, :288-333 |
M/mart_collection_status_asof.sql + eligibility |
eligible stand-weeks per status / all | WI-09 | output | count; % | service point-week | week; status | |
| MPK 2.3 “Service per weekday and Waste Site”: Service fulfilled, Waste collected, No waste, Waste not collected, Service missed, Recent placement, Coverage | D/screen_meeting_pack.go:370-394 |
same | Coverage = (collected + no-waste) / (stands − recent-placement) | WI-11 coverage (variant D) | output | % | service point-week | service weekday; facility | access failures count against coverage here |
| MPK 2.4 “Stand evaluations”: Total Sampled, Attempts, Successful, Successful Rate | D/screen_meeting_pack.go:74, :397-411 |
M/mart_evaluation_schedule_status.sql |
issued schedules in week; attempts = completed or attempted; rate = completed / attempts | WI-18 (visit success variant) | activity | count; % | scheduled evaluation | week; facility | “Compliance Rate” printed as “no v2 source” (:41) |
| MPK 2.4 “Follow-up surveys”: Missed Collections, Follow-ups Done, Suitable Respondent, Compliance Rate, Reach Rate | D/screen_meeting_pack.go:84, :412-458 |
M/mart_collection_follow_ups.sql + status |
done / missed (un-scanned eligible); suitable / done | WI-19 follow-up completion and reach | activity (verification) | count; % | follow-up submission; service point-week | week; facility | definitions “assumed, printed” (:44) |
| MPK 2.5 “Waste Picker kg per day” and Pay, Bonus, Total | D/screen_meeting_pack.go:91-101, :461-519 |
M/mart_picker_pay_daily.sql, M/mart_picker_pay_weekly.sql |
payable kg per collector-day; weekly pay + recycler bonus | WI-01 by collector (payable subset); WI-22 collector income | output; outcome | kg; ZAR | collector-week | collector; weekday; period site | payable kg excludes exceptions and pre-first_payable_on |
| MPK 2.6 “Sorting and data capturing per submission”: category weights, Total kg, SaS compliance, WP compliance | D/screen_meeting_pack.go:104, :521-566 |
M/mart_collections.sql (sas_compliance, wp_compliance) |
per submission listing | WI-17b SaS compliance at weighing (evidence rows) | outcome (evidence) | label | weighing submission | ||
| MPK “Landfill avoidance per Waste Site”: Recyclables, Non-recyclables, Organic, Sanitary, Total kg, Landfill avoided | D/screen_meeting_pack.go:115, :568-612 |
M/mart_collection_weights.sql + waste_category.bucket |
(recyclable + organic) / total, unsorted → recyclable | WI-03 diversion rate (variant A) | outcome | kg; % | weighed quantity | week; facility; stream | |
| MPK “13-month landfill avoided % per Waste Site” | D/screen_meeting_pack.go:614-640 |
same | same per month | WI-03A | outcome | % | month; facility | ||
| MPK “Recycler payments”; “Recycling balance”: Recyclable kg collected, kg invoiced, Balance kg, Invoiced, Payments | D/screen_meeting_pack.go:127-141, :650-675 |
M/mart_site_recycling_balance.sql |
per facility-month; balance = collected − invoiced | WI-04 recyclables sold (and balance) | outcome | kg; ZAR | facility-month; recycler payment | month; facility | collected side drops NULL category (unsorted) by inner join (M/mart_site_recycling_balance.sql:22-24) |
| WE Summary: Stands, Enrolled, Placed, Eligible, Households, People, Eligible Stands collected, Service coverage, Evaluations completed, Terminations | D/email_weekly.go:35-58, :141, :430-432 |
M/mart_town_overview.sql, M/mart_enrollments.sql, status, M/mart_stand_evaluations.sql, M/mart_stand_termination_latest.sql |
snapshots; coverage = (collected + no-waste + no-bin-access + no-stand-access + recent-placement) / eligible stands that week | WI-07, WI-13 households, WI-10, WI-11 (variant B), WI-18 (evaluations completed), WI-20 | output | count; % | town; week | ||
| WE “Waste streams” per town: per bucket, Uncategorised, Total | D/email_weekly.go:82, :436-444 |
M/mart_collection_weights.sql |
kg per bucket; NULL or unsorted → uncategorised |
WI-01 stream axis | output | kg | weighed quantity | town; week; stream | unsorted is “uncategorised” here, Recyclable on WC |
| WE “Evaluation schedule compliance”: Due, Completed, Attempted, Missed, Still scheduled, Compliance | D/email_weekly.go:74, :446-453 |
schedule status | completed / due (issued, scheduled that week, status today) | WI-18 | activity | % | scheduled evaluation | town; week | |
| WE “Households and people”: Enrolled Stands, Households, People, Households per Stand, People per household | D/email_weekly.go:141, :455-457 |
M/mart_enrollments.sql; I/int_enrollment_latest.sql:28-29 |
sums over each stand’s latest enrolment; ratios | WI-13 | output | count; ratio | service point (latest enrolment) | town | denominator is enrolment rows: Mfidikwe keeps unsigned enrolments (I/int_enrollment_latest.sql:40-41) |
| WE per town “latest and trailing statistics” (latest week, trailing 4/13 weeks, YTD, since inception) and “change summary” (WoW, MoM, QoQ, YoY): Total kg, Average kg per service day, Collected stands (n, %), Scanned stands (n, %), Un-scanned stands (n, %), Kg landfill avoidance, Landfill avoidance %, Kg per stand, Kg per household, Kg per person, Mean satisfaction | D/email_weekly.go:629-678 (wkMetrics, wkStats), :94-130 (series SQL), :716-775 |
status, M/mart_enrollments.sql, weights, evaluations |
see WI-01, WI-06, WI-11, WI-12, WI-03, WI-14, WI-15; windows sum period rows then divide | WI-01, WI-06, WI-11 (variant C), WI-12, WI-03 (variant B), WI-14, WI-15 | output / outcome | kg; count; %; kg/stand; kg/hh; kg/person; score | service point-period; weighed quantity; evaluation | town; window; comparison | status series is not eligibility-filtered and counts no-stand-access as un-scanned (:94-107) |
| WE “Trend” sheet: 52 weeks total kg, collected stands %, mean satisfaction per town | D/email_weekly.go:466-475 |
same | per-week wkStats | WI-01, WI-11C, WI-15 | week; town | ||||
| WE “Satisfaction” (count per score label), “SaS compliance” (collections per sas_compliance_label) | D/email_weekly.go:60-72 |
evaluations; M/mart_collections.sql |
counts | WI-15; WI-17b | outcome | count | evaluation; weighing submission | town; week; label | |
| WE “QoL”: % better, % same, % worse, n per question (latest complete month) + Likert chart (12 months) | D/email_weekly.go:158; D/email_weekly_charts.go:15-35, :96-121, :352-366 |
M/mart_stand_evaluations.sql (qol_*) |
5-level codes collapsed to better (top 2) / same / worse (bottom 2); unknown codes left out of n | WI-16 perceived change in quality of life | outcome / impact | % | evaluation submission | town; month; question; level | |
| WE “SaS ratings”: % very good+little mixing, % noticeable mixing, % lots of mixing or missing bin, n per stream | D/email_weekly.go:168; D/email_weekly_charts.go:53-77, :125-186, :371-400 |
M/mart_stand_evaluations.sql (sas_*_rating) |
5 codes → 3 levels; Empty and Misused_bin dropped; Smashblock and Ikemeleng only | WI-17 source-separation quality | outcome | % | bin rating (stand × stream) | town; month; stream; level | |
| WE charts: collected stands %, stands by status bands, kg by stream, avg kg per service day, cumulative kg by stream since first week, landfill avoidance %, satisfaction mean ± se + boxplot | D/email_weekly_charts.go:201-350; D/r/email_charts.R:305-335 |
as above | mean and standard error of score distribution per week | WI-11C, WI-09, WI-01, WI-06, WI-03B, WI-15 (measure) | week; town; stream | ||||
| MS “Collection attempts by Waste Picker”: Attempts, Collected, No waste, No access, Other, Not today’s service day, Success rate | D/email_missed_stands.go:30-72, :180-215 |
M/mart_picker_activity.sql, M/mart_qr_registry.sql |
QR scans of the day resolved to a stand, one per stand (Collection wins); success = collected / attempts | WI-21 scan-verified collection success | activity | count; % | scan (stand-day) | facility; collector; day | unverified scans tabled separately (ADR-0020 analogue) |
| MS “Collection success for each Waste Site”: Stands, Collected, No waste, No access, Missed, Due today, Recent placement, Service coverage | D/email_missed_stands.go:76, :255-305 |
status + eligibility | coverage = (collected + no-waste + no-access + recent) / eligible stands; unknown counts as missed |
WI-11 (variant B) | output | % | service point-week | facility; service weekday | |
| FU “Service report”: Stands, Collected, Un-scanned, No waste, Pending service, Follow-up (4 weeks) | D/email_follow_up.go:34-46, :134-144 |
status (terminated stands left out, eligibility not applied) | counts per week | WI-09 | output | count | service point-week | week; status | |
| FU “Follow-up completion”: Required, Completed, Open, Completion | D/email_follow_up.go:24-46, :136-144 |
status + M/mart_collection_follow_ups.sql |
required = follow-up stand-weeks placed before the service date; completed = a follow-up survey within 7 days | WI-19 | activity (verification) | % | service point-week | week | legacy status-match dropped (:29-33) |
| FU “Evaluation schedule”: Scheduled, Completed, Missed, Total | D/email_follow_up.go:48, :175-181 |
schedule status | counts by period | WI-18 | activity | count | scheduled evaluation | period | |
| PY hero “Payable” (R), tiles Exceptions, Waste Pickers, Open drafts; Payable lines, Exceptions, Unallocated bonus, Period sites | D/screen_payments.go:47-110, :1300-1362 |
M/mart_payable_weights.sql, M/mart_recycler_bonus_shares.sql, M/mart_picker_pay_weekly.sql |
money owed per collector | WI-22 (hidden outcome) | operational | ZAR | section 4 | ||
| PY “Recycling balance” table | D/screen_payments.go:242 |
M/mart_site_recycling_balance.sql |
as MPK | WI-04 | outcome | kg; ZAR | facility-month | month; facility | |
| AC six count tiles | D/screen_actions.go:20-40 |
M/mart_actions.sql:1-20 |
stands per action kind | — | — | count | service point | kind | operational (section 4) |
Models computed but not displayed anywhere: M/mart_sorting_evaluations.sql (bag contamination, passed), mart_daily_progress.weight_per_visited_stand (M/mart_daily_progress.sql:138), mart_process_overview.n_collections, evaluation answers burn_waste, bags_received, service_received, wp_relationship* (M/mart_stand_evaluations.sql:45-53), collection_follow_ups.collection_status (household’s own answer). The weekly email says the sorting evaluation “has no V2 source yet” (D/email_weekly.go:567-568) although the mart now exists.
2. Candidate indicator register
Kind: count / rate (numerator + denominator) / measure (one value per unit), per novaIndicators ADR-0002/0019. Axes: R = required (never summed across, novaIndicators ADR-0016), otherwise optional. “Period” means a reporting interval on the ISO-week (Monday start) or calendar-month calendar in the project time zone.
WI-01 Waste mass collected
- Level output. Unit kg. Kind count (sum). Unit of observation: weighed quantity.
- Axes: period (R), service area, facility, collector, waste category (→ stream via
skos:broader; streams recyclable, non_recyclable, organic, sanitary, plus uncategorised). - Rule. Sum the mass of every weighed quantity recorded on a weighing record whose business date (device-local start date) falls in the period. A weighed quantity is one non-blank decimal weight, either a per-category field or one batch of an uncategorised scale repeat (
S/stg_collection_weight.sql:5-16,:39-50); a blank field is absent, not zero. Records are taken after corrections, Field Voids and Submission Voids are applied; rejected records are excluded. The facility is the one the record’s service-group QR resolves to; a record whose QR resolves to none keeps a null facility and still counts in the service-area total (S/stg_collection.sql:6-12;M/mart_daily_progress.sql:26-30). The collector is the person whose collector QR assignment window covers the record’s start instant (I/int_collection_payee.sql:1-11); unresolved stays visible as such. No payability cut (first_payable_on), exception or rate is applied: those belong to payment, not to mass (contrastM/mart_payable_weights.sql:84-85). - Variants in code: monthly (
M/mart_process_overview.sql:57-61), daily per facility (M/mart_daily_progress.sql:82-89), rolling 30 days (M/mart_town_overview.sql:74-84), per stream (D/screen_waste_collected.go:32,D/email_weekly.go:82). - Judgements to make explicit. (J1) Uncategorised mass: Mfidikwe weighs unsorted scale batches with no category; the catalog maps them to code
unsortedin bucketrecyclable(MIG/20261007000300_create_waste_category.sql:60-61, comment “the recyclables the pickers are paid for”). WC and the meeting pack show it as Recyclable, the weekly email as Uncategorised (D/email_weekly.go:80-88), the recycling balance drops it (M/mart_site_recycling_balance.sql:22-24). The standard should require “uncategorised” as its own stream value and forbid assigning it to a stream by default. (J2) The stream classification of each category is a project-level catalog, not data; the standard should publish the category scheme withskos:broaderstreams.
WI-02 Recyclable mass by material
- Level output. Unit kg (share in %). Kind count; share is a rate with denominator = all recyclable kg. Unit of observation: weighed quantity.
- Axes: period (R), facility, material family (PET, HDPE, LDPE, PP, PVC, paper and cardboard, glass, metal, e-waste, other), material (category).
- Rule. WI-01 restricted to categories in the recyclable stream, grouped by a material-family mapping of category codes (
D/screen_waste_collected_report.go:67-90); share = family kg / all recyclable kg in the same period and scope. - Judgements. The family mapping exists only in Go; a standard needs it as a concept scheme because it is the bridge to AMS-III.AJ material types. Unsorted falls into “Other”.
- GHG link. This is the per-material quantity
material_processed_tonnesbymaterial_typethat AMS-III.AJ needs (~/GHG_methodologies/CDMSmallScale/cdmAmsIIIaj/R, baseline argsmaterial_processed_col,virgin_emission_factor_col), but only once the mass is shown to have been recycled (WI-04), not merely collected.
WI-03 Diversion rate (landfill avoidance)
- Level outcome. Unit % (and kg diverted). Kind rate. Unit of observation: weighed quantity.
- Axes: period (R), facility, service area.
- Rule as the code implies it (three incompatible variants):
- A, meeting pack “Landfill avoided”: (recyclable kg + organic kg) / all kg, unsorted counted as recyclable (
D/screen_meeting_pack.go:115-125,:568-612). - B, weekly email “Landfill avoidance %” and “Kg landfill avoidance”: diverted = recyclable + organic kg of real categories only (not null, not
unsorted); denominator = all kg including uncategorised; NA when the window has no categorised kg (“legacy include_landfill_avoidance = FALSE”) (D/email_weekly.go:109-121,:645-678). - C, monthly report “Recycling rate”: recyclable kg / all kg, unsorted counted as recyclable, organic not diverted (
D/screen_waste_collected_report.go:186-187,:316).
- A, meeting pack “Landfill avoided”: (recyclable kg + organic kg) / all kg, unsorted counted as recyclable (
- Proposed explicit rule. Diverted mass = sum of WI-01 mass in streams the project design declares diverted (default: recyclable, organic) whose destination is recorded as recovery; diversion rate = diverted mass / all collected mass, with uncategorised mass reported alongside (ADR-0018) and excluded from both numerator and denominator. Roll up by summing kg, never averaging site rates (variant B and C already sum windows correctly;
D/email_weekly.go:645-678). - Judgements. (J1) unsorted; (J3) whether organic counts as diverted without evidence of treatment (none is recorded); (J4) the denominator is collected waste, not waste generated, so this is a “share of collected stream not sent to landfill”, not a municipal diversion rate (see gap G-01); (J5) “avoided” asserts a counterfactual (would have gone to landfill) that the code never tests.
- GHG link. Variant-B diverted organic mass is the candidate
composted_waste_tonnesinput to AMS-III.F only if composting is evidenced; diverted recyclable mass by material feeds AMS-III.AJ via WI-02/WI-04. Non-recyclable and sanitary mass is the residual (residual_disposal_tonnes, III.AJ leakage args).
WI-04 Recyclable mass sold to recyclers (and collection-to-sale balance)
- Level outcome. Unit kg (and ZAR). Kind count per side; balance = collected − invoiced. Unit of observation: facility-month (collected side: weighed quantity; sold side: recycler payment line).
- Axes: month (R), facility.
- Rule. Collected = WI-01 kg of categories in the recyclable stream at facilities, by month of collection date, ignoring payee exceptions (“the kg reached the site”) (
M/mart_site_recycling_balance.sql:4-27). Invoiced = kg on lines of non-voided recycler payments, by month of invoice date; a payment without lines adds money, not kg (:7-8,:29-49). Balance = collected − invoiced; information only, because recyclables wait at a site for weeks (:2-3). - Judgements. NULL-category (unsorted) mass is excluded from “collected” here by the inner join, so the balance for Mfidikwe is understated. Month misalignment between collection and sale is accepted, not modelled (stock carry-over). Voided payments excluded.
- Why it matters. This is the only figure that evidences recovery rather than collection; it is the natural verification source for an AMS-III.AJ quantity and for WI-03’s “destination recorded as recovery”.
WI-05 Weighing records (collections)
- Level activity. Unit count. Kind count. Unit of observation: weighing submission.
- Axes: period (R), facility, collector.
- Rule. Count distinct weighing records with at least one weighed quantity in the period (
D/screen_waste_collected.go:58-70,count(DISTINCT w.ingestion_event_id)); the monthly mart counts every weighing record, weighed or not (M/mart_process_overview.sql:49-55). Same correction/void handling as WI-01. - Judgement. Whether a weighing record with no weights is a collection.
WI-06 Collection days and mass per collection day
- Level activity (days) / output (kg per day). Kind count; ratio = rate.
- Axes: period (R), service area; facility on the report.
- Rule. Collection days = distinct business dates with at least one weighed quantity in scope (
D/email_weekly.go:110-121,count(DISTINCT w.collected_on);D/screen_waste_collected_report.go:188-199). Average kg per service day = WI-01 kg / collection days, both summed over the window’s periods before dividing (D/email_weekly.go:659). A multi-week window sums per-week day counts. - Judgement. “Service day” here means a day anyone weighed in the town, not a scheduled service day.
WI-07 Service points by lifecycle stage (stock and flow)
- Level output. Unit count (and %). Kind count; rates for enrolled share, placed share, eligible share. Unit of observation: service point.
- Axes: stage (R: enumerated, enrolled, placed, terminated, eligible), facility (via zone → service group), period (flow only).
- Rule. Each canonical service point has one stage, first match wins: terminated (latest termination event is a termination and no signed enrolment dated later), placed (latest placement attempt succeeded), enrolled (signed latest enrolment with a date), else enumerated (
M/mart_stand_status.sql:13-25). Eligible = placed and signed enrolment and occupied and in a non-retired zone with a service group (M/mart_stand_eligibility.sql:5-17,:181-182). Stock counts read today’s stage (M/mart_town_overview.sql:26-39). Flow counts a service point in the month of its latest signed enrolment date or latest placement date (M/mart_process_overview.sql:5-14), so the flow sums to today’s stock and history rewrites when a stage changes. Daily flow counts latest enrolment and latest placement by date regardless of success (M/mart_daily_progress.sql:47-64). Shares: enrolled / all service points and placed / all service points (D/screen_process_overview.go:183-184); eligible / all (D/screen_stand_evaluation.go:49). - Judgements. (J6) Placement success differs by town: Mfidikwe
provide_bags = 'Yes', elsewheresuitable_respondent_available = 'Yes'(M/mart_stand_status.sql:18-20; owner question noted atM/mart_stand_eligibility.sql:9-11). (J7) “Signed”: Ikemeleng/Smashblock requireSign, Mfidikwe keeps unsigned rows in the latest-enrolment table and the sign test is applied downstream (I/int_enrollment_latest.sql:35-41). (J8) Restart: a later signed enrolment overrides a termination; same-day stays terminated. (J9) Denominator of the shares is every service point, including vacant and unknown occupancy. (J10) Flow-by-latest-event under-counts churned history; a standard should count enrolment and placement acts as events (activity indicators) and stages as a dated state.
WI-08 Service points by occupancy
- Level input (context, denominator for reach). Unit count. Kind count. Unit of observation: service point.
- Axes: occupancy class (R: occupied, vacant, non_residential, unknown), facility.
- Rule. Latest non-null enumeration status (SurveyCTO first, legacy copy otherwise), mapped: Residential, Business_residential → occupied; Vacant, un_occupied → vacant; Non_Residential → non_residential; anything else → unknown (
M/mart_stand_eligibility.sql:19-30,:141-162). A vacant or non-residential point reads occupied when it is placed and both its signed enrolment date and its latest placement date fall after the enumeration (:115-122). Points enumerated on two June 2023 Smashblock form versions with no status question and a signed enrolment read Residential (:37-40,:74-83,:146). - Judgements. All three overrides are owner decisions embedded in SQL; the standard should state the occupancy-state precedence (latest dated observation of occupancy wins; an enrolment is evidence of occupancy) rather than form-version literals.
WI-09 Service outcome per service point per period (collection status)
- Level output. Unit count (and share). Kind count. Unit of observation: service point-week.
- Axes: week (R), outcome (R: collected, no-waste, no-bin-access, no-stand-access, un-scanned, pending-service, recent-placement, unknown), facility, zone, collector, service weekday.
- Rule. For every service point in a zone with a service schedule, and every week from the zone’s first scanned week, the point’s own last scan in the week (stand QR, or a bin QR routed to the stand through its placement) gives a description mapped to an outcome (
M/mart_collection_status.sql:133-149,:211-218;I/int_stand_scan_daily.sql:1-21; an empty note is a Collection). Weeks whose service date (zone’s weekday, else the observed day) is after the reading date are omitted. Ladder at read time, first match: not scanned and today is the service date → pending-service; scanned → its description; not scanned but last collection less than 8 days ago → carry the last description; not scanned and days outstanding < 2 → carry; never collected and placed less than 8 days ago → recent-placement; else un-scanned (M/mart_collection_status_asof.sql:71-82). Weeks before placement are dropped (M/mart_collection_status.sql:226-232). Most surfaces count eligible points only (joinis_eligible, e.g.D/screen_service.go:46-55);mart_daily_progress, the follow-up email and the weekly series do not. - Judgements. (J11) The 8-day carry-forward makes “collected” mean “collected within the last 8 days”, so a point serviced late in one week can read collected the next; one threshold for all towns, Mfidikwe’s legacy used 7 (
M/mart_collection_status.sql:25;M/mart_collection_status_asof.sql:76-77). (J12) Scan description, not weighing, is the evidence of collection; no mass is tied to a point. (J13) Population differs by surface (eligible vs all points with a zone vs placed). (J14) Collector attribution is the zone’s modal scanner of the week with a legacy alphabetical fallback (I/int_weekly_picker_analysis.sql:6-16). - II mapping. Outcome per point-week is an
impactont:Stateclaim derived from scan records; the ladder is the methodology’s derivation rule and belongs inmeth:calculationRules.
WI-10 Service points collected
- Level output. Unit count. Kind count. Unit of observation: service point (per period).
- Axes: period (R), facility.
- Rule. Weekly: eligible points with outcome collected in the week (
M/mart_town_overview.sql:59-71;D/screen_service.go:433). Monthly: distinct points with outcome collected in any week whose Monday falls in the month (M/mart_process_overview.sql:40-47), not eligibility-filtered. Weekly-email series take one outcome per point per period by legacy priority collected > no-waste > no-workday > un-scanned > no-bin-access > no-stand-access > pending-service > other (D/email_weekly.go:94-107). - Judgement. Month assignment by week start; distinct-in-month vs point-weeks; eligibility filter inconsistent.
WI-11 Service coverage / collection rate
- Level output (reliability of service). Unit %. Kind rate. Unit of observation: service point-week.
- Axes: week (R), facility, service weekday, zone.
- Rule as implied (four variants):
- A, Service hero: collected / eligible points with an outcome that week (
D/screen_service.go:433-437). - B, weekly summary and missed-stands: (collected + no-waste + no-bin-access + no-stand-access + recent-placement) / eligible points; pending-service excluded from the numerator, kept in the denominator; unknown counts as missed (
D/email_weekly.go:41-47,:481-482;D/email_missed_stands.go:255-272,:303). - C, weekly statistics “Collected stands %”: collected / all points with an outcome, not eligibility-filtered; scanned % = (all − un-scanned − no-stand-access) / all (
D/email_weekly.go:94-107,:658-662). - D, meeting pack “Coverage”: (collected + no-waste) / (points − recent-placement) (
D/screen_meeting_pack.go:370-394).
- A, Service hero: collected / eligible points with an outcome that week (
- Proposed explicit rule. Service delivered = the collector reached the point on its scheduled day and recorded an outcome (collected or no-waste); access failures are a separate failure class attributed to the household, not the service; recent placements and pending services leave both numerator and denominator and are reported alongside. Rolled up by summing numerators and denominators across sites and weeks (all four variants already do).
- Judgements. Whether an access failure counts as service delivered (B yes, D no); whether recent placements are in the frame (B numerator, D excluded from denominator, A/C counted only if collected); eligibility of the frame.
WI-12 Missed services (un-scanned)
- Level output (failure). Unit count (and %). Kind count / rate. Unit of observation: service point-week.
- Axes: week (R), facility, zone, collector.
- Rule. Eligible point-weeks with outcome un-scanned (
D/screen_waste_collected.go:83-91;M/mart_town_overview.sql:65). Weekly statistics add no-stand-access (D/email_weekly.go:96, legacy).mart_daily_progress.no_qrcodecounts all points with a zone, placed or not, by service date (M/mart_daily_progress.sql:15-17,:75). - Judgement. Same population and carry-forward judgements as WI-09; “missed” depends on the reading date until 8 days have passed.
WI-13 Households and people served
- Level output (reach). Unit count; ratios households per point, people per household. Kind count / rate. Unit of observation: service point (household and person are counts only, per
entities.md1.4). - Axes: service area; snapshot date (R).
- Rule. Sum household_count and person_count of each point’s latest enrolment, each taken only when the answer is a plain whole number (
I/int_enrollment_latest.sql:28-29); households per point = households / enrolment rows; people per household = people / households (D/email_weekly.go:141-145,:455-457). - Judgements. Frame is every point with a latest enrolment row (Mfidikwe unsigned included; terminated and never-placed included), not points actually served. Non-numeric answers silently drop out of the numerator but not the denominator. Counts are as-of-enrolment, never refreshed (an evaluation-sourced Stand Occupancy Count exists in the schema but is not used).
WI-14 Mass per serviced point, per household, per person
- Level output (intensity). Unit kg/point, kg/household, kg/person. Kind rate.
- Axes: period (R), facility.
- Rule. kg per collected point = WI-01 kg / collected point-weeks, recomputed after summing (
M/mart_daily_progress.sql:18-21,:137;D/screen_service.go:240-245). Weekly statistics: kg / all point-weeks with an outcome; kg per household = kg / Σ households of those point-weeks; kg per person likewise (D/email_weekly.go:94-107,:664).weight_per_visited_stand= kg / (collected + no-waste) exists but is not displayed (M/mart_daily_progress.sql:138). - Judgements. Numerator mass is attributed to facilities and collectors, never to points, so the ratio mixes populations (mass from any collector over points of a facility). Household denominators are person-weeks (household-weeks) in multi-week windows. A per-household generation rate (DD F.5) is an open owner question.
WI-15 Service satisfaction score
- Level outcome. Unit score 0–10. Kind measure (one value per completed evaluation); label distribution as counts. Unit of observation: evaluation submission (household respondent).
- Axes: period (R), service area, facility.
- Rule. Completed evaluations only (
attempt_outcome = 'completed'). Score =project_satisfactionwhen it is an unsigned integer string; mean = Σ score / n over the window’s evaluations (D/email_weekly.go:123-130,:665); the chart draws mean ± standard error and a boxplot from the score counts per week (D/r/email_charts.R:305-335). The label distribution counts every completed evaluation, unanswered as “Not answered” (D/email_weekly.go:60-65;D/screen_stand_evaluation.go:77-85). Question wording “0 = completely unsatisfied; 10 = completely satisfied” (D/email_weekly_charts.go:32-34). Change = plain difference of means (D/email_weekly.go:840-841). - Judgements. DD F.1 says labels like “Qol_good” occur and the legacy mean was 1–10; non-numeric labels are silently excluded from the mean. A mean of window means is avoided (window sums n and Σ score). Should be kind
measure(ADR-0019), not a mean of means.
WI-16 Perceived change in quality of life
- Level outcome (perceived impact). Unit % of respondents. Kind rate (count per level / n). Unit of observation: evaluation submission.
- Axes: month (R), question (R: project overall, ability to dispose of waste, community cleanliness), level (much worse … much better).
- Rule. Completed evaluations in the latest complete month; answer codes mapped to five ordered levels per question; better = top two, worse = bottom two; unknown codes excluded from n and their count reported in a note (
D/email_weekly_charts.go:15-35,:79-121). - Judgements. Retrospective self-report against “since the project started” is the only baseline in the system. Respondent is whoever answered at the visited point (no sampling weight). Evaluations come from the evaluation schedule sample (sampling design is the activities sweep’s).
WI-17 Source-separation quality
- Level outcome (behaviour). Unit % of ratings. Kind rate. Unit of observation: bin rating (point × stream at a completed evaluation).
- Axes: month (R), stream (R: recyclable, non_recyclable, organic), level (good, noticeable mixing, poor or missing), service area.
- Rule. Completed evaluations; five rating codes consolidated to three levels (Very_good + Decent_little_mixing; Average_noticable_mixing; Poor_lots_of_mixing + Missing_bin); Empty and Misused_bin excluded from n; reported only for Smashblock and Ikemeleng (
D/email_weekly_charts.go:53-77,:125-186). - WI-17b SaS compliance at weighing. The weighing form carries the collector’s
SaS_complianceandwp_complianceratings per record; reported as counts per label and per-record lists (D/email_weekly.go:67-72;D/screen_meeting_pack.go:104-111;S/stg_collection.sql:30-32). Unit of observation weighing submission; it rates the collector’s load, not a household. - Judgements. Treating a missing bin as poor separation; dropping empty bins; the town list is hard-coded (
wkSaSTown). DD F.6 asks which score definitions (legacy SaS 0–3) should move to dbt.
WI-18 Evaluation schedule compliance
- Level activity (monitoring/verification performance). Unit %. Kind rate. Unit of observation: scheduled evaluation.
- Axes: period of scheduled date (R), facility, status.
- Rule. Issued scheduled evaluations (status not null) whose scheduled date falls in the period; status at read time: completed (any evaluation of the same point in the visit window completed), attempted (only attempts), missed (no visit and date past), scheduled (
M/mart_evaluation_schedule_status.sql:9-17;M/mart_evaluation_schedule_status_current.sql:1-15). Visit window = the scheduled day, or for legacy weekly samples the frame week. Compliance = completed / due (D/email_weekly.go:446-453). Meeting-pack “Successful Rate” = completed / (completed + attempted) (D/screen_meeting_pack.go:74-82,:397-411). - II mapping. Monitoring-plan adherence; evaluations matched outside a schedule are unscheduled evidence (greeningstandard ADR-0020) and the code already keeps them out of compliance.
WI-19 Follow-up completion and reach
- Level activity (verification of missed services). Unit %. Kind rate. Unit of observation: service point-week (required) / follow-up submission.
- Axes: week (R), facility.
- Rule. Follow-up email: required = point-weeks with outcome un-scanned, no-waste or pending-service, placed before the service date, terminated points excluded; completed = a follow-up submission for the point within service date .. +6 days (
D/email_follow_up.go:24-46). Meeting pack: compliance = follow-ups done in the week / eligible un-scanned point-weeks; reach = follow-ups with a suitable respondent / follow-ups done (D/screen_meeting_pack.go:84-89,:412-458). - Judgement. Two denominators (follow-up set vs un-scanned only); legacy required the follow-up’s reported status to match, v2 does not.
WI-20 Service withdrawals (terminations)
- Level outcome (retention, negative). Unit count. Kind count. Unit of observation: service point.
- Axes: period (R for flow), facility.
- Rule. Stock: points whose stage is terminated (WI-07). Flow: points whose latest termination event (not a reversal) was recorded in the week, by SA-local date (
D/email_weekly.go:53-58). - Judgement. A reversal (error) removes the termination; a restart (new signed enrolment) ends it; only the latest event per point counts, so repeated churn is invisible.
WI-21 Scan-verified collection success per collector
- Level activity. Unit %. Kind rate. Unit of observation: scan resolved to a point, one per point-day.
- Axes: day (R), facility, collector.
- Rule. QR scans of the day resolved to a point through the QR window at scan time, else through the bin code of the point’s latest placement; one row per point (a Collection wins); success = collected / attempts; scans that resolve to no point are tabled separately as unverified (
D/email_missed_stands.go:24-72,:180-215).
WI-23 Active collectors and collector-days
- Level output (jobs proxy). Unit count. Kind count. Unit of observation: collector-day.
- Axes: period (R), facility.
- Rule. Distinct collector labels with a weighed quantity in the month (
D/screen_waste_collected_report.go:188-199); per collector-day weight and scan activity (M/mart_picker_day.sql:1-12). - Judgement. Unresolved QR codes count as distinct “collectors”; no employment status, hours or FTE.
WI-24 Bag contamination (computed, not reported)
- Level outcome (sorting quality). Unit % of evaluations passed / bags contaminated. Kind rate. Unit of observation: sorted bag at a facility sorting evaluation.
- Axes: period (R), facility.
- Rule. A bag is contaminated when the material found inside is anything but
Non_of_above_in_bag; blank bags dropped; an evaluation passes when no bag is contaminated (S/stg_sorting_evaluation.sql:9-14,:83;M/mart_sorting_evaluations.sql:5-8,:24-26). “Weekly counts, pass rates and the four-week window are report aggregates over this mart” (:11-12) but no surface reads it. - GHG link. The
contamination_rate/specification_metapplicability inputs of AMS-III.AJ (cdmAmsIIIaj/R,contamination_rate_col,specification_met_col).
Cross-cutting judgements a standard should make explicit
| # | judgement embedded in code | where | standard should state |
|---|---|---|---|
| J1 | Uncategorised (unsorted) mass: recyclable on WC/MPK/WR, uncategorised on WE, excluded from balance |
MIG/20261007000300…:60-61; D/email_weekly.go:80-121; M/mart_site_recycling_balance.sql:22-24 |
own stream value; never in diversion numerator or denominator; reported alongside |
| J2 | Category → stream → material-family mapping in a migration and in Go | MIG/…:33-61; D/screen_waste_collected_report.go:67-90 |
published SKOS scheme with skos:broader |
| J3 | Organic counts as diverted without a treatment record | D/screen_meeting_pack.go:568-612; D/email_weekly.go:110 |
diversion requires a recorded destination |
| J4 | Diversion denominator = collected, not generated | all WI-03 variants | name it “share of collected waste recovered” |
| J5–J10 | Lifecycle ladder, placement success per town, signed rule, restart, all-points share denominator, flow by latest event | WI-07 | pattern: derived stage from dated acts; success criterion declared in project design |
| J11 | 8-day carry-forward, <2 days outstanding, 8-day recent-placement | M/mart_collection_status_asof.sql:71-82 |
named parameters with defaults in the methodology |
| J12 | Scan description, not mass, evidences collection at a point | M/mart_collection_status.sql:211-218 |
evidence requirement per outcome value |
| J13 | Frame for outcome counts: eligible vs zone vs placed | WI-09–WI-12 | one frame: eligible service points; others reported alongside |
| J14 | Collector attribution by zone modal scanner, alphabetical fallback | I/int_weekly_picker_analysis.sql:6-16 |
attribute to the agent on the record |
| J15 | Coverage numerator includes access failures (B) or not (D) | WI-11 | one definition |
| J16 | Satisfaction: non-numeric labels dropped from mean | D/email_weekly.go:123-130 |
closed 0–10 scale; kind measure |
| J17 | QoL / SaS level consolidation, Empty/Misused_bin dropped, two towns only | D/email_weekly_charts.go:53-77 |
levels as SKOS schemes; exclusions declared |
| J18 | Trailing windows count weeks present, not calendar weeks; YTD from 1 January; QoQ uses a March fiscal year for Smashblock | D/email_weekly.go:593-622, :693-696, :724 |
presentation, not methodology; a dashboard roll-up concern |
| J19 | Change rules: points for shares, difference for score, relative for others | D/email_weekly.go:834-850 |
presentation |
| J20 | Payability cut (first_payable_on), holiday multiplier, rate eras apply to pay only |
M/mart_payable_weights.sql:11-19 |
keep out of mass indicators (already so) |
| J21 | Bonus split equally among period-site members; period site = most submissions, tie → latest | M/mart_recycler_bonus_shares.sql:4-9; I/int_picker_week_site.sql:1-7 |
operational (bounty rule) |
| J22 | Household counts only from plain-integer answers, frame includes unsigned/terminated | I/int_enrollment_latest.sql:28-29 |
reach frame = eligible points served in period |
| J23 | Follow-up window 7 days, legacy status match dropped | D/email_follow_up.go:24-33 |
verification window parameter |
| J24 | Contaminated = anything but Non_of_above_in_bag |
S/stg_sorting_evaluation.sql:9-14 |
contamination definition by material spec |
| J25 | Re-reading a past period can change status-based figures (as-of) | M/mart_collection_status_asof.sql:1-15 |
close a period: freeze outcome claims once the carry-forward window has elapsed |
3. Gaps (inferred)
Indicators a standard serving many waste projects plausibly needs that novaWaste2 does not compute. All rows are inferred.
| id | indicator | level | why needed | what novaWaste2 has toward it |
|---|---|---|---|---|
| G-01 | Diversion rate on a generation basis (waste recovered / waste generated by served households) | outcome | Municipal and funder targets are stated against generation, not collection | WI-01, WI-13; no generation estimate or audit (DD F.5 open) |
| G-02 | GHG emission reductions from recycling (AMS-III.AJ) | impact | Climate co-benefit claim; carbon finance | WI-02 per material, WI-04 sold kg, WI-24 contamination; missing: virgin-material EFs, transport distance, residual disposal, project electricity/fuel at facilities |
| G-03 | GHG avoided by composting organics (AMS-III.F) | impact | Organic stream is collected and counted as diverted | organic kg (WI-01); missing: composting evidence, DOC/MCF parameters, compost output, residual |
| G-04 | Avoided methane from biomass treatment (AMS-III.E) | impact | Only if a project combusts/gasifies/MBT-treats | nothing; flag as not applicable to collection-only projects |
| G-05 | Final disposition / mass balance (collected → sold, composted, landfilled, stockpiled) | outcome | Closes the loop WI-03 asserts | WI-04 balance (recyclables only); no fate records for other streams |
| G-06 | Contamination rate of recyclables (mass basis) and of household bins | outcome | III.AJ applicability; buyer specs | WI-24 (bag pass/fail, unreported); SaS ratings (WI-17) |
| G-07 | Jobs: collectors engaged, person-days, FTE, retention, disaggregated by gender and age | outcome | Green-jobs claims; SDG 8 | WI-23 labels and days; person register exists but not aggregated |
| G-08 | Collector income distribution and adequacy (median weekly income, share above a reference wage) | outcome | Livelihood claim | WI-22 per collector-week; no reference wage, no distribution summary |
| G-09 | Households actively served in period (eligible points with ≥1 collected week × households) | output | Reach claim on service actually delivered | WI-10, WI-13 separately; never joined on a period |
| G-10 | Open burning / illegal dumping reduction | outcome | Health and air-quality co-benefit | burn_waste captured on every evaluation, never reported (M/mart_stand_evaluations.sql:47) |
| G-11 | Bin retention and condition | output | Asset durability, replacement cost | bins_still_available, bin_condition captured, listed only |
| G-12 | Service received as reported by households (triangulates WI-11) | outcome | Independent verification of scans | service_received, bags_received, follow-up collection_status captured, not aggregated |
| G-13 | Service-area coverage (enrolled / occupied points in the area) | output | Saturation of the target population | WI-07, WI-08 exist; “enrolments required” is the gap form only |
| G-14 | Time to service (enumeration → enrolment → placement → first collection) | activity | Roll-out efficiency | dated acts exist; no duration indicator |
| G-15 | Retention / churn rate (terminations ÷ enrolled point-months) | outcome | Service sustainability | WI-20 counts only |
| G-16 | Cost per tonne collected / recovered | input/efficiency | Comparability across projects | payments only cover collector pay |
| G-17 | Waste generation per capita and per household (from audits) | input (baseline) | Baseline for G-01, G-02 | WI-14 is collected-mass intensity, not generation |
| G-18 | Recyclate revenue per tonne by material | outcome | Market viability | recycler payment lines carry kg and amount, not aggregated by material |
4. Operational numbers (not indicators)
These feed novaOS task management, payment runs or data-quality review. Note any outcome they hide.
| surface and label | source | what it is | hidden indicator |
|---|---|---|---|
| AC “Enrolled, not placed”, “Block without a Service Group”, “Eligible Stands un-scanned in their latest Service Week”, “No access latest week”, “QR gap”, “Evaluation follow-up” counts and lists | D/screen_actions.go:20-40; M/mart_actions.sql:1-20 |
work queues per service point | placement backlog (WI-07c); un-scanned latest week (WI-12) |
| PO “placements required” | D/screen_process_overview.go:26 |
same action count | — |
| SE “Stands with an upcoming Evaluation”, “Scheduled Evaluations ahead” (date, site, n), Planning card (source, latest sample frame, cutover) | D/screen_stand_evaluation.go:30-64 |
evaluation workload | — |
| SE “Evaluations this month, worst first” | D/screen_stand_evaluation.go:66 |
follow-up list | evidence rows for G-11, G-12 |
| ES evaluation sample list (stand, site, block, orders, status) | D/email_evaluation_sample.go:22-27 |
daily visit list | — |
| SV Stands table (status, picker, last service, days outstanding, scanned) and “Showing N of M” | D/screen_service.go:34-44 |
per-point work list | days outstanding per point (service gap measure) |
| MS “Missed Stands” (due today, no collection in 7 days, days outstanding) and unverified scans table | D/email_missed_stands.go:87-98, :215-237 |
today’s missed list | — |
| FU follow-up lists (today PDF, week xlsx) | D/email_follow_up.go:200-213 |
field task list | — |
| WC weekday grid, Site jumps, Collections table (cap banner), Corrections panel and History | D/screen_waste_collected.go:72, :146-175, :271-310 |
review tools | collector active days (WI-23) |
| WC weight flag chips and table (slide, transposition, swapped_qr, wrong_picker, missing_usual_day, tracker_no_weight; over/under-reported) | D/screen_waste_collected.go:246-291, :957-981; M/mart_weight_flags.sql:1-35 |
data-entry anomaly review before pay | a data-quality rate (flags per 1 000 weighed quantities) could be a verification indicator ? |
| PY hero “Payable” (R), “Exception collections”, “Waste Pickers”, “Open drafts”; Payable lines (rows, kg, amount); Exceptions (kind, picker, range, rows, kg); Unallocated recycler payments; Period sites and site jumps; statements, drift, rates, holidays, recycler payments, payment slips/statements (typst) | D/screen_payments.go:47-262, :1300-1362; D/typst/payment_*.typ |
payment run (ADR-0027/0029) | collector income (WI-22); exception kg = mass collected but not attributable to a person (a traceability measure) |
| MPK 2.5 pay table (Pay, Bonus, Total) | D/screen_meeting_pack.go:91-101 |
weekly pay review | WI-22 |
| MPK “Recycler payments” list | D/screen_meeting_pack.go:127-132 |
invoices of the week | WI-04, G-18 |
| MPK Sources page (“no v2 source” boxes) | D/screen_meeting_pack.go:35-52 |
provenance list | marks legacy figures with no source: satellite basemap, evaluation Compliance Rate |
| Mail, Data docs screens | D/screen_mail.go, D/screen_data_docs.go |
admin | — |