Skip to content

Comments

Add process DAG (workflow step 02)#14

Open
sbfnk wants to merge 7 commits intomainfrom
step02
Open

Add process DAG (workflow step 02)#14
sbfnk wants to merge 7 commits intomainfrom
step02

Conversation

@sbfnk
Copy link
Collaborator

@sbfnk sbfnk commented Feb 17, 2026

Summary

  • Define the latent transmission process for HPAI spread
  • Wild bird spillover with temporal onset+decay profile
  • Farm-to-farm spatial transmission (exponential kernel)
  • Movement-based transmission (broiler_1 → broiler_2)
  • Species-specific susceptibility
  • Intervention processes (reactive/preventive culling)
  • Documents parameter identifiability and simplifying assumptions

Closes #3

Summary by CodeRabbit

  • Documentation
    • Added a comprehensive Process DAG for HPAI on Jolly Island farms covering farm-level states and aggregates, multiple transmission pathways (wild spillover, local farm-to-farm, movement), species heterogeneity and modifiers, temporal/spatial risk profiles, intervention rules (reactive/preventive culling, testing and zone effects), latent quantities, identifiability/reparameterisation guidance, diagnostics and options for model refinements.

Define the latent transmission process:
- Wild bird spillover with temporal onset+decay profile
- Farm-to-farm spatial transmission (exponential kernel)
- Movement-based transmission (broiler_1 → broiler_2)
- Species-specific susceptibility
- Intervention processes (reactive/preventive culling)

Documents parameter identifiability considerations and
simplifying assumptions for initial model.

Closes #3
@coderabbitai
Copy link

coderabbitai bot commented Feb 17, 2026

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Walkthrough

Adds a new Process DAG document formalising latent HPAI transmission on Jolly Island farms: states (S, I, R, A), spillover, local and movement transmission, species heterogeneity, within‑farm infectiousness growth, reactive/preventive culling, parameter lists, DAG structure, identifiability notes and modelling assumptions.

Changes

Cohort / File(s) Summary
Process DAG Documentation
hpai-challenge/notes/step02_process_dag.md
New comprehensive Process DAG specification: farm-level state variables and aggregates; discrete-time hazard and infection probability formulas; temporal spillover profile (t0, δ); spatial kernel for local transmission; movement-based transmission channel with p_mov and testing modifier; species susceptibility and within‑farm infectiousness growth; reactive and preventive culling rules; parameter categorisation; DAG depiction; identifiability considerations and proposed refinements.

Sequence Diagram(s)

sequenceDiagram
    participant WildBirds
    participant Farm_i as Farm_i (infectious)
    participant Farm_j as Farm_j (susceptible)
    participant MovementNet as MovementNetwork
    participant Obs as Observation/Culling

    WildBirds->>Farm_j: spillover exposure ε(t)
    Farm_i->>Farm_j: local transmission β * kernel(d_ij) * infectiousness_i(t)
    MovementNet->>Farm_j: movement-based exposure (p_mov, testing modifier)
    Farm_j->>Obs: detection → reactive/preventive culling (delay, capacity)
    Note over Farm_i,Farm_j: within‑farm infectiousness growth α(t) modulates transmissibility
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Suggested reviewers

  • seabbs-bot
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'Add process DAG (workflow step 02)' directly and clearly summarizes the main change: adding a process DAG document as part of workflow step 02.
Linked Issues check ✅ Passed The pull request comprehensively addresses all coding requirements from issue #3: process DAG document created with wild bird spillover (HRZ-focused with temporal profile), farm-to-farm spatial transmission, movement transmission with p_mov specifications, species-specific susceptibility modifiers, within-farm infectiousness growth, and farm removal processes documented.
Out of Scope Changes check ✅ Passed All changes are directly within scope: the single file addition (notes/step02_process_dag.md) is the required deliverable from issue #3 with no extraneous modifications present.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch step02

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@sbfnk
Copy link
Collaborator Author

sbfnk commented Feb 17, 2026

@coderabbitai review

@coderabbitai
Copy link

coderabbitai bot commented Feb 17, 2026

✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 6

🧹 Nitpick comments (1)
hpai-challenge/notes/step02_process_dag.md (1)

186-228: markdownlint MD040: add languages to fenced code blocks.

The fenced blocks (Line 186 and Line 234) are untyped. Even text would satisfy MD040 and makes rendering more consistent.

As per coding guidelines, review should ensure clear documentation for Step 02 deliverables.

Also applies to: 234-251

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@hpai-challenge/notes/step02_process_dag.md` around lines 186 - 228, The
fenced code blocks containing the model specification (the block that starts
with "Parameters (estimated):" and the later block covering "States:" /
"Process:" including symbols like ε, t₀, δ, β, ψ(t), hazard_spillover,
hazard_local, hazard_movement, λ_j(t), and P(infection at t)) are missing
language tags; update each triple-backtick fence to include a language (e.g.,
```text or ```yaml) so markdownlint MD040 is satisfied and rendering is
consistent.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@hpai-challenge/notes/step02_process_dag.md`:
- Around line 46-70: Summary: The text overstates identifiability by setting
spillover to zero outside HRZ while claiming baseline vs HRZ cannot be
separated; either allow a small non‑HRZ spillover parameter or explicitly state
the assumption. Update the model description to introduce an ε_nonHRZ parameter
(with strong regularisation/prior) and explain its role and priors (e.g., ε for
HRZ, ε_nonHRZ ≪ ε) and how t₀ and δ relate to both, or alternatively add a clear
sentence in the identifiability note that non‑HRZ spillover is assumed
negligible for Step 02 and therefore fixed at 0, citing ε, ε_nonHRZ, HRZ, t₀ and
δ to make the assumption explicit.
- Around line 25-33: The Inactive state is currently written as A_j(t) = 0
(which looks like a constant) and can be misinterpreted in code; change the
definition to an indicator variable (e.g., define Inactive as A_j(t) = 1 when
farm j is inactive at time t) or rework the table to use a mutually-exclusive
categorical state variable (e.g., State_j(t) ∈ {S,I,R,A}) so all states are
defined consistently as indicators or as a single categorical variable; update
any references to A_j(t), S_j(t), I_j(t), R_j(t) accordingly to ensure they are
mutually exclusive and unambiguous.
- Around line 79-96: The documentation mixes instantaneous hazard λ_j(t) with a
discrete infection probability formula P(infection at t) = 1 - exp(-λ_j(t))
without stating the time-step; clarify the convention by stating whether time is
discrete with Δt=1 day (so λ_j(t) should be interpreted as the integrated hazard
over the day) or whether λ_j(t) is a rate that must be integrated as Λ_j =
λ_j(t)·Δt before plugging into P=1-exp(-Λ_j). Update the text around λ_j(t),
P(infection at t), and the infectiousness w(τ) to explicitly declare the chosen
convention (e.g., "time is daily, Δt=1 day, λ_j(t) denotes the daily integrated
hazard") so the model and code will implement the same interpretation.
- Around line 123-135: The species modifier is applied inconsistently: decide
whether β_s (β_species[j]) multiplies the total force of infection
λ_j(t)=β_s·(λ_spillover+λ_local+λ_movement) or only the local hazard; then
update all places to match that choice. Concretely, either (A) wrap the sum of
pathways with β_s everywhere you define λ_j(t) and replace occurrences like "β ×
β_species[j] × Σ ..." on hazard_local with "β_s × (λ_spillover + λ_local +
λ_movement)" (or equivalent naming), or (B) clearly state and apply species
scaling only to the local term and remove β_s from spillover/movement across all
formulas and code; ensure the symbols λ_j(t), β_s / β_species[j], λ_spillover,
λ_local, hazard_local, and any Σ expressions are updated consistently and
comments/docstrings reflect the single chosen convention.
- Around line 150-179: Define T_capacity and make the process/observation split
explicit: add a short definition for T_capacity (e.g., "T_capacity: expected
culling completion time given operational queue/capacity constraints, modeled as
a deterministic offset or a stochastic function of queue length/resource
availability") and reference it in the Preventive Culling equation T_j^R =
max(T_trigger, T_capacity); for Reactive Culling explicitly state the modelling
choice (e.g., "treat confirmation times T_j^C as observed inputs, and model
removal times T_j^R as a process: T_j^R = T_j^C + δ_reactive, where δ_reactive
is a deterministic or parameterized delay"), and mark whether δ_reactive and
T_capacity are fixed, imputed, or probabilistic to keep the latent process DAG
separate from the observation model.
- Around line 97-122: Summary: The movement hazard definition omits summation
over discrete movement events and the conversion from aggregated hazard to
infection probability. Fix: Replace the single-pair formulation
hazard_movement,j(t)=p_mov·w(t−T_i^I) with an explicit sum over movements by
introducing M_{i→j}(t) (number of broiler_1→broiler_2 movements on day t) and
define λ_movement,j(t)=Σ_i M_{i→j}(t) · p_eff(i,t) · w(t−T_i^I) where
p_eff(i,t)=p_mov·(1−σ_test) for HRZ sources; state units (per-day counts) for M
and w; and add that the infection probability from movement events on day t is
1−exp(−λ_movement,j(t)) (or the Bernoulli complement) to be consistent with the
model’s overall hazard→probability convention; update references to
hazard_movement, p_mov, σ_test, M_{i→j}(t), w, and λ_movement,j(t).

---

Nitpick comments:
In `@hpai-challenge/notes/step02_process_dag.md`:
- Around line 186-228: The fenced code blocks containing the model specification
(the block that starts with "Parameters (estimated):" and the later block
covering "States:" / "Process:" including symbols like ε, t₀, δ, β, ψ(t),
hazard_spillover, hazard_local, hazard_movement, λ_j(t), and P(infection at t))
are missing language tags; update each triple-backtick fence to include a
language (e.g., ```text or ```yaml) so markdownlint MD040 is satisfied and
rendering is consistent.

- Clarify farm state definitions (categorical state variable)
- Add explicit time convention (discrete, Δt=1 day)
- State non-HRZ spillover assumed negligible
- Express movement hazard as sum over events with M_{i→j}(t)
- Apply species modifier consistently to all pathways
- Define T_capacity and clarify process/observation split for interventions
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🧹 Nitpick comments (2)
hpai-challenge/notes/step02_process_dag.md (2)

92-95: No explicit decision recorded for the spatial kernel choice.

The spillover temporal profile has a clearly labelled "Decision" at Line 69. The kernel section lists three candidates (exponential, power-law, Cauchy) but does not conclude with a matching "Decision" statement. The PR objectives name the exponential kernel, but that choice should be recorded here for the document to be self-contained. A one-liner analogous to the spillover decision — e.g., "Decision: Use exponential kernel $K(d) = \exp(-d/\alpha)$. Parsimonious, scale parameter $\alpha$ is identifiable from spatial decay pattern." — would complete the specification.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@hpai-challenge/notes/step02_process_dag.md` around lines 92 - 95, Add a
one-line "Decision" under the Kernel options clarifying the chosen spatial
kernel: record that we will use the exponential kernel K(d) = exp(-d/α). Update
the section that lists the three candidates (Exponential, Power law, Cauchy) to
include a Decision line such as "Decision: Use exponential kernel K(d) =
exp(-d/α). Parsimonious; scale parameter α identifiable from spatial decay." so
the document is self-contained and matches the PR objectives.

192-192: Fenced code blocks are missing a language specifier (markdownlint MD040).

Both blocks at Lines 192 and 240 lack an identifier. Adding text or plaintext would suppress the warnings and signal to renderers that these are plain-text pseudo-code blocks rather than an unstyled code snippet.

📝 Proposed fix
-```
+```text
 Parameters (estimated):
-```
+```text
     PARAMETERS                      FIXED           COVARIATES

Also applies to: 240-240

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@hpai-challenge/notes/step02_process_dag.md` at line 192, The two fenced code
blocks that start with "Parameters (estimated):" and the block beginning "   
PARAMETERS                      FIXED           COVARIATES" are missing a
language specifier (MD040); update each opening fence to include a plaintext
specifier such as ```text (or ```plaintext) so the blocks read as ```text and
```text respectively to suppress the linter warning and mark them as plain-text.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@hpai-challenge/notes/step02_process_dag.md`:
- Line 71: The prior for t₀ is ambiguous about its reference; update the text
defining the prior for t₀ to state the exact reference frame (e.g.,
"Normal(mean=day 10–15 of December, SD≈5 days)" or "Normal(mean=Julian day
344–349, SD≈5 days)" or explicitly "Normal centered on simulation day 10–15
assuming t=0 is 1 December") and include one clear example mapping to absolute
dates (e.g., "i.e., Dec 10–15 corresponds to Julian days 344–349") so any
implementer can unambiguously construct the prior for t0.
- Around line 296-300: Revise the identifiability diagnostic to account for the
known movement pathway: state that infections outside the HRZ are not solely
from β because movement from HRZ-infected farms contributes a known hazard
(p_eff = p_mov × (1 - σ_test) ≈ 0.001), so after subtracting that fixed movement
contribution the residual non-HRZ infections identify β; also clarify that ε is
a constant parameter but the actual spillover hazard is time-varying (ε · ψ(t)),
and rephrase “constant hazard applying only to HRZ farms” to something like
“HRZ-only hazard with fixed spatial footprint” to emphasize the spatial
contrast.
- Around line 97-99: The infectiousness formula w(τ) is incorrect because min(1,
exp(r·τ)) is always 1 for r>0; replace it with a saturating growth form such as
w(τ) = 1 - exp(-r·τ) (starts at 0, asymptotes to 1) or, if you need explicit
initial prevalence, use a scaled exponential w(τ) = min(1, i0 * exp(r·τ)) with
i0 defined (e.g. 1/N_farm); update the same symbol w(τ) in the
simplified-process occurrences (the repeated formulas referenced in the comment)
and adjust surrounding text to reflect the chosen semantics.

---

Nitpick comments:
In `@hpai-challenge/notes/step02_process_dag.md`:
- Around line 92-95: Add a one-line "Decision" under the Kernel options
clarifying the chosen spatial kernel: record that we will use the exponential
kernel K(d) = exp(-d/α). Update the section that lists the three candidates
(Exponential, Power law, Cauchy) to include a Decision line such as "Decision:
Use exponential kernel K(d) = exp(-d/α). Parsimonious; scale parameter α
identifiable from spatial decay." so the document is self-contained and matches
the PR objectives.
- Line 192: The two fenced code blocks that start with "Parameters (estimated):"
and the block beginning "    PARAMETERS                      FIXED          
COVARIATES" are missing a language specifier (MD040); update each opening fence
to include a plaintext specifier such as ```text (or ```plaintext) so the blocks
read as ```text and ```text respectively to suppress the linter warning and mark
them as plain-text.

- Clarify t₀ prior reference point (10-15 December 2025)
- Fix infectiousness profile: w(τ) = 1 - exp(-r·τ) (was incorrectly always 1)
- Update identifiability diagnostic to mention movement pathway
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (1)
hpai-challenge/notes/step02_process_dag.md (1)

192-192: Fenced code blocks are missing a language specifier (MD040)

Both code blocks — the process pseudocode (Line 192) and the ASCII DAG (Line 240) — trigger MD040 warnings from markdownlint. Adding text silences the linter without semantic change.

📝 Proposed fix
-```
+```text
Parameters (estimated):

and

- +text
PARAMETERS FIXED COVARIATES


</details>


Also applies to: 240-240

<details>
<summary>🤖 Prompt for AI Agents</summary>

Verify each finding against the current code and only fix it if needed.

In @hpai-challenge/notes/step02_process_dag.md at line 192, Two fenced code
blocks in step02_process_dag.md (the process pseudocode starting with
"Parameters (estimated):" and the ASCII DAG line beginning "PARAMETERS
FIXED COVARIATES") lack a language specifier and trigger MD040; update
those triple-backtick fences to include the text language (e.g., text) so the linter is satisfied while keeping content unchanged — locate the fences around the "Parameters (estimated):" block and the ASCII DAG block ("PARAMETERS ... COVARIATES") and add "text" immediately after the opening for each.


</details>

</blockquote></details>

</blockquote></details>

<details>
<summary>🤖 Prompt for all review comments with AI agents</summary>

Verify each finding against the current code and only fix it if needed.

Inline comments:
In @hpai-challenge/notes/step02_process_dag.md:

  • Around line 193-203: Add the missing fixed parameter σ_test (pre-shipment
    testing sensitivity) to the "Parameters (fixed)" block alongside r and p_mov;
    specify its numeric value (σ_test = 0.9) and a short parenthetical explanation
    like "(pre-shipment test sensitivity)" so implementers can find the canonical
    value used by the model components that reference σ_test in the specification
    and by functions/sections that use σ_test for test-related transitions.
  • Around line 219-222: The pseudocode for hazard_local (hazard_local /
    λ_j^local) and hazard_movement (hazard_movement / λ_movement,j) is summing over
    all i but must only include infected source farms (I_i(t)=1); update both sums
    to restrict indices to {i : I_i(t)=1} so you don't evaluate w(t−T_i^I) for
    non-infected farms, and for movement also require both M_{i→j}(t)=1 and I_i(t)=1
    when multiplying by p_eff(i)·w(t−T_i^I).

Duplicate comments:
In @hpai-challenge/notes/step02_process_dag.md:

  • Line 297: Update the wording for ε to clarify it is a constant parameter that
    multiplies a time-varying spillover function: replace "ε: constant hazard
    applying only to HRZ farms" with text stating that ε is a constant parameter
    scaling the time-varying spillover hazard ε · ψ(t) (ψ(t) encodes onset and
    decay), and note that the identifiability contrast with β is spatial (HRZ
    footprint vs proximity-dependent movement) rather than temporal; reference the
    symbols ε, ψ(t), and β so implementers do not treat the spillover hazard as
    time-constant.

Nitpick comments:
In @hpai-challenge/notes/step02_process_dag.md:

  • Line 192: Two fenced code blocks in step02_process_dag.md (the process
    pseudocode starting with "Parameters (estimated):" and the ASCII DAG line
    beginning "PARAMETERS FIXED COVARIATES") lack a
    language specifier and trigger MD040; update those triple-backtick fences to
    include the text language (e.g., text) so the linter is satisfied while keeping content unchanged — locate the fences around the "Parameters (estimated):" block and the ASCII DAG block ("PARAMETERS ... COVARIATES") and add "text" immediately after the opening for each.

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->

@sbfnk
Copy link
Collaborator Author

sbfnk commented Feb 20, 2026

@coderabbitai review

@coderabbitai
Copy link

coderabbitai bot commented Feb 20, 2026

✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (2)
hpai-challenge/notes/step02_process_dag.md (2)

132-132: Notation mismatch: β_s in formal equations vs β_species[j] in pseudocode

Line 132 uses β_s whilst Line 227 uses β_species[j]. These refer to the same species-specific modifier. Aligning the symbols (or adding a brief parenthetical cross-reference) reduces the risk of implementation drift when translating the pseudocode into code.

Also applies to: 227-227

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@hpai-challenge/notes/step02_process_dag.md` at line 132, The equation uses
β_s while the pseudocode uses β_species[j]; make them consistent by updating the
formal equation λ_j(t) = β_s · (...) to explicitly use the same symbol as the
pseudocode (e.g., β_species[j]) or add a parenthetical note after β_s stating
“(≡ β_species[j] in pseudocode)”; ensure the same naming is used wherever the
species-specific transmission modifier appears (reference symbols: λ_j(t), β_s,
β_species[j]) so readers and implementers see they are identical.

97-99: "No explicit latent period" is inconsistent with w(0)=0; Complexity Option 1 partially overlaps

w(τ) = 1 − exp(−r·τ) gives w(0) = 0, so a farm infected on day t contributes zero outward hazard on that same day — effectively a soft one-day de facto latency embedded in the infectiousness profile. Simplifying Assumption 5 (Line 343) describes this as "no explicit latent period", which is only true in the sense that there is no separate latent-state transition; it does not mean the farm is immediately infectious.

Complexity Option 1 (Line 354, "add 1–2 day delay: w(τ)=0 for τ<1") therefore partially overlaps with existing behaviour. Clarifying the distinction — that the soft ramp already gives zero infectiousness at τ=0 whereas the option adds a hard floor of zero for the first τ_min days — would avoid confusion when deciding whether to activate this refinement.

Also applies to: 343-344, 354-354

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@hpai-challenge/notes/step02_process_dag.md` around lines 97 - 99, Clarify
that the infectiousness profile w(τ)=1−exp(−r·τ) (with r≈1/day) produces a
"soft" de facto latency because w(0)=0 but infectiousness ramps continuously,
and explicitly state that Simplifying Assumption 5's phrase "no explicit latent
period" means there is no separate latent-state transition rather than immediate
infectiousness; also revise Complexity Option 1 to note it overlaps with this
soft ramp and that it instead implements a "hard" floor (e.g., set w(τ)=0 for
τ<τ_min, where τ_min=1–2 days) so readers understand the difference between the
existing soft ramp (w(τ)) and the optional hard delay (τ_min).
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@hpai-challenge/notes/step02_process_dag.md`:
- Around line 132-136: The text currently applies β_duck ∈ (0,1]
multiplicatively to the entire force λ_j(t) =
β_s·(λ_j^{spillover}+λ_j^{local}+λ_j^{movement}), which implicitly forces ducks
to be less susceptible to wild-bird spillover; update the document to either (a)
make the species modifier pathway-specific (e.g. introduce β_duck^{spillover}
separate from β_duck^{local}/β_duck^{movement}) or (b) explicitly relax the
upper/lower bounds for the spillover term (e.g. allow β_duck^{spillover} ∈
(0,2]) and show this in the formula and parameter table, and add a short note
calling out that the spillover application of β_duck is biologically contentious
and should be considered separately during Step 02.
- Around line 105-108: The movement hazard mixes a binary indicator M_{i→j}(t)
with a per-movement probability p_mov and omits zone-based blocking; fix by (a)
choosing one of two consistent specs and updating the formula: either redefine
M_{i→j}(t) as a count (number of movements) and use λ_movement,j(t)=∑_{i:
I_i(t)=1} M_{i→j}(t)·p_eff(i)·w(t−T_i^I), or keep M_{i→j}(t) binary but replace
p_eff(i) by the per-day transmission probability 1−(1−p_mov)^{M_count(i→j,t)}
(i.e. aggregate multiple events into one-day risk) and document which
interpretation p_mov has; and (b) enforce regulated-zone blocking by modifying
p_eff(i) or M_{i→j}(t) to be zero for sources in regulated zones (e.g. multiply
by a not_blocked(i) indicator or set p_eff(i)=0 when i is in a regulated zone),
then update the pseudocode and text around λ_movement,j(t), p_eff(i), and
M_{i→j}(t) to reflect the chosen approach.

---

Duplicate comments:
In `@hpai-challenge/notes/step02_process_dag.md`:
- Around line 297-299: Update the phrasing that describes ε: replace "constant
hazard applying only to HRZ farms" with wording that distinguishes spatial
footprint from time variation, e.g. "HRZ-only hazard with fixed spatial
footprint, amplitude ε, temporal shape ψ(t)" to reflect that the actual
spillover hazard is ε·ψ(t); ensure the contrast with β remains explicitly
spatial (HRZ-only vs proximity-dependent) and keep symbols ε and ψ(t) in the
sentence for clarity.

---

Nitpick comments:
In `@hpai-challenge/notes/step02_process_dag.md`:
- Line 132: The equation uses β_s while the pseudocode uses β_species[j]; make
them consistent by updating the formal equation λ_j(t) = β_s · (...) to
explicitly use the same symbol as the pseudocode (e.g., β_species[j]) or add a
parenthetical note after β_s stating “(≡ β_species[j] in pseudocode)”; ensure
the same naming is used wherever the species-specific transmission modifier
appears (reference symbols: λ_j(t), β_s, β_species[j]) so readers and
implementers see they are identical.
- Around line 97-99: Clarify that the infectiousness profile w(τ)=1−exp(−r·τ)
(with r≈1/day) produces a "soft" de facto latency because w(0)=0 but
infectiousness ramps continuously, and explicitly state that Simplifying
Assumption 5's phrase "no explicit latent period" means there is no separate
latent-state transition rather than immediate infectiousness; also revise
Complexity Option 1 to note it overlaps with this soft ramp and that it instead
implements a "hard" floor (e.g., set w(τ)=0 for τ<τ_min, where τ_min=1–2 days)
so readers understand the difference between the existing soft ramp (w(τ)) and
the optional hard delay (τ_min).

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@hpai-challenge/notes/step02_process_dag.md`:
- Around line 175-181: Add an explicit limitations note and sensitivity/priors
work for the δ_prev imputation: state that δ_prev (used in T_j^R =
max(T_trigger, T_capacity)) is estimated from only 12 records and that this
uncertainty may bias downstream estimates of β and the culling-capacity effect;
then implement either an informative prior for δ_prev (e.g., borrow shape/scale
from the reactive culling distribution or expert elicitation) or a sensitivity
analysis over a plausible range of δ_prev values and report how T_j^R and key
model outputs (β, culling effect) change; reference δ_prev, T_j^R, T_trigger,
T_capacity and β in the note so reviewers can find where imputation decisions
impact identifiability.
- Around line 303-305: Update the wording that currently describes "ε: constant
hazard" to clarify that ε is a constant amplitude while the farm-level spillover
hazard is time-varying: ε · ψ(t) (for onset+decay ψ(t)=exp(−δ(t−t₀)) for t≥t₀),
and emphasize the meaningful contrast with β is spatial (ε has an HRZ-only fixed
spatial footprint while β varies with proximity to infected farms); replace the
phrase "constant hazard" with something like "HRZ-only hazard with fixed spatial
footprint (ε: constant amplitude; hazard = ε·ψ(t), time-varying)" and mention
the ψ(t), δ and t₀ symbols to make the distinction explicit.

---

Duplicate comments:
In `@hpai-challenge/notes/step02_process_dag.md`:
- Around line 130-143: The formula currently multiplies a single species
modifier β_s (β_species[j], e.g., β_duck) across all hazard components
λ_j^{spillover}, λ_j^{local}, and λ_j^{movement} while still constraining β_duck
∈ (0,1], but the review asks either to implement pathway-specific modifiers or
to explicitly mark the spillover application as provisional; update the document
so the equation and notation reflect the chosen resolution: either (A) replace
β_s with pathway-specific modifiers (e.g., β_species_spillover[j],
β_species_local[j], β_species_movement[j]) in the definition of λ_j(t) and note
their bounds separately, or (B) keep a single β_species[j] but add a clear
proviso in the formula text that the spillover term is provisional and may
violate the (0,1] constraint (cross-reference Complexity Option 2) so readers
know the bound is temporary; reference β_species[j], β_duck, and λ_j^{spillover}
in the updated wording.

@sbfnk
Copy link
Collaborator Author

sbfnk commented Feb 20, 2026

@coderabbitai review

@coderabbitai
Copy link

coderabbitai bot commented Feb 20, 2026

✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (3)
hpai-challenge/notes/step02_process_dag.md (3)

249-273: DAG text representation omits σ_test from fixed parameters and M_{i→j}(t) as an observed-data input.

σ_test was correctly added to the pseudocode parameter block (previous review), but the DAG legend (Line 251) still shows only {p_mov, r} as fixed — σ_test = 0.9 is absent. Similarly, M_{i→j}(t) (7,187 observed movements) drives the movement hazard pathway analogously to how farm coordinates underlie {location}, yet it has no node in the DAG.

✏️ Proposed revision
-    [ε, t₀, δ]  [β, α]  [β_duck]    {p_mov, r}      {HRZ}  {species}  {location}
+    [ε, t₀, δ]  [β, α]  [β_duck]    {p_mov, r, σ_test}      {HRZ}  {species}  {location}  {M_{i→j}}

And in the legend text (Line 273):

-Movement transmission probability p_mov is fixed at 0.01 based on literature...
+Movement transmission probability p_mov is fixed at 0.01 based on literature... Pre-shipment testing sensitivity σ_test is fixed at 0.9. Observed movements M_{i→j}(t) are data inputs to the movement pathway.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@hpai-challenge/notes/step02_process_dag.md` around lines 249 - 273, Update
the DAG diagram and legend to include the missing fixed parameter σ_test (e.g.,
add σ_test=0.9 to the {Curly braces} list alongside {p_mov, r}) and add an
observed-data node for the movement matrix M_{i→j}(t) (label it as observed
movements, e.g., M_{i→j}(t) — 7,187 observed movements) that feeds into the
Movement transmission process and the Force of infection λ_j(t); ensure
references to these symbols (σ_test and M_{i→j}(t)) are present in both the
graphical nodes and the accompanying legend so readers see σ_test as a fixed
covariate and M_{i→j}(t) as an observed input driving movement transmission.

84-90: w_i(τ_i) implies farm-specific infectiousness, contradicting the uniform r in the definition.

w(τ) = 1 − exp(−r·τ) carries no farm index (r is a scalar fixed constant), so the subscript i on w_i is misleading. The pseudocode at Line 227 correctly writes w(t − T_i^I) without a farm subscript; the formal definition should match.

✏️ Proposed notation fix
-$$\lambda_j^{\text{local}}(t) = \beta \cdot \sum_{i: I_i(t)=1} w_i(\tau_i) \cdot K(d_{ij})$$
+$$\lambda_j^{\text{local}}(t) = \beta \cdot \sum_{i: I_i(t)=1} w(\tau_i) \cdot K(d_{ij})$$
-- $w_i(\tau_i)$ is the infectiousness of farm $i$ at time $\tau_i$ since infection
+- $w(\tau_i)$ is the infectiousness at time $\tau_i = t - T_i^I$ since infection
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@hpai-challenge/notes/step02_process_dag.md` around lines 84 - 90, The formula
uses w_i(τ_i) implying farm-specific infectiousness but the model defines
w(τ)=1−exp(−r·τ) with a single scalar r; change the notation to use the
non-indexed w(τ) so it matches the pseudocode and model: replace w_i(τ_i) with
w(τ_i) (or w(t−T_i^I) where appropriate) in the definition of λ_j^{local}(t),
and ensure any surrounding text refers to r as a global scalar and not
farm-specific.

115-119: @Yoo2021 citation has no accompanying references section.

The ~30% figure for vehicle-movement transmission is the primary empirical support for including the movement pathway. Without a full citation, readers cannot assess whether Korean H5N6 poultry movement patterns are comparable to the Jolly Island broiler_1 → broiler_2 context, nor verify the figure. Consider adding a ## References section at the end of the document.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@hpai-challenge/notes/step02_process_dag.md` around lines 115 - 119, Add a
proper references section and a full bibliographic entry for the in-text tag
`@Yoo2021`: create a "## References" header at the end of the document and add the
full citation (authors, year, title, journal, volume/issue/pages or DOI/URL) for
Yoo2021; update the in-text occurrence of `@Yoo2021` near the "~30% of Korean H5N6
transmission via vehicle movements" claim so it points to that new reference
and, if available, add a brief parenthetical note comparing the Korean H5N6
context to the Jolly Island broiler_1 → broiler_2 context to clarify
applicability.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@hpai-challenge/notes/step02_process_dag.md`:
- Around line 92-95: The simplified model must commit to a specific spatial
kernel: use the exponential kernel K(d)=exp(-d/alpha) for all occurrences
(replace the underspecified K(d_ij) in the pseudocode and the reparameterisation
β₀ = β·K(d₀) so K is evaluable), remove or mark the power-law γ parameter as not
used in the simplified model, and update the documented kernel options line to
state "Exponential (chosen for simplified model): K(d)=exp(-d/alpha)" and ensure
every reference to K (e.g., K(d_ij), β₀ calculation) uses this exponential form.

---

Nitpick comments:
In `@hpai-challenge/notes/step02_process_dag.md`:
- Around line 249-273: Update the DAG diagram and legend to include the missing
fixed parameter σ_test (e.g., add σ_test=0.9 to the {Curly braces} list
alongside {p_mov, r}) and add an observed-data node for the movement matrix
M_{i→j}(t) (label it as observed movements, e.g., M_{i→j}(t) — 7,187 observed
movements) that feeds into the Movement transmission process and the Force of
infection λ_j(t); ensure references to these symbols (σ_test and M_{i→j}(t)) are
present in both the graphical nodes and the accompanying legend so readers see
σ_test as a fixed covariate and M_{i→j}(t) as an observed input driving movement
transmission.
- Around line 84-90: The formula uses w_i(τ_i) implying farm-specific
infectiousness but the model defines w(τ)=1−exp(−r·τ) with a single scalar r;
change the notation to use the non-indexed w(τ) so it matches the pseudocode and
model: replace w_i(τ_i) with w(τ_i) (or w(t−T_i^I) where appropriate) in the
definition of λ_j^{local}(t), and ensure any surrounding text refers to r as a
global scalar and not farm-specific.
- Around line 115-119: Add a proper references section and a full bibliographic
entry for the in-text tag `@Yoo2021`: create a "## References" header at the end
of the document and add the full citation (authors, year, title, journal,
volume/issue/pages or DOI/URL) for Yoo2021; update the in-text occurrence of
`@Yoo2021` near the "~30% of Korean H5N6 transmission via vehicle movements" claim
so it points to that new reference and, if available, add a brief parenthetical
note comparing the Korean H5N6 context to the Jolly Island broiler_1 → broiler_2
context to clarify applicability.

Comment on lines +92 to +95
**Kernel options**:
- Exponential: $K(d) = \exp(-d/\alpha)$
- Power law: $K(d) = (1 + d/\alpha)^{-\gamma}$
- Cauchy: $K(d) = 1/(1 + (d/\alpha)^2)$
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Simplified model leaves spatial kernel unspecified — commit to a form for unambiguous implementation.

Three kernel options are listed but none is selected for the simplified model. The power-law variant requires an additional exponent γ absent from the parameter list (Line 205), effectively narrowing the choice to exponential or Cauchy. The PR description states "exponential kernel", and the reparameterisation at Lines 327–330 (β₀ = β·K(d₀)) requires a concrete K to be calculable. Without a stated choice, the pseudocode at Line 227 (K(d_ij)) is underspecified.

✏️ Proposed addition
 **Kernel options**:
 - Exponential: $K(d) = \exp(-d/\alpha)$
 - Power law: $K(d) = (1 + d/\alpha)^{-\gamma}$
 - Cauchy: $K(d) = 1/(1 + (d/\alpha)^2)$
+
+**Decision for simplified model**: Use **exponential** kernel $K(d) = \exp(-d/\alpha)$.
+Power-law (requires estimating $\gamma$) and Cauchy are complexity options if spatial fit is poor.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@hpai-challenge/notes/step02_process_dag.md` around lines 92 - 95, The
simplified model must commit to a specific spatial kernel: use the exponential
kernel K(d)=exp(-d/alpha) for all occurrences (replace the underspecified
K(d_ij) in the pseudocode and the reparameterisation β₀ = β·K(d₀) so K is
evaluable), remove or mark the power-law γ parameter as not used in the
simplified model, and update the documented kernel options line to state
"Exponential (chosen for simplified model): K(d)=exp(-d/alpha)" and ensure every
reference to K (e.g., K(d_ij), β₀ calculation) uses this exponential form.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

HPAI Workflow Step 02: Process DAG Development

1 participant