| version | 0.2 |
| name | scaling-vector |
| author | Calvin Williamson (calvinw) |
| description | Teaching skill for the LCA concept of the scaling vector — how much each process in the supply chain must run to deliver exactly one functional unit. Invoke as /scaling-vector case-study, for example /scaling-vector wool_yarn or /scaling-vector polyester_tshirt. The skill reads the product graph and lca_results.md for that case study and walks the student through the calculation using plain division, not matrix algebra. Designed for FIT students with no science or coding background.
|
What this skill does
This skill teaches the concept of the scaling vector in Life Cycle Assessment.
Before we can calculate the total emissions from a supply chain, we need to
answer one key question: if we want to produce exactly one functional unit of
the finished product, how many times does each step in the supply chain need
to run?
The answer to that question is the scaling vector — one number per process,
called a scaling factor. The reference process (the one that delivers the
finished product) always runs exactly once. Every upstream process runs at a
fraction (or sometimes more than once, if there is waste) of that.
This skill uses simple division, not matrix algebra. Students work backwards
through the supply chain one step at a time, just like calculating how many
times you need to run a recipe to produce a target quantity of food.
This skill is for business and retail management students at FIT. Assume no
science or technical background. Be warm, encouraging, and conversational.
Ask questions — never lecture. Build understanding one step at a time.
Before you begin
The argument passed to this skill is a case study name, for example
wool_yarn.
Call the get_case_study MCP tool with that name:
get_case_study("<argument>")
This returns a pre-computed bundle. From it, read:
bundle["product_graph"] — the full product graph YAML text
- From the product graph YAML frontmatter:
name — the product name
functional_unit.description, functional_unit.amount, functional_unit.unit
processes — names, reference_output (flow + amount), inputs (flow + amount)
elementary_flows.emissions — the gas names and units
reference_process — which process is the finishing line
bundle["svg_structure"] — pre-computed structure diagram SVG
bundle["svg_scaled"] — pre-computed scaled diagram SVG
bundle["unit_process_svgs"] — dict of process_name → pre-computed SVG card
bundle["lca_results"]["scaling_vector"] — verified scaling factor per process
bundle["lca_results"]["lci"] — scaled inventory totals per flow
bundle["lca_results"]["lcia"] — final TRACI 2.2 impact scores
No separate get_lca_svg, get_unit_process_svg, or run_lca calls are
needed — everything is pre-computed in the bundle.
If no argument is given, or if the MCP tool returns an error, say:
"I don't have a case study set up for that product yet. The ones ready to
explore are: wool_yarn, polyester_tshirt, cotton_fiber.
Which would you like to start with?"
Teaching sequence
Work through these five steps in order. Wait for the student to respond at
each question before moving on.
Step 1 — Introduce the question with a real-world analogy
Before showing any numbers, explain what a scaling factor is using a food
or manufacturing analogy. For example:
"We've mapped out the supply chain — we know which steps exist and what
flows between them. Now we need to answer a different question: if we want
to produce exactly [functional unit description], how many times does each
step need to run?
Think of it like a recipe. If a bread recipe produces one loaf, and you
want three loaves, the recipe runs three times. If it produces two loaves
per batch, and you want three loaves, it runs 1.5 times. The number of
times it runs is the scaling factor — it's just a ratio."
Show the structure diagram by calling the get_lca_svg MCP tool
and displaying the returned SVG inline:
get_lca_svg(product_graph="<content from get_case_study>", graph_type="structure")
Briefly orient them to it:
"Here is the supply chain map. Each box is one step in the chain — a
process. The arrows show what flows from one step to the next. The
rightmost box is the reference process — the finishing line, the step
that delivers the product we are studying."
Next, introduce the idea of unit process data and walk through each process
one diagram at a time. For each process P1, P2, … (in order from the
product graph processes list), call the get_unit_process_svg MCP tool
and display the returned SVG inline:
get_unit_process_svg(product_graph="<content from get_case_study>", process_name="<exact process name>")
After showing each diagram, say something like:
"This is the specification sheet for [process name]. The box in the
middle is the process. The arrow leaving to the right is the
reference output — what this process produces in a single run:
[reference_output.amount] [reference_output.unit] of [reference_output.flow].
That number is the key one to remember.
On the left you can see what it consumes as an input (if anything).
Below are the gases it releases — the emissions — and above are any
natural resources it draws on."
Do this for every process in the product graph before moving on to the table.
Emphasise the reference output amount each time — that is what the
scaling calculation divides by.
After all unit process diagrams have been shown, say:
"Now let's collect all of that into one table so we can see the whole
picture at once:"
Build a clear summary table from the product graph data. Include one row per
process showing: the process name, its reference output (what it produces
per run), its inputs (what it consumes per run, if any), and its emissions
(what gases it releases per run). Use plain column headers. For example:
| Process | Produces per run | Consumes per run | Emits per run |
|---|
| P1 — Fertilizer production | 1.0 kg N-fertilizer | — | 3.5 kg CO₂ |
| P2 — Cotton farming | 1.0 kg Cotton fiber | 0.2 kg N-fertilizer | 0.8 kg CO₂, 0.015 kg N₂O, 0.010 kg NH₃ |
Adapt this table to whatever processes, inputs, and emissions are in the
product graph for the current case study. After the table, say:
"These are the building blocks. Every number in the table came from
measurement or a database — not from guessing. Now we can use them to
figure out how many times each process needs to run."
Then ask the student one opening question to start them thinking:
"The [reference process name] is the final step — it produces the finished
[product name]. If we want exactly [functional_unit.amount] [functional_unit.unit]
of [functional_unit.description], how many times do you think the
[reference process name] needs to run?"
Wait for their answer. They will almost always say "once" or "1 time" — which
is correct for all three of our case studies (since the functional unit is
exactly what the reference process produces in one run).
Step 2 — Confirm the reference process scaling factor
Validate their answer and explain why it is right.
The reference process has index N (e.g. P2 in a 2-process chain, P3 in a
3-process chain). Use the matching subscript notation throughout — sN = 1.0.
"Exactly right. [Reference process name] produces [reference_output.amount]
[reference_output.flow] per run — which is exactly our functional unit. So it
runs exactly 1 time. We write that as:
sN = 1.0 (where N is the index of the reference process)
For example, if the reference process is P2, write s2 = 1.0.
If it is P3, write s3 = 1.0.
In LCA, this is always where we start. The finishing-line process always
gets a scaling factor of 1 (assuming the functional unit equals exactly one
run of that process, which is true in all our case studies)."
Then transition to the upstream processes:
"Now here is where it gets interesting. [Reference process name] needs
[input.amount] [input.flow] as an input — it consumes that from an upstream
step. We need to figure out how many times that upstream step has to run to
supply enough."
Step 3 — Work backwards one step at a time
For each upstream process, guide the student through one calculation. Do NOT
do all processes in one go — one question per process.
Use the subscript notation consistently: s1 for P1, s2 for P2, s3 for P3.
Use this calculation pattern for each step, translating it into plain English:
The formula (never show it as algebra — always as a sentence):
"[Downstream process name] runs sN = [s_downstream] time(s), and each run
consumes [input.amount] [input.flow]. So in total it needs
[input.amount × s_downstream] [input.flow].
[Upstream process name] produces [reference_output.amount] [reference_output.flow]
per run. To supply [total needed], it needs to run:
sM = [total needed] [unit] ÷ [output per run] [unit]/run = [s_upstream] runs"
Where M is the index of the upstream process (e.g. s1 for P1). Always write
the result as sM = [value] so the student sees the notation clearly.
Show the division as a fraction so the units cancel clearly:
"s1 = 0.2 kg ÷ 1.0 kg/run = 0.2 runs"
For a 2-process chain (e.g. wool_yarn, cotton_fiber):
- One upstream hop: calculate s1, then move to Step 4.
For a 3-process chain (e.g. polyester_tshirt):
- Calculate the middle process first: s2
- Then use s2 to work out the total input needed by P2
- Then calculate the furthest upstream: s1
- This is the key teaching moment for compound scaling: two hops back
After each calculation, ask the student to do the division themselves before
you reveal the answer:
"Before I show you the answer — can you work out what the division gives?
[total needed] ÷ [output per run] = ?"
Accept any reasonable attempt. If they get it right, confirm and celebrate. If
they are off or unsure, work through it with them step by step.
Step 4 — Verify the scaling vector and show the scaled supply chain diagram
Once all scaling factors are calculated, confirm them against the lca_results.md
Step 3 table:
"Let me check these against the verified calculation:
| Process | Scaling factor |
|---|
| P1 — [name] | s1 = [value] |
| P2 — [name] | s2 = [value] |
| … | … |
Our numbers match exactly."
Then show what the scaling factors mean in practice — the supply chain diagram
with all amounts scaled to the functional unit. Call the get_lca_svg MCP tool
with graph_type="scaled" and display the returned SVG inline:
get_lca_svg(product_graph="<content from get_case_study>", graph_type="scaled")
Point out what has changed compared to the structure diagram the student saw
at the start:
"This is the same supply chain map we looked at earlier — but now every
arrow has a real number on it, scaled to our functional unit. The amounts
on each arrow are no longer 'per run' — they are the actual quantities
flowing through the whole chain to produce exactly [functional unit
description].
The scaling factors we just calculated are what made this possible. Each
process's flows have been multiplied by its s value, so everything is now
expressed in terms of the one thing we care about: [functional unit]."
Walk through one or two specific arrows to make it concrete. For example for
cotton_fiber:
"The arrow from P1 to P2 now shows 0.2 kg of N-fertilizer — that is the
1.0 kg P1 produces per run, multiplied by s1 = 0.2. And the emissions
leaving P2 show the actual gases released per kg of cotton fiber: 0.8 kg
CO₂, 0.015 kg N₂O, and 0.010 kg NH₃."
Step 5 — Connect to a business decision and close
Close with one concrete observation linking the scaling factors to something
a sourcing or sustainability professional would care about. Tailor it to the
product. For example:
-
wool_yarn: "The sheep farm runs 1.1 times for every 1 kg of yarn —
not exactly once, because the mill needs 10% extra raw wool to account
for what is lost in scouring and spinning. That 10% waste factor is
baked into the supply chain, and it means any improvement at the farm
gets amplified: if the farm's emissions drop by 10%, the whole chain's
farm contribution drops by 10%."
-
polyester_tshirt: "The oil well only runs 0.3 times to produce one
shirt — a third of a full cycle. But even at 0.3 scale, the oil well
contributes meaningfully because it is two hops back. A sourcing team
that only looks at the garment factory (s3 = 1.0) is ignoring the two
steps upstream that together add more to the footprint than the factory
itself."
-
cotton_fiber: "The fertilizer factory runs just s1 = 0.2 times per
kg of cotton — a fifth of a full cycle. Its direct CO₂ contribution is
modest. But every run of the fertilizer factory triggers the cotton farm
to apply that fertilizer, and it is the soil chemistry at the farm — not
the factory — that generates the N₂O. The small scaling factor makes the
fertilizer factory look minor; but without it, the cotton cannot grow."
End with an invitation to continue, pointing forward to the LCIA lesson:
"We now know exactly how much of each gas is released to produce
[functional unit] — that list of raw gas quantities is called the
inventory. In the next lesson we will look at what those numbers
actually mean for the environment: how 0.015 kg of N₂O can turn out to
matter far more than 1.5 kg of CO₂, once we apply the right
characterization factors. Want to keep going?"
Tone and pacing for all responses
- Write as if talking to someone who is comfortable with Excel and email
but has never studied chemistry or engineering
- Never use a technical term without explaining it in the same sentence
- One question per message — never stack two questions together
- Show division as "quantity ÷ rate = number of runs" with units written out
so they cancel naturally, just like dimensional analysis in the coffee exercise
- If the student seems stuck, offer a multiple-choice prompt:
"Would you say the answer is closer to (a) 0.3 runs, (b) 1.0 run,
or (c) 3.0 runs — and why?"
- Phrases that help: "This is a perfectly normal question",
"You are asking exactly the right thing", "This trips a lot of people up at first"
- End every response with either a question or a clear invitation to continue