Materials for the scientific-communication Practice section
Chapter 9 sets three standards a computational study should meet before its results count as evidence for anyone but its author: the pipeline should be inspectable, the results reproducible, the findings interpretable. Its Practice section asks you to audit one published study against all three.
The Practice assignment. Select one published computational study and write a one-page analysis covering: whether its pipeline is inspectable (preregistration, shared data and code, documented prompts and model versions), whether it is reproducible (using the four-category framework), one of its visualizations read back through Kirk’s four-stage design process, how it communicates uncertainty, and what you would change.
The studies, filtered to scientific communication
Forty-four studies carry an annotation on how they reported their work. This is the thinnest of the four lenses, which is itself a finding worth noticing: communication practice is the least consistently documented stage of the pipeline in published CSS.
stageLens ="SC"
studiesData = {const rows =await d3.csv("/studies/studies.csv");return rows.map(d => ({...d,yearNum:+d.year||null,stageList: (d.stages||"").split("|").filter(s => s),recNum:+d.top_rec||0 }));}stageMeta = ({DM: {label:"Data management",chapters:"Ch. 3–4",note:"dm_note",accent:"#1f6feb"},CR: {label:"Concept representation",chapters:"Ch. 5–6",note:"cr_note",accent:"#8250df"},DA: {label:"Computational analysis",chapters:"Ch. 7–8",note:"da_note",accent:"#bc4c00"},SC: {label:"Scientific communication",chapters:"Ch. 9–10",note:"sc_note",accent:"#1a7f37"}})// A lens is either fixed by the hub page or chosen by the reader. When fixed,// show plain text instead of a disabled dropdown: a disabled control announces// as "unavailable" to screen readers, which misdescribes a deliberate setting.viewof chosenLens = stageLens ===null? Inputs.select(newMap([ ["All design stages","ALL"],...Object.entries(stageMeta).map(([k, v]) => [`${v.label} (${v.chapters})`, k]) ]), {label:"Design stage",value:"ALL"} ): Inputs.input(stageLens);activeLens = stageLens ===null? chosenLens : stageLensinScope = activeLens ==="ALL"? studiesData: studiesData.filter(d => d.stageList.includes(activeLens))viewof queryText = Inputs.text({label:"Search",placeholder:"title, journal, abstract, annotation…",width:320,submit:false})viewof disciplinePick = Inputs.select( ["All disciplines",...newSet(inScope.map(d => d.discipline).filter(x => x))].sort( (a, b) => (a ==="All disciplines"?-1: b ==="All disciplines"?1: a.localeCompare(b)) ), {label:"Discipline",value:"All disciplines"})viewof recommendedOnly = Inputs.toggle({label:"Recommended starting points only",value:false})filtered = {const q = (queryText ||"").trim().toLowerCase();return inScope.filter(d => disciplinePick ==="All disciplines"|| d.discipline=== disciplinePick).filter(d =>!recommendedOnly || d.recNum>=4).filter(d => {if (!q) returntrue;return [d.title, d.journal, d.abstract, d.discipline, d.theme, d.dm_note, d.cr_note, d.da_note, d.sc_note].some(v => (v ||"").toLowerCase().includes(q)); }).sort((a, b) => (b.recNum- a.recNum) || (b.yearNum- a.yearNum));}
stageLens ===null?html``:html`<p class="lens-static">Design stage: <strong>${stageMeta[stageLens].label}</strong> (${stageMeta[stageLens].chapters}; fixed on this page. <a href="/studies/">Browse all stages</a>.)</p>`
html`<p class="studies-count" role="status"> <strong>${filtered.length}</strong> ${filtered.length===1?"study":"studies"}${activeLens ==="ALL"?"":`annotated for ${stageMeta[activeLens].label.toLowerCase()}`}${filtered.length!== inScope.length?html`<span> · filtered from ${inScope.length}</span>`:""}</p>`
The temptation is to score studies against a checklist and rank them. Resist it. A 2015 paper that shared no code was following the norms of 2015, and the interesting question is not whether it clears a 2026 bar but what specifically a reader cannot check, and what that costs them.
The Twitter election-forecasting episode in §9.1 is the model: the original study was wrong, but because the data were public the error was findable and the record got corrected. An open pipeline is not one that is right. It is one whose wrongness is discoverable.