# Makable recipes

AT6012 Design Research: Technology Transformations
Cork Centre for Architectural Education, University College Cork
30 August 2026

A recipe is the last stratum of the pipeline. Above it sit the ontology, the
knowledge graph, the generalised principle and the case study. A recipe is what
somebody actually does on a Tuesday, with named inputs, a stated output, and a
statement of what the result can and cannot support.

Each one is runnable today with the files in this folder. Each names its own
limit, because a recipe that hides its limit produces a number somebody else
will quote without it.

---

## Recipe 1. Read a specification as a demand on a forest

**Takes** a timber bill of quantities: a member, a species, a volume.
**Gives** the demand in cubic metres against seven building groups, and the
ecological groups that would have to supply them.
**About** twenty minutes the first time.

```
cd scripts
python boq_to_forest.py ../data/example_boq.csv     # to see the shape
python boq_to_forest.py ../data/my_project.csv      # then your own
```

Write your own CSV with the columns `member`, `species`, `volume_m3`. The
species has to be one of the 35 in the study landscape, and the script refuses
anything else, because guessing a group would invent one.

**The reading.** Look at the share in BG1 and BG2 first. If it is above about
80%, your specification is a conifer specification, and it is pulling the forest
toward the composition the FDN scenarios are trying to diversify away from.

**What it cannot support.** It says nothing about carbon, cost, distance or
availability, and it does not know whether the forest can meet the demand. It is
a description of what the drawing asks for.

---

## Recipe 2. Find where the supply actually is

**Takes** the published landscape data.
**Gives** a map, at 100 m, of how many building groups each cell could supply.
**About** ten minutes, plus the download.

```
cd scripts
python fetch_landis_data.py     # from Zenodo, and read the notice it prints
python build_coupling.py        # derive the seven-by-seven coupling
python supply_map.py            # build the raster
```

Then open QGIS, Plugins > Python Console > Show Editor, and run
`qgis/make_project.py`.

**The reading.** The landscape is 1,649,532 cells. 79.6% of them are not forest
at all, which is what "fragmented rural landscape" means when you look at it.
Of the forested fifth, **337 cells can supply all seven building groups**. That
is 337 hectares in a territory of 136 by 121 km.

**What it cannot support.** It is the landscape as recorded at the start of the
simulation, in 2010. It is not a yield, not a projection, and not a harvest
plan. Nothing here runs LANDIS-II.

---

## Recipe 3. Put the two together

**Takes** recipes 1 and 2.
**Gives** the question the module is actually about.
**About** an afternoon, and it is the one worth doing.

Run your own bill through recipe 1. Note which building groups it reaches. Then
open the map from recipe 2 and use the QGIS raster calculator to isolate the
cells that can supply exactly those groups.

```
Raster calculator, on bg_supply_breadth:
    "bg_supply_breadth@1" >= <the number of groups your spec reaches>
```

That gives you the fraction of the territory your drawing can be built from.

**The reading.** Almost every real specification comes back with a large
supplying area and a narrow group spread, or a small supplying area and a wide
spread. Which one you get is a design decision that was made without anybody
noticing it was one.

**What it cannot support.** A cell shows a supply possibility. Ownership, access, road distance, protection status and whether
anybody will sell you the timber are all outside this data.

---

## Recipe 4. Name the gap for a landscape that is not Quebec

**Takes** an honest hour.
**Gives** a written statement of what applying this framework somewhere else
would require.
**This is the recipe most likely to end up in a thesis.**

The trait data covers 75 species and the study landscape 35, all eastern North
American. Check for yourself:

```
cd scripts
python -c "import csv,io; print(sorted({r['spp.name'] for r in csv.DictReader(io.open('../qgis/landis/Osborne-et-al_TRAITS DATA.txt',encoding='utf-8'),delimiter='\t')}))"
```

**There are no Mediterranean species in it.** No *Quercus ilex*, no *Pinus
pinea*, no *Quercus suber*, no *Castanea sativa*, no *Fagus sylvatica*. So the
seven-by-seven coupling does not transfer to Lazio, and neither does it transfer
to Ireland: *Picea sitchensis*, which is most of the Irish estate, is not in the
table either.

The exercise is not to apply the framework anyway. It is to write down what
applying it would take:

1. Which species make up the estate you care about, from a national forest
   inventory, and name the inventory.
2. Which of the 29 trait columns in the Zenodo file exist for those species, and
   which do not.
3. Which of the seven ecological groups have a plausible counterpart, and which
   have none.
4. What you would have to measure, and who would have to measure it.

**What it cannot support.** Nothing, and that is the point. Step 4 is a research
proposal, and saying so is the honest end of the exercise.
A gap named precisely is worth more than a framework applied where its data does
not reach.

---

## Recipe 5. The climate half, next door

**Takes** the Ladybug submodule.
**Gives** the climate the building sits in, beside the forest it comes from.

```
cd ../ladybug
python compare_locations.py weather/*.epw
```

Cork holds 30 comfortable hours a year, Rome 877. Run your own site's weather
file, then ask recipe 1 what the building is made of and recipe 2 where that
came from.

**The reading.** These are two different coordinate frames on one building. The
climate reading is Eulerian: a fixed site, conditions flowing through it. The
forest reading is Lagrangian: material followed through space over time. Kiel
Moe names those frames in *Convergence* (2013) and is a co-author on the paper
this folder is built from, which is why the two halves belong in one module.

**What it cannot support.** Neither half predicts. Both describe.

---

## What every recipe shares

**State the settings.** The file, the year span, the species list, the
assumptions. A figure without them is not checkable by anybody, including you in
six weeks.

**Every result here is structural and none is predictive.** These recipes show
what a change of frame reveals. None of them says a number will move by an
amount, because nothing in this data can support that claim.

**Where a question cannot be answered from the record, say so and name what
answering it would take.** That gap is the teaching, and recipe 4 exists
entirely to practise it.

## Sources

Osborne, P., Aquilué, N., Mina, M., Moe, K., Jemtrud, M., and Messier, C.
(2023). A trait-based approach to both forestry and timber building can
synchronize forest harvest and resilience. *PNAS Nexus*, 2(8), pgad254.
https://doi.org/10.1093/pnasnexus/pgad254

Supporting data: https://doi.org/10.5281/zenodo.8184010

Moe, K. (2013). *Convergence: An Architectural Agenda for Energy*. Routledge.
https://doi.org/10.4324/9780203489444
